C言語なら俺に聞け(入門篇) Part 11
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/04/17(火) 18:01:23・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 10
http://pc11.2ch.net/test/read.cgi/tech/1174290325/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 http://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 http://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 http://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 http://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 http://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 http://pc11.2ch.net/test/read.cgi/tech/1173284217/
関連スレ
C/C++の宿題を片付けます 85代目
http://pc11.2ch.net/test/read.cgi/tech/1175129517/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
【初心者歓迎】C/C++室 Ver.36【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1175436073/
【C 関数検索 man on WWW】 http://www.linux.or.jp/JM/index.html
0002デフォルトの名無しさん
2007/04/17(火) 18:51:270003デフォルトの名無しさん
2007/04/17(火) 18:54:460004デフォルトの名無しさん
2007/04/17(火) 19:04:24なんか、配列だのループだので
サインコサインだの、配列の並べ替えだとかやってるわけよ。
要するに9割ぐらいの内容が数学の知識。
そんなの3問やって1日終わり。
おれがそこに行く前にOJTでやってた内容とはマーーったく違うし業務内容からもかけ離れてるわけ。
資格試験のための勉強みてーなかんじ。
おまえ、そんなのわかったら仕様書が書けるのか。仕様書が理解できるようになるのか。
きょうびC使うのか。
第一プログラマー自体大手電機メーカーは中国インドに外注が主流らしいってのに。
こんなわっかり難い書き方のソース出してたら上司に怒られるだろ。
第一!
並べ替えなんか関数があるじゃないいくらでも。。
サインコサインなんか関数があるじゃない。。
って思うのですがCではこんな小難しいのが大事なことなんでしょうか。('A`)
しかもVBみてーに順次デバッグデキネーシうぇうぇwwww
むりwwどこまでいったかわかんえwwwwww
0005デフォルトの名無しさん
2007/04/17(火) 19:06:330006デフォルトの名無しさん
2007/04/17(火) 19:09:210007デフォルトの名無しさん
2007/04/17(火) 19:23:04> サインコサインなんか関数があるじゃない。。
実務ではそれを使えばいいんだけど、裏でどうやっているのか知っておくことは悪くない。
特に並べ替えなんて様々な方法がそれぞれ一長一短あり、それを理解するのには自分で書いてみるのも一助になる。
0008デフォルトの名無しさん
2007/04/17(火) 19:24:250009デフォルトの名無しさん
2007/04/17(火) 19:27:02しっかし、役に立たない勉強に文句言っていいのはリア中までだぞ
0010デフォルトの名無しさん
2007/04/17(火) 19:28:12if-elseif-else...じゃないとダメって言ってた。
なんか、最適化できないとかなんとか言ってたけど、
swich-case文って良くないの?
0011デフォルトの名無しさん
2007/04/17(火) 19:29:21>要するに9割ぐらいの内容が数学の知識。
どこが「要するに9割」なのか解らん。
>なんか、配列だのループだの
が数学だと思っちゃうほど算数弱いのか、と思ったが
スレタイが読めないくらいだから国語も弱いんだろうな。
0012デフォルトの名無しさん
2007/04/17(火) 19:30:06その莫迦 (又は老害)、クビね。
0013デフォルトの名無しさん
2007/04/17(火) 19:31:14default があるとジャンプテーブル化できないとか聞いたことはあるが、ホンマかいな?
というか、if-else if-else ってそんなに最適化されるのかな?
0014デフォルトの名無しさん
2007/04/17(火) 19:33:240015デフォルトの名無しさん
2007/04/17(火) 19:33:58でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
C言語の基礎からすべてを叩き込んでくれませんか??
お願いします。
001610
2007/04/17(火) 19:34:20バグに悩むから、みたいなことも言ってた
0017デフォルトの名無しさん
2007/04/17(火) 19:37:49RPGにも色々あるけど
どんなのがいいの?
><DOS画面でもいいですか?
0018デフォルトの名無しさん
2007/04/17(火) 19:52:10HSPは触ったことないけど、ブロック崩し作れるってことは
HSPってどんなかしらないけどwin32apiの知識もあるって
ことでしょ?違うか?
とりあえず、C言語の基礎なら、WisdomSoftで勉強したら?
そして、まぁとりあえずポインタと配列、構造体、関数ポインタ、etc
を勉強しつつ、win32apiもさわっていじってみる。
そんである程度いじれるようになったら
winprocのメッセージ毎の処理を嫌になるほど処理する。
成す者は常に成り行く者は常に至る!!
ま、気長にね
0019デフォルトの名無しさん
2007/04/17(火) 19:57:540020デフォルトの名無しさん
2007/04/17(火) 20:35:390021デフォルトの名無しさん
2007/04/17(火) 20:41:46HSPはapi呼ばなくても、ブロック崩しくらい作れるんじゃね?
0022デフォルトの名無しさん
2007/04/17(火) 23:06:25で、aに"あいうえお"、bに"かきくけこ"と入ってる時に、
bの内容をaに代入することはできるのでしょうか?
strcpy(a, b);
だと上手くいかないのですが・・・。
ポインタが・・・ややこしいです
0023デフォルトの名無しさん
2007/04/17(火) 23:08:43これはchar型へのポインタ配列なので入れられない
char a[10], b[10];
こうすれば両方、char型配列なのでコピーできる
0024デフォルトの名無しさん
2007/04/17(火) 23:16:54つまり、char *a[10]で定義されるaは、
ポインタの指すアドレスを(違う文字が入ってるアドレスに)変えることでしか、
文字を変えれないということでしょうか?
char *a[10], b[10];で宣言した場合は
strcpy使わないで
a = b;
で単純にコピーしたような感じになるんですかね?
頭がショートしそうなんですが・・・
0025デフォルトの名無しさん
2007/04/17(火) 23:19:050026デフォルトの名無しさん
2007/04/17(火) 23:19:31b は charの配列[10]
コピーできるわけがない。
0027デフォルトの名無しさん
2007/04/17(火) 23:19:510028デフォルトの名無しさん
2007/04/17(火) 23:20:03int main()
{
int array[3][2];
array[0][0] = 10;
printf("%d\n");
return 0;
}
ミスって↑みたいに書いたんだけど何故かコンパイル通った。
しかも実行結果は普通に
10
って表示されたんだが・・・。理由分かる人いたら教えてくれ。
フォーマット指定子の%dに対応する変数や式が無いと、
無意味な整数が生成されるんじゃなかったっけ?
試しに3行目と4行目を消してみたらそんな感じだった。
しょーもない質問で申し訳ない。
0029デフォルトの名無しさん
2007/04/17(火) 23:23:09その結果として10が出力されたに過ぎない。理由を問うのはナンセンス。
0030デフォルトの名無しさん
2007/04/17(火) 23:28:57動作をするかもしれないが、実行したとたんにあなたの鼻から悪魔が出てき
てもそれはそれでOK。
0031デフォルトの名無しさん
2007/04/17(火) 23:30:19うちの環境でも、array[0][0]の中身が出力された。(数値変えても出る
アセンブラとか良く分からんけど、
たまたまイバチン最後にアクセスしたナントカメモリの中身を吐いたとか、そういう理由では?
どっちにしろ何かを意図してすべきことじゃないし。
もし勘違いだったら、詳しい人フォロー頼みます
0032デフォルトの名無しさん
2007/04/17(火) 23:30:25一番最後に宣言した配列の先頭を読むみたいだな
理由は知らないけど。
0033デフォルトの名無しさん
2007/04/17(火) 23:33:030034デフォルトの名無しさん
2007/04/17(火) 23:35:22003528
2007/04/17(火) 23:39:50に10が入っててそれを吐き出した〜って感じなのかな。
何となく疑問は解消した気がする。
みんな色々とレスしてくれてサンクス
0036デフォルトの名無しさん
2007/04/17(火) 23:42:00それを参照したら10が入ってたって感じじゃないかな?
0037デフォルトの名無しさん
2007/04/17(火) 23:43:48いいえ。
printf()が期待したスタック領域が実際に呼び出し側で用意されていなかったので、
呼び出し側のローカル変数が参照されただけのことです。
0038デフォルトの名無しさん
2007/04/17(火) 23:45:07世の中には変わった積み方もあるんだろうけど。
0039デフォルトの名無しさん
2007/04/17(火) 23:49:36一番初歩的な技につながるのだよね。これって
>>28は参照だけど、アドレスをぶっこめば、クラック用の関数にぶっ飛ばせるよね
0040デフォルトの名無しさん
2007/04/17(火) 23:52:51int main(void)
{
char flag[3][];
world(&flag[0]);
}
なぜエラーなのか分からない。
0042デフォルトの名無しさん
2007/04/18(水) 00:07:06ポインタの記述が間違ってるとは分かってるんだが
どうやっても分からない・・・orz
0043デフォルトの名無しさん
2007/04/18(水) 00:11:59/* ^ */
0044デフォルトの名無しさん
2007/04/18(水) 00:18:43仮引数: char*[]
実引数: char(*)[5]
0045デフォルトの名無しさん
2007/04/18(水) 00:26:39正しい記述方法はどうすればいいんでしょうか(orz
0046デフォルトの名無しさん
2007/04/18(水) 00:28:28配列のポインタとポインタの配列のどっちを渡したいんだ?
0048デフォルトの名無しさん
2007/04/18(水) 00:36:10じゃね?
0049デフォルトの名無しさん
2007/04/18(水) 14:40:450以外なら2倍の数を表示し繰り返し、
0だったらば処理を終わらせる
これを教えてください
0050デフォルトの名無しさん
2007/04/18(水) 14:52:14宿題スレへ。
0051デフォルトの名無しさん
2007/04/18(水) 15:22:04int height;
while(1) {
scanf("%d", &height);
if(height==0) break;
printf("%d", height * 2);
}
0052デフォルトの名無しさん
2007/04/18(水) 16:09:55まず char flag[3][]; の箇所でコンパイルエラーが出るな。
何でかというと、一番下のレベルの配列の要素数が抜けてるからだ。
char flag[3][5]; とかなら問題ない。但しこの場合は char 型5要素の
配列が3要素あるという意味になる。(つまり「char ポインタ」の
配列ではない。「char 型 5 要素」の配列だ)。
これを「char ポインタの配列」にしたい場合は
char *flagp[3];
int i;
for (i = 0; i < 3; i++) flagp[i] = &flag[i][0];
のようなことをする必要がある (但し代入する側の &flag[i][0] は
flag[i] と省略して書くことも可能。C言語では配列全体を表す名前は
配列の先頭要素へのポインタになるため)。
0053デフォルトの名無しさん
2007/04/18(水) 17:36:27もう一つ書いておこう。
char flag[3][5]; と宣言された配列をそのまま func(flag) のようにして
他の関数の引数で渡したい場合は void func(char flag2[][5]); または
void func(char (*flag2)[5]); になる。つまり下のレベルの要素数が
5であることは省略できない。というか、省略可能なのは一番上のレベル
だけだ。
0054デフォルトの名無しさん
2007/04/18(水) 18:54:02int型の1次元配列から、ある数値を探してくれる関数ってある?
0055デフォルトの名無しさん
2007/04/18(水) 19:13:05残念ながら無い
0056デフォルトの名無しさん
2007/04/18(水) 19:33:27int a[]={4,1,0,2,3};
みたいに(0〜(要素数ー1))各数字が順番バラバラに入ってる状態で、
例えばこの配列で値cが入っているのは何番目か求めたい場合は
for(i=0;i<5;i++){
if(a[i]==c){
break;
}
}
で良いのかな。
それとも
int b[]={2,1,3,4,0};
みたいに逆に求められる配列を用意しておくべき?
0057デフォルトの名無しさん
2007/04/18(水) 21:08:38これでもおk
int *arrint(int *arr, size_t arr_size, int value){
size_t i;
for(i=0;i<arr_size;i++)
if(arr[i]==value)
return &arr[i];
return NULL;
}
0058デフォルトの名無しさん
2007/04/18(水) 21:36:24ソート列なら bsearch があるけど。
0059デフォルトの名無しさん
2007/04/18(水) 22:35:06gcc4.1.2を使用しています。
以下のようなコード
switch(i){
case 100:
int a=10;
printf("%d\n",a);
break;
}
をコンパイルすると
"expected expression before 'int'"
とエラーが出ます。
caseの直後に変数宣言があるためのようです。
コードには問題ないように思うのですがこれはなぜでしょうか?
よろしくお願いします。
0060デフォルトの名無しさん
2007/04/18(水) 22:40:33Cではブロックの先頭でしか変数宣言は出来ない
0061デフォルトの名無しさん
2007/04/18(水) 22:44:04006259
2007/04/18(水) 22:46:05これだったら問題なくコンパイルできます。
switch(i){
case 100:
printf("yes\n");
int a;
printf("%d\n",a);
break;
}
これはC++的な解釈をしているせいですか?
どちらにしても>59がエラーになる理由を知りたいです。
0063デフォルトの名無しさん
2007/04/18(水) 22:46:30case 100:
{
int a=10;
printf("%d\n",a);
}
break;
}
0064デフォルトの名無しさん
2007/04/18(水) 22:47:18ラベル付き文は、ラベルとその直後に続く文からなっている。
0065デフォルトの名無しさん
2007/04/18(水) 22:47:43それはgcc拡張。
C99でもブロック先頭以外でも変数を宣言できるが、
変数宣言は文ではないからラベルをつけることは出来ない。
0066デフォルトの名無しさん
2007/04/18(水) 22:52:40switch(i){
int a;
case 100:
printf("%d\n",a);
break;
}
switch(i){
printf("yes\n");
int a;
case 100:
printf("%d\n",a);
break;
}
とにかくcaseの直後の変数宣言が問題のように思います。
不思議だ・・・
0067デフォルトの名無しさん
2007/04/18(水) 22:58:30strcmp()関数つかう以外に方法ってないですかね?
0068デフォルトの名無しさん
2007/04/18(水) 23:02:55なるほど、そういうことでしたか。
以下でもエラーになることを確認しました。
a100:
int a;
printf("%d\n",a);
goto a100;
>63
エラーが発生しないことを確認しました。
これはブロックに対してラベルを張るって感じなんですかね。
>60-65
納得できました。
大変勉強になりました。ありがとうございました。
0069デフォルトの名無しさん
2007/04/18(水) 23:04:430070デフォルトの名無しさん
2007/04/18(水) 23:08:01char buf[6];
memset(buf, 0, sizeof buf);
fgets(buf, sizeof buf - 1, stdin);
if (buf[0]=='e' && buf[1]=='n' && buf[2]=='d' && (buf[3]=='\n' || buf[3]=='\r')) {
exit(0);
}
0071デフォルトの名無しさん
2007/04/18(水) 23:10:56-1 いらんだろ
0072デフォルトの名無しさん
2007/04/18(水) 23:14:010073Cくん
2007/04/18(水) 23:32:51ほぼ理解はできました。
次の勉強本としてはどのようなものがお勧めですか?
一応、明解C言語実践編を買ったのですが、
そろそろなにか作りながら学びたいと思ってます。
お勧めの本はありますでしょうか?
0074デフォルトの名無しさん
2007/04/18(水) 23:34:16作りたいものを決めてから、どの本を買うかきめたら?
0075Cくん
2007/04/18(水) 23:36:310076デフォルトの名無しさん
2007/04/18(水) 23:37:180077Cくん
2007/04/18(水) 23:39:470078デフォルトの名無しさん
2007/04/18(水) 23:43:47OSがWindowsなら、プログラミングWindowsとか。
高いけど、CでWindowsの本って、ほかにはあんまりなさそうな気がする。
0079デフォルトの名無しさん
2007/04/18(水) 23:46:240080デフォルトの名無しさん
2007/04/18(水) 23:55:56まずはWindowsの画面をCで表示してみ。
それができんと時計作れんし
Win32API SDK とかで検索してみ。
0081デフォルトの名無しさん
2007/04/19(木) 01:02:04おまえドSだろ
0082sage
2007/04/19(木) 02:18:22cで作ったDLLをVB.netで呼び出すにはどのようにしたらいいのでしょうか
教えて下さい
0083デフォルトの名無しさん
2007/04/19(木) 02:20:01すみません、名前にsageって入れちゃいました
0084デフォルトの名無しさん
2007/04/19(木) 04:03:27VB.netのスレで聞け
VB.netで呼び出せるDLLの呼び出し方法はその製作言語に依存しない
呼び出す方法は呼び出す側の問題
0085デフォルトの名無しさん
2007/04/19(木) 04:14:07分母がぴったり0.0かどうかを判定すればいいんですか?
それとも±0.00001以内とかのほうがいいんですかね?
0086デフォルトの名無しさん
2007/04/19(木) 04:18:380087デフォルトの名無しさん
2007/04/19(木) 07:37:040088デフォルトの名無しさん
2007/04/19(木) 17:49:410089デフォルトの名無しさん
2007/04/19(木) 17:53:490090デフォルトの名無しさん
2007/04/19(木) 17:59:36math.hかfloat.hをインクルード
0091デフォルトの名無しさん
2007/04/19(木) 18:01:08doubleね
0092デフォルトの名無しさん
2007/04/19(木) 18:06:300093ど素人
2007/04/20(金) 01:13:07就職のこと考えたのですが、プログラムとか知識あれば、食っていけますか?
今の生活だと、パソコンくらいしか触れて無いので。
プログラムの勉強始めようかな?とか思って。
0094デフォルトの名無しさん
2007/04/20(金) 01:15:58どうせ途中で投げ出すことになるんだから、はじめからやらないほうがましだろ。
0095デフォルトの名無しさん
2007/04/20(金) 01:30:52プログラム歴は1ヶ月でなんとか理解してきて
やっと「3+5は8です」って表示できるようになったよ
自分ではすごく感動したんだけどやっぱりまわりと比較するとセンスなくてだめみたいだね
でもこのスレ見ながらなんとかついていこうとしてる
おれにとってはレベル高いけど少しずつ理解できるようになってきたように感じる…
食っていけるかわからないけど努力すればできるようになるとは思う
009685
2007/04/20(金) 01:34:47ぴったり0で除算した場合の結果がINFになるのはわかるのですが、
限りなく0に近い値で割った場合の結果というのは
誤差というか精度的には問題ないんですか?
0097デフォルトの名無しさん
2007/04/20(金) 01:44:27あなたには、農村などでの自給自足の生活が適していると思われます
プログラムだけで生きていくことはできませんが、
食べ物を自給自足できるなら生きて行くことはできるでしょう
農協はある程度の常識と交渉スキルが無いと食い物にされますので
あなたは農協とは間違っても関わりを持たないように気をつけて!
(プログラムはそれ自体では何の役にも立ちません
あなたの作るプログラムを使うことによって何らかの価値を生み出すことができるかどうかが問題です)
0098デフォルトの名無しさん
2007/04/20(金) 03:18:27そりゃ除数がDBL_MINとかなら0で除算しなくてもINFになる可能性は高い。
でもINFになった時に元の除数を見てそれが0でなければ0除算による結果ではないと分かるじゃないか。
演算の結果だけでなくその演算のオペランドも確認していけばどこで精度が落ちたか分かる。
あと、isnanつながりでfpclassifyがあるのでINFやNaNや非正規化数、0なんかを区別できるようになる。
0099デフォルトの名無しさん
2007/04/20(金) 04:49:27その関数で作られた配列の長さってどうやって求めればいいのでしょうか?
0100デフォルトの名無しさん
2007/04/20(金) 06:52:35char**を返す関数ってことだよね?
文字列配列を作った関数しかそれを知らないから、
配列とその要素数を返すようにしてやるか(関数は配列を返して、要素数は引数で返してもらう等)、
配列の最後にNULLを入れた要素を追加して返してやり、NULLが出るまで配列を走査するか。
0101デフォルトの名無しさん
2007/04/20(金) 08:06:54人月単価安ければ、コミュニケーション能力に問題ありでも仕事あるんじゃない?
おいらのプロジェクトでも
日本語ほとんどしゃべれない中国人 人月単価40万円でいるから
(日本語できる優秀な中国人との抱き合わせでだけど・・・)」
でも日本人で、プロジェクトを取り纏めれるようになれば人月100万ぐらいはいけるよ
0102デフォルトの名無しさん
2007/04/20(金) 08:09:010103デフォルトの名無しさん
2007/04/20(金) 10:36:36C言語編第1部13章で経過時間の表示がうまくいきません。
#include <stdio.h>
#include <time.h>
void main(){
int i=0;
time_t t1, t2;
time(&t1);
while(i<=50000)
printf("%d,",i++);
time(&t2);
printf("\ntime1=%ld time2=%ld\n",t1,t2);
printf("かかった時間は%d秒です。\n",t2-t1);
}
がソースなんですが
実行するとtime2=0になります。
何が悪いでしょうか。
VC++2005ExpressEditionを使っています。
0104デフォルトの名無しさん
2007/04/20(金) 10:54:58time_t が64bitだから
%ld を %lld にしてみ
0105103
2007/04/20(金) 11:22:200ではなくなりました。
ありがとうございました。
0106デフォルトの名無しさん
2007/04/20(金) 12:47:15VC6.0でC言語で一個DOS上で動くアプリケーション作ったんだが
これデータベース接続するにはどうしたらいい?
使うのはOracleで、
とりあえずSQL文書く知識だけはあるんですが。
OO4Oとかいうのを使ってみたいんだがググってかなり調べてみたんだがもうちんぷんかんぷん
まず何をすればいいんだ…
0107デフォルトの名無しさん
2007/04/20(金) 12:57:38こんにちは。
そりゃDOSで動かそうとするとちんぷんかんぷんだろう。
OO4OはActiveXだから、さくさく作るならVBの参照設定にチェックを入れて
ADO経由で画面に貼り付ける(だったかな?うろ覚え)
DOSからやろうとすると素人では先ず無理。ActiveXの仕組みを全部C/C++で書かなくちゃいけない。
もちろん、OO4Oはインストールしてあるんだよね。
0108デフォルトの名無しさん
2007/04/20(金) 13:03:37OO4Oはインストールしてあります。
ActiveXですか。あんま知識ないんでよくわからないですが、
VBの参照設定にチェックとはどういうことでしょう?
C言語で作成したのですがVBも関係あるのでしょうか。
幼稚な質問で申し訳ないです;
0109デフォルトの名無しさん
2007/04/20(金) 14:08:14OO4Oは
・VB用のタイプライブラリ
・C++用のクラスライブラリ
の2種類あるが、どちらもCから呼び出すようにはできていない。
なので
・C++ で、クラスライブラリを使用する関数を作成し
C のコードから呼び出す。
ことになる。
どうしても C だけで、ということであれば、
OO4Oを捨てて Pro*C を使う手もある。
0110デフォルトの名無しさん
2007/04/20(金) 14:22:43>・C++ で、クラスライブラリを使用する関数を作成し
> C のコードから呼び出す。
クラスとかそういうのを使うのはJavaで少しかじった程度ですが、
とりあえずこれに挑戦してみます。
ありがとうございます。
0111デフォルトの名無しさん
2007/04/20(金) 14:31:09ソースがどうしても長く汚くなってしまいます。
文法の入門書とかではなくて、見やすいソースにしたり、綺麗に書くこつとか
業界のスタンダードな書き方みたいなそういう本や解説しているサイトありませんか?
例えば私がある関数を作ると
void SetCol(St **st, Col **col)
{
int i;
swtich(col->type){
case 0:
SetBg(st,col->bg,0,0,col->width,1);
SetBg(st,col->bg,0,0,col->width,1);
SetBg(st,col->bg,0,0,col->width,1);
SetBg(st,col->bg,0,0,col->width,1);
break;
}
case 1:
for(i=0;i<col->width,i++){
if(i%4 == 0){
SetBg(st,col->bg,i,0,col->width,1);
}
}
//似たようなforが3つ続く
break;
case 2;
....
}
}
このようにめちゃめちゃ長くなってしまいます。
大体一つの関数が30〜200行くらいです。上記の関数だと350行でした。
0112デフォルトの名無しさん
2007/04/20(金) 14:33:23気にスンナ
switch 〜 case はどうしても長くなる。
なんでもかんでもswitch 〜 caseにしてしまうのなら
そっちを気にしてみれば
0113デフォルトの名無しさん
2007/04/20(金) 14:40:40可能なら、caseごとの処理を別の関数にすればいい。
ポイントは、引き数を極力少なくできるポイントで分けること。
#具体例を書こうと思ったが、余りにやっつけなコピペなんで断念。
0114デフォルトの名無しさん
2007/04/20(金) 14:57:03if elseよりはまだ短くできるかなと思ったのですが、確かに乱用してる感はあります。
そのあたり気をつけてみます。ありがとうございました。
>>113
なるほど、さらに細かくしちゃうんですね。名前考えるのが大変ですね・・・
あまり再利用しないものは関数にしてなかったんですが、試してみます。
ありがとうございました。
0115デフォルトの名無しさん
2007/04/20(金) 15:29:460116デフォルトの名無しさん
2007/04/20(金) 16:02:52教科書の例題はそれを省いてるから短く見通し良く見えるだけの話で。
0117デフォルトの名無しさん
2007/04/20(金) 17:02:34そうです。今は仰るように引数で返してもらうようにしてたのですが、
ちょっと強引かと思うんで、走査の方も試してみます。
ありがとうございました。
0118デフォルトの名無しさん
2007/04/20(金) 17:28:38構造体にしちゃいかんの?
0119デフォルトの名無しさん
2007/04/20(金) 17:31:01誰か相談に乗ってくれませんか。ヒントとか教えていただけたらうれしいのですが
[email protected]へお願いします
0120デフォルトの名無しさん
2007/04/20(金) 17:31:440121デフォルトの名無しさん
2007/04/20(金) 18:17:34個人で相談に乗ってくれる人はいないんじゃないか?
丸投げしたいのなら
C/C++の宿題を片付けます 86代目
http://pc11.2ch.net/test/read.cgi/tech/1176996941/
丸投げではなく自分のためにも理解したいのならここで
アップローダ使ってソースもしくは問題文を提示すると教えてもらいやすいよ
最後に釣りなら帰れ
0122デフォルトの名無しさん
2007/04/20(金) 18:24:41なるほど。頭固かったです。
構造体でも全く問題ないです。
ありがとうございました。
0123デフォルトの名無しさん
2007/04/20(金) 18:48:19よくつかう処理なら2、3行のものでも関数にすべき?
0124デフォルトの名無しさん
2007/04/20(金) 18:51:50そのほうが楽じゃない?
仮になんらかの問題で修正するとき関数にしてなかったらすべてを修正しなきゃいけないし
#define 使うって手もあるけど
0125デフォルトの名無しさん
2007/04/20(金) 19:06:09>#define 使うって手もあるけど
勘弁してくれ。
0126デフォルトの名無しさん
2007/04/20(金) 19:08:090127デフォルトの名無しさん
2007/04/20(金) 19:19:460128デフォルトの名無しさん
2007/04/20(金) 19:45:17あれま、やっぱだめか
>>123
#define なしで
0129デフォルトの名無しさん
2007/04/20(金) 20:02:14マニュアル読んでもちっとも理解できません。
お願いします。
0130デフォルトの名無しさん
2007/04/20(金) 21:08:090131デフォルトの名無しさん
2007/04/20(金) 21:17:490132デフォルトの名無しさん
2007/04/20(金) 21:51:45マクロでなければならない場所以外は関数でかいときゃいいだろ。
0133デフォルトの名無しさん
2007/04/20(金) 22:20:42少し消化不良な感じがします。
入門書とその次に読む本でお勧めのがありましたら教えてください。
0134デフォルトの名無しさん
2007/04/20(金) 22:27:43防ぐにはどうしたらよいのでしょうか?
0135デフォルトの名無しさん
2007/04/20(金) 22:30:010136デフォルトの名無しさん
2007/04/20(金) 22:37:56情報が少ないな
コンソールとかコマンドプロンプトとかは分かるレベル?
それとも窓作ってるのに一瞬で終了?
0137デフォルトの名無しさん
2007/04/20(金) 22:41:12main.c内部
LIST *head;
…
head = NULL;
…
addUser(head, name, age, specialty);
list.c内部
int addUser(LIST *head, char *name, int age, char *specialty)
{
LIST *current;
LIST *addlist;
addlist = (LIST *)malloc(sizeof(LIST));
…
if(head == NULL){
head = addlist;
head->next = NULL;
} else{
current = head;
while(current->next != NULL){
current = current->next;
}
addlist->next = NULL;
}
return 0;
}
0138デフォルトの名無しさん
2007/04/20(金) 22:41:53たしか、どっかに消えないようにするオプションがあったよ。
設定関係を探しまくれば見つかるんじゃね?
0139137
2007/04/20(金) 22:44:08addUser関数から戻ってきた後、headのアドレスがNULLに戻ってしまいます。
head = addlistでアドレスを書き換えたと思うのですが、
なぜNULLに戻ってしまうのでしょうか?
ちなみにaddUser関数はmain関数内部から呼び出しています。
0140デフォルトの名無しさん
2007/04/20(金) 22:46:20printf("hllo");
を実行すると消えます。
014185
2007/04/20(金) 22:50:33INFやNaNの発生に関して認識が間違ってるかもしれませんが、考えるに
非常に大きい分子に対して分母が0に近いような場合でも、
結果が与えられたビットで表せなければ、ぴったり0でなくてもINFになる、ということですね。
これまではあまり考えず、割り算の前に分母が0に近くないかをチェックしていたのですが、
ふと、ぴったり0かどうかをみるだけでいいんじゃないか?って気がしてきたので質問させてもらいました。
おっしゃるようにisnan()とかを使って問題が発生した場合のみ処理を変えたほうが、
計算精度という意味では良さそうですね。
勉強になりました。どうもありがとん。
0142デフォルトの名無しさん
2007/04/20(金) 22:59:421. コマンドプロンプトから実行する
2. main の return の前に、 getchar() とか入れる
0143デフォルトの名無しさん
2007/04/20(金) 23:03:55最後の行にブレイクポイント入れるのが簡単じゃね?
0144デフォルトの名無しさん
2007/04/20(金) 23:06:13ありがとうございました。
0145デフォルトの名無しさん
2007/04/21(土) 01:08:55char **table = (char **)malloc(256);
free(table);
0146デフォルトの名無しさん
2007/04/21(土) 01:11:32正しいと言えば正しいけど、微妙に間違っていると言えば間違っている。
取り敢えずmallocとfreeの使い方は間違いではない。
が、mallocに渡している256って何? って話にはなる。
そこにはsizeof(char*)の整数倍の値が入らなければならないのではないのか。
0147デフォルトの名無しさん
2007/04/21(土) 01:17:08やはりこの辺りの理解が足らないみたいです。
ちなみにリスト構造のダブルポインタでも同じように
領域確保するのでしょうか?
typedef struct{
int a;
char b;
} LIST;
LIST **list = (LIST **)malloc(sizeof(LIST *) * 256);
0148デフォルトの名無しさん
2007/04/21(土) 01:55:340149デフォルトの名無しさん
2007/04/21(土) 02:02:20#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[])
{
float a, b, c;/* 係数a,b,c */
float x1, x2;
float d;/* 判別式D */
puts("二次方程式 a*x*x + b*x + c =0 の解を求めます。 ");
printf("係数 a =");
scanf("%f",&a);
printf("係数 b =");
scanf("%f", &b);
printf("係数 c =");
scanf("%f", &c);
d =(b*b - 4*a*c);/* 判別式Dの計算式 */
printf("二次方程式 %f*x*x + %f*x + %f = 0 の解は\n ", a, b, c);
次レスへ
0150デフォルトの名無しさん
2007/04/21(土) 02:04:52{
x1 = (-b + sqrt(d))/(2 * a);
x2 = (-b - sqrt(d))/(2 * a);
printf("実数解 x = %f , %f です。\n", x1, x2);
}
else if (d == 0.0)/* 判別式D=0 */
{
x1 = -b / (2 * a);
printf("重解 x = %f です。\n", x1);
}
else/* 判別式D<0 */
{
x1 = -b / (2 *a);
x2 = sqrt(-d)/(2 * a);
printf("虚数解 x = %f + %fi , %f - %fi です。\n", x1, x2, x1, x2);
}
return 0;
}
このようなプログラムを書いてみたのですがもうちょっとすっきりさせることは可能でしょうか?
個人的には無駄に長いなあと思ってしまうのですが。
0151デフォルトの名無しさん
2007/04/21(土) 02:15:35判別式を計算する関数
解を導く関数
に分ければ少なくともmainはスッキリ
0152デフォルトの名無しさん
2007/04/21(土) 02:28:46int a=0;
hoge(a);
void hoge(int a){
a=1;
}
ってやっても呼び出し元のaは変化しないのはわかるよな。
で、137のソースを↓を使って書き換えてみて。多分これでわかると思う。
typedef LIST* PLIST;
0153137
2007/04/21(土) 03:24:44ありがとうございます。変数headはポインタですが、
この場合addUser関数に対して参照渡しとならないのでしょうか?
0154デフォルトの名無しさん
2007/04/21(土) 03:38:040155デフォルトの名無しさん
2007/04/21(土) 03:39:43入力関数も分けておこうや。
0156137
2007/04/21(土) 03:45:51参照渡しまでも勘違いしているかも…。
headにはアドレスが渡り、そのアドレスが
NULLから別のアドレスに変わると思っていました。
値渡し…よく分からなくなってきました。
0157デフォルトの名無しさん
2007/04/21(土) 04:05:45すっきりどころか無駄に長くなったように見える
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3847.txt
0158デフォルトの名無しさん
2007/04/21(土) 04:11:25ただし
else if (d == 0.0) /* 判別式D=0 */
と
else if (pSolutions->d == 0.0) /* 判別式D=0 */
はいただけない。とは思うものの宿題レベルだからこれでいいのかな…。
0159デフォルトの名無しさん
2007/04/21(土) 05:02:44先ずは>152で指摘されたことをやってみよう。
0160デフォルトの名無しさん
2007/04/21(土) 07:12:34>いんや、元のよりはずっとわかりやすいよ。
だから「ように見える」と言ったわけで。
「無駄に長い」という言葉から察するに
おそらく>>150の期待していたすっきり感には当てはまらないだろうが、
可読性はそういう初心者の主観的直観的なものとは別のところにあるということを匂わせたつもり。
0161デフォルトの名無しさん
2007/04/21(土) 15:52:00currentの直前のリストのnextにNULLが入ってくれません。(�@の処理)
どうすればNULLを入れられるでしょうか?
void deleteAllList(LIST *node)
{
LIST *current;
current = node;
if(current != NULL){
deleteAllList(current->next);
free(current->name);
free(current->specialty);
free(current);
current = NULL; … �@
} else{
return;
}
}
0162デフォルトの名無しさん
2007/04/21(土) 16:04:41えーと
void foo(int bar) {bar = 1;}
があったときに
int baz = 10;
foo(baz);
printf("%d", baz); // 10が出る
のと同じ理由でそれでは直前のnextにNULLは入りません。
多分、deleteAllList(baka->next);って呼んでるんだよね。
LIST型が双方向リストじゃない限りその関数の中から直前の
ポインタを求めることはできないから(始点を別に持ってたら別だけど)、
ひとつまえのポインタを渡すようにしてやればいいんじゃないかな。
0163デフォルトの名無しさん
2007/04/21(土) 16:10:49current = nodeとなっているのをcurrent = node->next;に書き換え、
current = NULL;とやっているところを、node->next = NULL;
に書き換えればいい。
もちろんdeleteAllListを呼んでいるところは全部ひとつ前のポインタを
渡すように書き換える必要がある。deleteAllList(baka->next);とやっていたとしたら、
deleteAllList(baka);のように。
0164デフォルトの名無しさん
2007/04/21(土) 20:17:49このc言語のプログラムを動かしたいのですが、うまく動きません。
プログラミングは初めてで、あまり詳しく分からないです・・・。
pastとnowとfutureとdvとvfという小数の変数を使ってfutureを求めたいです。
コンパイルしようとすると変数のtypeが違うかconflictingがどうとかでます。あと、main関数の返り値がint型でないと
言われるのですが・・・。 どう改善したらうまくいくのか教えて頂ければうれしいです。
よろしくお願いします
#include <stdio.h>
float past,now,future,dt,vf;
vf=1;
dt=0.01;
now=vf*dt-1;
past=-1;
float verlet(void)
{
2*now-past-4*now*(now*now-1)*dt*dt;};
float main(void)
{
printf("past=%f,now=%f",past,now);
future=verlet(void);
printf("future=%f",future);
}
0165デフォルトの名無しさん
2007/04/21(土) 20:20:20>コンパイルしようとすると変数のtypeが違うかconflictingがどうとかでます
せっかくコンパイラが親切に、エラー内容を教えてくれてるのに
無視しないで具体的に書いてよ
0166デフォルトの名無しさん
2007/04/21(土) 20:26:33ついでに言うと、どう直せばいいのか以前に無茶苦茶すぎる
おとなしく基本から順にやった方がいいよ
・main の戻り値を float じゃなくて int にする
・verlet の定義の最後の } の後の ; はいらない
・verlet に return がない
・以下の部分は main の中に移動
>vf=1;
>dt=0.01;
>now=vf*dt-1;
>past=-1;
などなど
0167デフォルトの名無しさん
2007/04/21(土) 20:44:04とりあえず数時間まともに入門サイトでも読んできたら?
0168デフォルトの名無しさん
2007/04/21(土) 22:07:48指摘の通り、前のリストのnextを持たせてやる事で
NULLを入れてやることができました。
ありがとうございました。
0169デフォルトの名無しさん
2007/04/21(土) 22:31:54これは釣りか?釣りなのか?
マジなら、まず人のソースを読め。
#include <stdio.h>
float past, now, future, dt, vf;
float varlet(void)
{
return 2.0f*now-past-4.0f*now*(now*now-1.0f)*dt*dt; /* 戻り値がvoid以外ならreturn書け!*/
}
int main(void) /* mainは、今のうちは呪文のように←のように書け */
{
vf = 1.0f; /* 代入と計算は関数の中でしろ。少なくとも今のうちは */
dt = 0.01f;
now = vf * dt - 1.0f; /* vf * dt - 1; でも悪くも無いが、今のうちは型を統一しとけ! */
past = -1.0f; /* これも! */
printf("past=%f,now=%f\n",past, now); /* \nは要らないけど次の文字列とくっついちゃうだろ */
future = verlet();
printf("future=%f",future);
return 0; /* 今のうちは付けとけ */
}
0170デフォルトの名無しさん
2007/04/21(土) 22:35:25元はといえば、甘やかして育てた母が悪いのです。
でも、立派な社会人で幸せな家庭を築いていますので、許してやってください。
0171デフォルトの名無しさん
2007/04/21(土) 22:35:55浮動小数点数は常にdoubleを使っておけばよいと思う。
0172デフォルトの名無しさん
2007/04/22(日) 00:02:110173デフォルトの名無しさん
2007/04/22(日) 00:03:350175デフォルトの名無しさん
2007/04/22(日) 00:28:46a.txt
**A**
**B**
**C**
・
・
・
-------------------
b.txt
A
B
C
・
・
・
-------------------
b.txtのAをa.txtのAに挿入
b.txtのBをa.txtのBに挿入
b.txtのCをa.txtのcに挿入
するプログラムのソース作れる方いますか?
0176かなり初心者
2007/04/22(日) 00:35:00void moji (int);int heikin(int,int);
int main(int argc, char *argv[])
{ int kazu;
int x,y;
while(1){ printf("値1を入力:");
scanf("%d",&x);moji(x);
if (x<0){break;}
printf("値2を入力:");
scanf("%d",&y);moji(y);
kazu=heikin(x,y);
printf("平均%d\n",kazu);
moji(kazu);}
system("PAUSE");
return 0;}
int heikin(int a,int b){
int hei;
hei=(a+b)/2;
return hei; }
void moji (int a){
if (a>=60){
printf("合格%d\n",a);
}else{
printf("不合格%d\n",a);
}}
このプログラムで終了時「不合格−1」と表示されないようにしたいです。
どなたか教えてください。
0177デフォルトの名無しさん
2007/04/22(日) 00:53:08と
>if (x<0){break;}
を入れ替えたらいいんじゃね?
0178164
2007/04/22(日) 02:01:56ありがとうございます。ホンマすいません。今大学4回生で研究室配属になって
同級生たちは皆プログラムできるから基礎の説明とばされて、課題だされてちょっと勉強してやってみたんですが
こんなアリサマでした・・・。提出火曜で(出題は金曜)土日は研究室にだれもいなくてきけなくて困ってたのです。。。
returnの使い方がいまいち分からないのですがあとは分かった気がします。returnは数学でいうところの
f(x)=の部分ってことで、プログラムの関数のカッコの中が数学でいうところの関数の中身って感じでいいんですかね。。。
0179デフォルトの名無しさん
2007/04/22(日) 02:04:420180デフォルトの名無しさん
2007/04/22(日) 02:23:070181デフォルトの名無しさん
2007/04/22(日) 02:24:590182デフォルトの名無しさん
2007/04/22(日) 02:34:320183デフォルトの名無しさん
2007/04/22(日) 03:06:53このようになる理由がわからない。教えてください。
0184デフォルトの名無しさん
2007/04/22(日) 03:14:230185デフォルトの名無しさん
2007/04/22(日) 03:38:142^31=2147483648
2^32(値の上限は2^32-1)を2進数で表して、先頭の32桁目を1か0で符号として扱い
+-で半分に分けて使っていることに関して理解していりゃ、あとは
>>184 の理屈で16進数に置き換えて -2^31 が 80000000
FFFFFFFF が-1というのが分かれば良いかと。
0186デフォルトの名無しさん
2007/04/22(日) 03:49:573×3のマスでたとえば
111
1□□□
1□□□
1□□□
となっていればこれの条件を満たすのは
111
1■□□
1□■□
1□□■
111
1□□■
1□■□
1■□□
となりますがこのように縦横彫るマスの数だけを与えて
それを満たすすべてのパターンを出力ってできますか
0187デフォルトの名無しさん
2007/04/22(日) 03:55:14ピクロスではありません。
0188デフォルトの名無しさん
2007/04/22(日) 04:14:28その横軸と縦軸に並んでいる数字も変化するんだよな?
0189デフォルトの名無しさん
2007/04/22(日) 05:40:190190デフォルトの名無しさん
2007/04/22(日) 07:46:58ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3851.c
なんか上手いやり方ないんかな。
0192デフォルトの名無しさん
2007/04/22(日) 18:01:32int func(void){
static int a=0;
return ++a;
}
main(){
int b,i;
for(i=0;i<3;++i)
b=func();
printf("%d",b);
}
何故これの結果が3になるのかがわからりません。
2回目,3回目のfunc関数呼び出しでは、static変数になっててもa=0になるから
returnはずっと1だと思ったんですが違うようで・・お願いします
0193デフォルトの名無しさん
2007/04/22(日) 18:02:58static int a=0;は一度しか初期化されない
2回目以降は前回の値を保持している
0194デフォルトの名無しさん
2007/04/22(日) 18:04:33一度しか初期化されないんですか。謎が解けました!。ありがとうございました
0195デフォルトの名無しさん
2007/04/22(日) 18:38:01static変数とグローバル変数だけだぞ。
int func(void){
int a=0;
return ++a;
}
だと、関数が呼び出される度にa=0で初期化されるからな。念のため
0196デフォルトの名無しさん
2007/04/22(日) 18:48:25了解しました。auto変数は毎回初期化されるんですね
0197デフォルトの名無しさん
2007/04/22(日) 19:16:370198デフォルトの名無しさん
2007/04/22(日) 20:17:42思うと分かりやすいかな。
その関数専用で外部に見せる必要がない管理データを持つのに使ったりする。
0199かなり初心者(176)
2007/04/22(日) 22:35:34しかし、どうして入れ替えただけでいいんでしょう?
まったく基礎ができてないやつです。
0200デフォルトの名無しさん
2007/04/22(日) 22:54:06プログラムは基本、上から順に実行されるんだから
上から順に追っていってみなよ
0201199
2007/04/22(日) 23:12:41int mainの中に入れないといけないプログラムと
{}の外に書くプログラムの違いってなんですか?
参考書見てまんま書き写しているだけなんで、教えてください。
0202デフォルトの名無しさん
2007/04/22(日) 23:26:29別の関数に書き出してそれをmain関数から呼び出すことで特定の処理をmain関数から追い出す
後で再利用することもできるので何度も書く手間も省ける
0203デフォルトの名無しさん
2007/04/22(日) 23:50:21教えようにも、君に分かるように教えるのはたぶん無理
足し算引き算すら知らない幼稚園児に、高校数学の微積を教えることが出来るか?
そーいうことだ
0204デフォルトの名無しさん
2007/04/23(月) 00:41:38うちじゃへぼSEのせいで1プロジェクトが終わっても再利用できるものは何もないという有様w
0205デフォルトの名無しさん
2007/04/23(月) 01:35:16>int mainの中に入れないといけないプログラムと
>{}の外に書くプログラムの違いってなんですか?
main関数とは限らないけどソースに直接書くのは
宣言か関数定義だけ。
関数の外に文を書くことはできない。
行頭が#で始まる。プリプロセッサ命令はC言語の文法とは全く別。
0206デフォルトの名無しさん
2007/04/23(月) 02:40:400207デフォルトの名無しさん
2007/04/23(月) 02:51:19って一斉につっこみが入るくらい長文かつややこしい説明になるんじゃないかなあ…
0208デフォルトの名無しさん
2007/04/23(月) 06:02:230209デフォルトの名無しさん
2007/04/23(月) 12:28:03一部を抜粋してるだけなんじゃないかな
それをmainの外だと勘違いしてるのだと思う
0210デフォルトの名無しさん
2007/04/23(月) 12:59:34戻り値がint*型の関数は
*を付ければ代入式の左辺にしてもいいですか?
struct p{
a[10];
b[10];
};
int *f(struct p *x, int i){
if(i<10){
return x->a[i];
}else{
return x->b[i-10];
}
}
int main(void){
int i;
struct p *x;
for(i=0;i<20;i++){
*f(i)=i;
}
return 0;
}
0211210
2007/04/23(月) 13:00:390212デフォルトの名無しさん
2007/04/23(月) 13:03:29らめぇ
0213デフォルトの名無しさん
2007/04/23(月) 13:30:41一概には言えない。そのコードの場合は、それ以前の段階でダメ。
0214デフォルトの名無しさん
2007/04/23(月) 14:43:140215デフォルトの名無しさん
2007/04/23(月) 15:24:23今、専門学校でデータベースやXMLやっててCやったせいか理解しやすい
皆、ちんぷんかんぷだ。俺はすんなり入る。
オマイ等、サンクス!オマイ等に光あれ!
0216デフォルトの名無しさん
2007/04/23(月) 15:38:260217デフォルトの名無しさん
2007/04/23(月) 16:10:44それはお前が頑張った証拠だ
感謝するなら自分のやる気に感謝しとけw
0218デフォルトの名無しさん
2007/04/23(月) 17:07:01このプログラムを起動して最初に58を入力したらいきなり画面が黒くなってオーバーなんとか
って表示されてPCがうんとも寸ともいわなくなって強制終了したんですが
そうなった原因は何かわかりますか?
#include <stdio.h>
void sa(int *ko);
int main(void)
{
int i,te[10];
for(i=0;te[i]!=-1;i++){
printf("数字を入力(100以内)\n");
scanf("%d",&te[i]);
while(te[i]>100){
printf("やり直し\n");
scanf("%d",&te[i]);}}
sa(te);
return 0;
}
void sa(int *ko)
{
int i=0;
while(ko[i]!=-1){
printf("%d\n",ko[i]);
i++;}}
0219デフォルトの名無しさん
2007/04/23(月) 17:17:08色々と突っ込みどころだらけで恐らくは期待した通りには動かないだろうとは思うけど、
いきなり画面が黒くなったりうんともすんとも言わなくなるとは思えないな。
0220デフォルトの名無しさん
2007/04/23(月) 17:17:170221デフォルトの名無しさん
2007/04/23(月) 17:21:31scanf の落とし穴に引っかかっても
画面が(ry になるような感じじゃないものな
0222デフォルトの名無しさん
2007/04/23(月) 17:34:440223デフォルトの名無しさん
2007/04/23(月) 17:37:49# 不正アクセスはあるけど
0224デフォルトの名無しさん
2007/04/23(月) 17:38:280225デフォルトの名無しさん
2007/04/23(月) 17:44:050226デフォルトの名無しさん
2007/04/23(月) 18:10:40それがスタートアップルーチン用の何かの情報を壊して
その影響で再帰呼び出しか巨大なスタック領域の確保が
行われたりとか?
0227デフォルトの名無しさん
2007/04/23(月) 18:32:52if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) > 0)
の文の場合、socket(PF_INET, SOCK_STREAM, 0)が評価され、
次にsockfd = socket()の代入文が評価されるのは理解しています。
その次にif((代入文) > 0)の評価なのですが、どのように評価されるのでしょうか?
代入文で代入された値と0が評価されるのでしょうか?
また別の質問なのですが、
if((int_a = funcA()) > (int_b = funcB()))
の文は何から評価されるのでしょうか?
funcAかfuncBのどちらが先に評価されるのでしょうか?
0228デフォルトの名無しさん
2007/04/23(月) 18:33:060229デフォルトの名無しさん
2007/04/23(月) 18:37:27socket() の戻り値が0を超えるかという評価
0230デフォルトの名無しさん
2007/04/23(月) 18:40:02http://www.kouno.jp/home/c_faq/c3.html
0231210
2007/04/23(月) 18:46:58慌てて見直さずカキコしちゃいました(汗
mallocを書き忘れましたけど、
*をつけて左辺に置いてはいけない例を
お願いします
0232210
2007/04/23(月) 18:50:370233デフォルトの名無しさん
2007/04/23(月) 18:52:12何を知りたいのかよく判らんから、具体的な質問にしてくれ。
0234デフォルトの名無しさん
2007/04/23(月) 19:23:12この数字の意味が分からないのです。いやなんとなく分かるんですが、バシっと分かりません。
しかも[]の中の数字なんて無くても良いと思うのですが。
どんな時に使うのですか?
すいません、基本的なことで。
お願いします。
0235232
2007/04/23(月) 19:24:18>>213さんに、一概には言えない、と言われたから、どんなときに
戻り値がint*型の関数を代入式の左辺に
*をつけて使ってはいけないのか
教えてください(--;)
0236デフォルトの名無しさん
2007/04/23(月) 19:25:410237デフォルトの名無しさん
2007/04/23(月) 19:30:00確保する領域の大きさを自分で決めたいときにつかいますよー
scanfで文字列を読み込んだり
文字列をstrcatで繋げたり
sprintfで文字列を作るときに
領域が用意されてないと大変になります(--;)
0238デフォルトの名無しさん
2007/04/23(月) 19:31:48char を20個確保
int a[15] なら int を15個確保
0239デフォルトの名無しさん
2007/04/23(月) 19:37:30宣言するときに
char a[]="text";
のように初期化する文字列があれば
括弧のなかには数字は無くても
文字数+1の領域が用意されます。
char a[];
だけだと領域の大きさが分からないからダメです。
関数の引数で
char a[]
と書かれてるときはポインタとして扱われて
char *a
となります。
多分こんなかんじだと思う(--;)
0240デフォルトの名無しさん
2007/04/23(月) 19:37:59関数がNULLを返すとき。
関数が無効なポインタを返すとき。
変更不能なオブジェクトを指しているポインタを返すとき。
0241227
2007/04/23(月) 19:41:51参考になるページを貼っていただいて助かりました。
なんとか理解できそうです。
0242デフォルトの名無しさん
2007/04/23(月) 19:43:29条件分岐文ってのが何を意味してるのか今ひとつわからんが、
一般的には左から右に評価されるわけじゃないぞ
0243デフォルトの名無しさん
2007/04/23(月) 19:44:24ありがとうございます!
バッチリ理解できました。
調べても答えが見つからなくて困ってました。
本当に助かりました。ありがとうございます。
これで先に進めます♪
0244デフォルトの名無しさん
2007/04/23(月) 19:45:25char a[16]="0123456789abcdef";
printf("%1s\n",a[i])
みたいに文字数ぴったりで宣言することもある
(--;)と思う
0245235
2007/04/23(月) 19:49:56つまり普通にポインタを扱うときと同じ注意をすればいいんですね。(--;)
あと関数内の静的じゃない変数のポインタもダメですね
ありがとうございました
0246デフォルトの名無しさん
2007/04/23(月) 19:50:42ここの一番下14-5を見るといい
http://www9.plala.or.jp/sgwr-t/c/sec14.html
0247デフォルトの名無しさん
2007/04/23(月) 19:53:03演算子の優先順位とオペランドの評価順序は別物
0248デフォルトの名無しさん
2007/04/23(月) 19:53:570249デフォルトの名無しさん
2007/04/23(月) 19:57:05質問者はオペランドの評価順は聞いていないと思うけど
質問の内容からも ( )、=、>、< の評価順位を聞いていると思うんだけど違うの?
0250デフォルトの名無しさん
2007/04/23(月) 19:59:570251デフォルトの名無しさん
2007/04/23(月) 20:02:25お前さん、評価順序と優先順位を混同してるんじゃない?
0252デフォルトの名無しさん
2007/04/23(月) 20:06:40ごめん funcAかfuncBかだったね
逝ってきます
0253デフォルトの名無しさん
2007/04/23(月) 20:10:12a = 0x01;
x = 0x01 + a & 0x01 == 0x00 ? 0x01 : 0x10;
わけわかんない(--;)
0254デフォルトの名無しさん
2007/04/23(月) 20:20:290255デフォルトの名無しさん
2007/04/23(月) 20:28:040256デフォルトの名無しさん
2007/04/23(月) 20:31:010257デフォルトの名無しさん
2007/04/23(月) 20:47:200258201
2007/04/23(月) 23:17:49単語の意味もわからず文法習っている感じなんですよね。
ただいま配列変数やっております。
0259デフォルトの名無しさん
2007/04/23(月) 23:20:01別にくくってもいいと思うが・・・
0260デフォルトの名無しさん
2007/04/23(月) 23:23:320261デフォルトの名無しさん
2007/04/23(月) 23:33:23その辺りの区別を「どうでもいいや〜」とか思ってると
いつまでたっても初心者を脱することはできない。
0262デフォルトの名無しさん
2007/04/23(月) 23:42:49char *str;
str="ABC";
は可能で
scanf("%s",str);
がダメな理由がわかりません。お願いします
0263デフォルトの名無しさん
2007/04/23(月) 23:52:20前者はただのポインタ変数へのポインタの代入。
後者はscanf()がポイント先を変更する前提としてのポインタの引き渡し。
従って、文法上は何ら問題がない。
ただ、scanf()の仕様上そのポインタのポイント先が代入可能領域でないといけないだけ。
0264デフォルトの名無しさん
2007/04/23(月) 23:53:21str → (どこも指していない)
>str = "ABC";
str → "ABC"
str は "ABC" を指す。OK
>scanf("%s",str);
str → ここに何かを書き込もうとする
どこも指していない場所に書き込もうとしているのでアウト
0265デフォルトの名無しさん
2007/04/23(月) 23:57:23言っているみたいで誤解が生じないか?
0266デフォルトの名無しさん
2007/04/23(月) 23:58:55ありがとうございます。なんとなくわかりました。ポインタ変数には代入できないということですね
0267デフォルトの名無しさん
2007/04/24(火) 00:00:02何でだよwww
0268デフォルトの名無しさん
2007/04/24(火) 00:00:10書き込み可能領域じゃないといけないわけで
0269デフォルトの名無しさん
2007/04/24(火) 00:02:150270デフォルトの名無しさん
2007/04/24(火) 00:12:500271デフォルトの名無しさん
2007/04/24(火) 00:16:34ポインタ変数に代入はできるぞ。代入できない変数に意味はないだろう。
char *str;
scanf("%s" str);
はstrに代入するのではなくstrが指している先にchar(の配列)を設定しようと
している(この辺の表現は微妙だけど、、、)
しかしこの場合strはでたらめなところを指しているのででたらめなところに
文字列を設定しようとする。たまたま動くかもしれないし、動かないかもしれない。
char *strの替わりにchar str[1024];とかするととりあえずは動くだろう
(バッファオーバーフローのことは目をつぶる)
int n;
scanf("%d" &n);
この場合に&nが指しているさき(すなわちnであるのだが)に数値を設定する。
この&nと上記のstrが同じような意味合い。
0272デフォルトの名無しさん
2007/04/24(火) 00:20:19そういえばUNICODEにもあったハズ・・・
0273デフォルトの名無しさん
2007/04/24(火) 00:29:04お前も理解があやふやだな
>>263とか>>268とか読んだか?
0274デフォルトの名無しさん
2007/04/24(火) 00:48:34そう?わかってるつもりだけど。
微妙な表現があるのはわかってるけどこかまちがってるか?
0275271&274
2007/04/24(火) 00:50:070276デフォルトの名無しさん
2007/04/24(火) 02:07:160277デフォルトの名無しさん
2007/04/24(火) 02:20:57初心者はfgetsしてからsscanfを
使うようにと書いてあります。
なぜですか??
0278デフォルトの名無しさん
2007/04/24(火) 03:13:52scanf()は癖があって使いにくいから。
例えばscanf("%d", ...)がループの中にあったとして、うっかり数字以外の文字を入れてしまうと泣ける。
0279デフォルトの名無しさん
2007/04/24(火) 04:04:45↓はデータ受信側のソースの一部なのですが、
n = connect(sock, (struct sockaddr *)&server, sizeof(server));
while(n==SOCKET_ERROR){
n = connect(sock, (struct sockaddr *)&server, sizeof(server));
}
このconnect()を抜けた直後に、recv()でデータを受信するというプログラムになっています。
一方送信側は、accept()の直後にsend()によってデータを送信するようになっています。
しかし、send()を実行したところ、SOCKET_ERRORが返ってきてしまいます。
コネクションが確立した直後にsend()を実行してSOCKET_ERRORが返ってくることなんてあるのでしょうか?
0280279
2007/04/24(火) 04:22:57SOCKET_ERRORである限り、永遠にconnectするように設計しているのですが、
何故(コネクションを確立せずに)ループを抜けてしまうのでしょうか?
0281デフォルトの名無しさん
2007/04/24(火) 04:34:430282デフォルトの名無しさん
2007/04/24(火) 08:18:36ポインタを通して読み書きするには、ポインタが適切なメモリ領域を指し示していなければならない。
ポインタが他の変数が適切なメモリ領域を指し示すようにするには、適切なメモリ領域へのポインタを代入すればよい。
その適切なメモリ領域へのポインタを得る方法には、
変数に&演算子を使用する、配列(先頭要素へのポインタへ変換される規則)、mallocなどといった方法がある。
"ABC"のような文字列リテラルは、自身のメモリ領域を伴った配列という扱いで、
ポインタ型の変数に書き込めば、その変数は文字列リテラルのメモリを指し示すようになる。
一方scanfでは、既に適切な(つまり読み書きできる)メモリ領域を指し示した状態のポインタを引数に取ることが
前提とされており、そこへ入力されたデータを書き込むという動作を行っているので、
適切なメモリ領域を指し示していないポインタを渡してはならないのだ。
0283デフォルトの名無しさん
2007/04/24(火) 08:24:17これは間違いだよ、ととある所に書いてあったのだけど、別に
それほど問題にはならないんじゃ、とか思った漏れは逝って
良しですか?
0284デフォルトの名無しさん
2007/04/24(火) 08:28:12そこだけ抜き出されても、書かれた趣旨は判らない。
敢えて言うならdouble値はlong値よりもはるかに広い数を扱えるので、
単純に代入はできない。また、精度の問題で単純な代入では問題がある。
0285デフォルトの名無しさん
2007/04/24(火) 09:48:08それは暗黙的にlong intにキャストされる際に小数部を切り捨てられるから
小数部を使わないdoubleなら(表現幅がlongの範囲内であれば)実質的な
データの欠損は無いから大丈夫って意味じゃない?別に問題無い気がする。
284が言ってるようにlongの範囲外のデータが入ってるdoubleはアウアウだけど。
0286デフォルトの名無しさん
2007/04/24(火) 11:14:35単なる代入(暗黙のキャストによる切り捨て)でいいか、丸めを必要とするかは検討すべきだけどね。
0287デフォルトの名無しさん
2007/04/24(火) 11:49:310288デフォルトの名無しさん
2007/04/24(火) 11:51:59浮動小数点型の内部表現では、
小数部のない数値の表現は頭の1ビットが
…(省略されました。各自ググって下さい)
って事じゃねーかな?
0289デフォルトの名無しさん
2007/04/24(火) 12:10:05そもそも、小数部の有無と内部表現には関連が無いぞ。
0291デフォルトの名無しさん
2007/04/24(火) 12:32:190292デフォルトの名無しさん
2007/04/24(火) 12:40:43この自己主張の下手な困ったチャンは一体何が言いたいのだろう……
#まさかとは思うけど、IEEE前提だよね?
0293デフォルトの名無しさん
2007/04/24(火) 15:21:11今日、ちょっとだけ他の本を立ち読みしたら・・・。
まだこんなに難しいのあるのかいな!ってな感じでショックを受けましたw
歳も30後半だし、中卒だしw超初心者だし。
c勉強してなんになるんだろうと思いながら毎日勉強してます。
ちょっと小言を言いたかっただけです。すっきり。
すみませんでした。
0294デフォルトの名無しさん
2007/04/24(火) 15:56:17その歳でCをはじめても仕事ができるレベルになるまで時間がかかりすぎるだろ
0295279
2007/04/24(火) 16:03:32WSAGetLastErrorで調べたところ、connect直後の値は0でした。
しかし、相手側のacceptはずっと接続待ちの状態でした。
なんか違うアドレスに接続してるのかと思って、アドレスを確かめましたが、
間違ってはいませんでした。というか、接続が確立される時とそうでない時があるのが不思議です。
もうダメぽ・・・
0296デフォルトの名無しさん
2007/04/24(火) 16:04:52身につけてもどーしようもないだろ。
0297デフォルトの名無しさん
2007/04/24(火) 16:09:40それを言ったらプログラミングそのものが
0298デフォルトの名無しさん
2007/04/24(火) 16:35:28#include <stdio.h>
void sa(int *ko);
int main(void)
{
int i=0,te[10];
do {
printf("数字を入力(100以内)\n");
scanf("%d",&te[i]);
while(te[i]>100){
printf("やり直し\n");
scanf("%d",&te[i]);}
i++;
}while(te[i-1]!=-1);
sa(te);
return 0;
}
void sa(int *ko){
int i=0;
while(ko[i]!=-1){
printf("%d\n",ko[i]);
i++;}}
でまともにうごいたんですが
画面が暗くなった原因がいまだわからん!
0299デフォルトの名無しさん
2007/04/24(火) 18:10:06どの段階で暗くなったかを言わないと誰もわからないと思う
5つ目を入力中だったとか14個目を入力中だったとか
まぁ考えられるのは11個以上入力したときのデータ破壊だけど
このプログラムもまともに動いたかもしれないがte[]が入力個数のチェックしてないのは危ない
せめてdo{}while(); のwhile(te[i-1]!=-1); を while(i<10&&te[i-1]!=-1); にしたほうがいいよ
0300デフォルトの名無しさん
2007/04/24(火) 20:16:22#include<stdio.h>
#define LOOPS 3
main(){
int i ;
for(i = 0; i < LOOPS; i++)
printf("%d\n", i+1);
return 0;
}
を使って結果を以下のようにしたいのですが、
どう変えれば良いでしょうか?
1:叫ぶ
2:寝る
3:起きる
0301デフォルトの名無しさん
2007/04/24(火) 20:19:14#define LOOPS 3
main(){
/*int i ;
for(i = 0; i < LOOPS; i++)
printf("%d\n", i+1);*/
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");
return 0;
}
0302デフォルトの名無しさん
2007/04/24(火) 20:22:13#define LOOPS 3
char *msg[]={"叫ぶ","寝る","起きる"};
main(){
int i ;
for(i = 0; i < LOOPS; i++)
printf("%d:%s\n", i+1,msg[i]);
return 0;
}
0303300
2007/04/24(火) 20:29:03サンクスです!!
>>301
この文法はまだ、教本で習っていないのですが
>>printf("%d\n", i+1);*/
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");
*/ の解説を宜しくお願いします、教本にも載っていません・・・・。
>>302
char *msg[]={"叫ぶ","寝る","起きる"}; は
どうして、char msg[]={"叫ぶ","寝る","起きる"}; では
いけないのでしょうか?
教本の説明でもダメ、これは入れられなく
ポインタを使い先頭のアドレス云々と解説してありますが
いまいち、どうしていけないのかわかりません。
0304デフォルトの名無しさん
2007/04/24(火) 20:30:52/* */ はコメントだろ・・・
0305デフォルトの名無しさん
2007/04/24(火) 20:32:26文字列リテラルの型は char* (charへのポインタ)であるから、
それの配列なら char *[] (charへのポインタの配列)だろう。
0306デフォルトの名無しさん
2007/04/24(火) 20:32:52"叫ぶ","寝る","起きる"ってのは文字列なので、要はアドレス。
だから、char型ではダメ。
0307デフォルトの名無しさん
2007/04/24(火) 20:38:32char msg[][10]={"叫ぶ","寝る","起きる"};
これならいけるんじゃないか
0308300
2007/04/24(火) 20:46:13>>304
よく見たら、コメントでした。
/*int i ;
for(i = 0; i < LOOPS; i++)
printf("%d\n", i+1);*/
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");
は
int i;
for(i = 0; i < LOOPS; i++){
printf("%d\n", i+1);
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");
}
ではいけないのでしょうか?
どうして、putを使えば順番に出力されるのでしょうか?"%s"は使っていませんよね。
/**/が関係してるからでしょうか?
>>305->>306
わかりました!charだと一文文字列や文字型だけですから。
ポインタを使いcharへアドレスを入れていく感じででしょうか?
0309デフォルトの名無しさん
2007/04/24(火) 20:50:33それでは初心者への答えとしても知ってる人への説明としても間違ってる
>>303
"叫ぶ""寝る""起きる"はどれも文字配列
変数msgが1つの配列なら、"叫ぶ""寝る""起きる"の3つの配列がいれられないってのはわかるだろ
そこで二次元配列という配列を入れる配列を使うが、ややこしいのでポインタとあわせてじっくり理解汁
0310デフォルトの名無しさん
2007/04/24(火) 20:50:58いけないと思うのなら、試しにそれでコンパイル・実行してみろ。
0312デフォルトの名無しさん
2007/04/24(火) 21:02:37printf("%d\n", i+1); これも実行される
求めている出力結果と違ってくるジャン
0313300
2007/04/24(火) 21:03:39#include<stdio.h>
#define LOOPS 3
char *msg[]={"叫ぶ","寝る","起きる"};
main(){
int i ;
for(i = 0; i < LOOPS; i++)
printf("%d:%s\n", i+1,msg[i]);
return 0;
}
でなく
#include<stdio.h>
#define LOOPS 3
main(){
int i ;
char *msg[]={"叫ぶ","寝る","起きる"};
for(i = 0; i < LOOPS; i++)
printf("%d:%s\n", i+1,msg[i]);
return 0;
}
とグローバル関数として定義しなくてもいいのでしょか?
0314300
2007/04/24(火) 21:11:04サンクスですた。
0315デフォルトの名無しさん
2007/04/24(火) 21:11:21おk
0316デフォルトの名無しさん
2007/04/24(火) 21:59:082つに分ける際に、片方は順番に、もう片方は逆順にして分けていくソースが見られます
逆順にする利点に関して教えてください
よろしくお願いします
0317デフォルトの名無しさん
2007/04/24(火) 23:09:31int main (void)
{
int a;
printf("%p\n",a); /*その1*/
printf("%p\n", &a); /*その2*/
return 0;
}
その1とその2で
なんで違うんだろう。
誰か教えてくれ
0318デフォルトの名無しさん
2007/04/24(火) 23:10:200319デフォルトの名無しさん
2007/04/24(火) 23:12:14%pはアドレスを表示する。
だからその2の使い方があってる。
その1は使い方自体が誤り。
0320デフォルトの名無しさん
2007/04/24(火) 23:15:180321デフォルトの名無しさん
2007/04/24(火) 23:20:10サンクス
>>320
ダイテル親子の本を買ったんだが
答えがついてないんだ。すまん
0322デフォルトの名無しさん
2007/04/24(火) 23:53:29っていうかこういうのは言わば確認問題なのであって、
問題の前に書いてあることをちゃんと読んでいればわかるはずなんだが。
0323デフォルトの名無しさん
2007/04/25(水) 00:07:29「宿題っぽい質問」つーよりは、「人に訊く以前のレベルの質問」だろう。
0324デフォルトの名無しさん
2007/04/25(水) 00:54:06ttp://www1.cts.ne.jp/~clab/hsample/Sort/Sort6.html
ここでもそうなんですが、
半分に分割して、後半は逆にして入れてます
どうしてなのでしょうか?
0325デフォルトの名無しさん
2007/04/25(水) 05:13:290326デフォルトの名無しさん
2007/04/25(水) 07:44:330327デフォルトの名無しさん
2007/04/25(水) 12:13:21「C言語 %p」でググればいくらでも出てくるでしょ
0328デフォルトの名無しさん
2007/04/25(水) 22:17:24intを省略しているところが結構あるんだが。
0329デフォルトの名無しさん
2007/04/25(水) 22:19:430330デフォルトの名無しさん
2007/04/25(水) 22:22:140331デフォルトの名無しさん
2007/04/25(水) 23:33:04char a[]="abc";
において'b'を表す方法として、a[1]はわかるんですが、何故*(a+1)としてもいいのかわかりません。
*(a+1)のaが先頭アドレスで、そこから1つ先の中身を指さすという意味合いはわかるのですが、
ポインタ変数を宣言してないのに、配列を*で表せるという事がわかりません
0332デフォルトの名無しさん
2007/04/25(水) 23:34:07意味合いが分かっているなら、
そう定義してあるから、としか答えようがないな
0333デフォルトの名無しさん
2007/04/25(水) 23:35:08添え字演算子はそうなるように定義されている
0334デフォルトの名無しさん
2007/04/25(水) 23:41:50ポインタはchar *pのような宣言をしないと使えないと思っていたので、
頭がこんがらがってるだけかもしれないんですが、
配列を宣言するとポインタを宣言しなくても*で表せるという決まりということなんでしょうか・・。
上の例だと、適当なアドレスに'a','b','c'が連続で割り当てられ、
a[0],a[1],a[2]がそれぞれを表していますが、
この時同時に、*(a+1),*(a+2)のようなポインタが適当な場所に作られるということでいいんでしょうか?
0335デフォルトの名無しさん
2007/04/25(水) 23:44:43式の中において、配列は、その配列の先頭要素を指すポインタに変換されるという規則がある。
概念的には配列aは式の中だと&a[0]として扱われるという感じ。
0336デフォルトの名無しさん
2007/04/25(水) 23:54:30わかるようなわからない感じなんですが、
配列a[]が宣言された時点でaがポインタに変換されるという事で、
>>334に書いたようにポインタが別の領域につくられるという事ではないんでしょうか・・
0337デフォルトの名無しさん
2007/04/25(水) 23:59:280338デフォルトの名無しさん
2007/04/26(木) 00:03:54http://kmaebashi.com/programmer/pointer.html
0339デフォルトの名無しさん
2007/04/26(木) 01:02:46「ポインタ」と「ポインタ変数」の区別がついてない気がする。
0340デフォルトの名無しさん
2007/04/26(木) 01:57:16それを言うならアドレスとポインタじゃないのか?
0341デフォルトの名無しさん
2007/04/26(木) 02:09:00「アドレス」の話など、誰もしていません。
0342デフォルトの名無しさん
2007/04/26(木) 10:16:30コンパイラが同じと解釈するので
出てくるコードが同じになる、と思えばいいかと
0343デフォルトの名無しさん
2007/04/26(木) 10:24:55ポインタわかってないならコンパイラなんか意識してないだろうから
余計分かりづらいんじゃないか。
0344デフォルトの名無しさん
2007/04/26(木) 10:51:29link t, y= x, r= NULL;
while( y!=NULL ){
t= y->next; y->next= r;
r= y; y= t; }
return r;
}
これってさlink xを辿っていった最後のlinkを返すだけのプログラム?
だったらもwhile(y!=NULL)y=y->next; return y;で済むはずなんだけど
本当はrがどうなってるの?リストを反転させるためのメソッドらしい
0345デフォルトの名無しさん
2007/04/26(木) 11:04:06自分で答え書いているよ。文字通り、linkedListを反転させている。
こんなイメージを手で追ってけば理解できるっしょ。
与えるリスト
x
next→?1
next→?2
next→NULL
関数entry
y = x
loop1
t = ?1
x->next = NULL
r = x
y = ?1
loop2
t = ?2
x->next = x
r = ?1
y = ?2
loop3
...
0346デフォルトの名無しさん
2007/04/26(木) 12:50:15NULL→4→6→3→8→2とリンクしていたら
return rのrは
2→8→3→6→4→NULLとなっているのですか?
0347デフォルトの名無しさん
2007/04/26(木) 13:00:22x
↓
4→6→3→8→2→NULL
を
r
↓
NULL←4←6←3←8←2
にしてrを返しているイメージだな。
つまり、ターミネータつき可変長配列ではターミネータの検索と入れ替えの2フェーズ掛かる処理が
リストだと繋ぎ替えの1フェーズでできるって好例だね。
0348デフォルトの名無しさん
2007/04/26(木) 13:16:24読み込もうとすると、中身が読み込めなくなってしまいました。
同じファイルをまた使うにはどうしたら良いでしょうか?
使用したソースとテキストの内容は以下のものになります。
#include <stdio.h>
void fd(FILE *fp) {
int ch;
printf("\n- - - - - START - - - - - -\n");
while( (ch=fgetc(fp)) != EOF) {
printf("%c",ch);
} printf("\n- - - - - E N D - - - - - -\n"); }
int main(void) {
FILE *fp;
char *fname="aaa.txt";
if( (fp=fopen(fname,"r")) == NULL)
return 1;
else { fd(fp); fd(fp); }
fclose(fp);
return 0; }
- - - - - - - - - - - - - - - - - - - - - - - -
aaa.txt の中は以下のものを書いたものを使用してみました。
abcdefghijklmnopqrstuvwxyz
012345678901234567890123456789
- - - - - - - - - - - - - - - - - - - - - - - -
ファイルの中を表示するfd()の2回目の実行ではファイルの中身が表示されません。
0349デフォルトの名無しさん
2007/04/26(木) 13:23:46if文のtrue節で脱出しているのにelse節で処理を書くのはよくない。
一行に二文突っ込むのもよくない。
ってことで、
if( (fp=fopen(fname,"r")) == NULL)
return 1;
else { fd(fp); fd(fp); }
を
fp=fopen(fname,"r");
if(fp == NULL) {
return 1;
}
fd(fp);
rewind(fp);
fd(fp);
にして味噌。
0350デフォルトの名無しさん
2007/04/26(木) 13:26:25できました、お早い返答、ありがとうございました。
0351デフォルトの名無しさん
2007/04/26(木) 13:28:570352デフォルトの名無しさん
2007/04/26(木) 13:31:290353デフォルトの名無しさん
2007/04/26(木) 13:32:35大丈夫、賢いコンパイラならprintf("%c",ch)をputchar(ch)同等に最適化してしまうから。
0354662
2007/04/26(木) 13:33:30#include <stdlib.h>
typedef struct node *link;
struct node heada;
struct node { int item; link next; };
main(int argc, char *argv[]){
int i;
link t=malloc(sizeof *t),a=&heada;
t=a;
for(i=1;i<=8;i++){
t=t->next;
t->item=atoi(argv[i]);
}
t->next=NULL;
t=a;
t=reverse(t);
for(i=1;i<=8;i++){
printf("%d\n",t->item);
t=t->next;
}
}
link reverse(link x){ ←ここで'reverse' の再宣言で型が一致していない、とエラーが出るのですがどうしてですか?
link t, y= x, r= NULL;
while( y!=NULL ){
t= y->next; y->next= r;
r= y; y= t; }
return r;
}
0355デフォルトの名無しさん
2007/04/26(木) 13:35:040356デフォルトの名無しさん
2007/04/26(木) 13:36:44目的次第ではないでしょうか?あまり余計なことを言うとボロが出て逆に突っ込まれますよ?w
書式指定で表示する必要があればputcharで充分にはなりませんので、あしからず。
>>349
> if文のtrue節で脱出しているのにelse節で処理を書くのはよくない
なんで?
> fp=fopen(fname,"r");
別にifの外に書かなくても問題ないよ。知ったか乙
0357デフォルトの名無しさん
2007/04/26(木) 13:37:250358デフォルトの名無しさん
2007/04/26(木) 13:42:51突っ込みご苦労。一応フォロー。
>書式指定で表示する必要があればputcharで充分にはなりませんので、あしからず。
コンパイラと同じ最適化をしただけ。勿論、「この場合は充分だ」と言う意味だ。
>> if文のtrue節で脱出しているのにelse節で処理を書くのはよくない
>なんで?
単純に見通しが悪くなる。どうせやるなら、その後のfclose()まで全て含めるべき。
>> fp=fopen(fname,"r");
>別にifの外に書かなくても問題ないよ。知ったか乙
別に問題ないね。それについては私の趣味だ。ついでに言えば、それについて何も言及していないので知ったかも何も無い。
突っ込みすることだけを目的にスレを曲解した(或いはそのようにしか読めない)のだろうけれど、見苦しいよ。
0359デフォルトの名無しさん
2007/04/26(木) 13:46:09> 単純に見通しが悪くなる。どうせやるなら、その後のfclose()まで全て含めるべき。
ほら、でた、お前の「主観」。様々なソースを見てみればわかるが、ifの中に入れても問題はないよ。
ありもしない問題を自分の主観で問題視しないように。ここはソースの記述内容を
お前の主観で評価するところじゃない。質問の要点に答えるだけにしないと、関係ないことでトラブルになるぞ。
それから、putcharについては完全にお前の主観だから黙ってろ。
0360デフォルトの名無しさん
2007/04/26(木) 13:47:54--
#include <stdio.h>
int main(int argc, char ** argv)
{
int ch = getchar();
putchar(ch);
return 0;
}
--
.file "foo.c"
.def ___main; .scl 2; .type 32; .endef
.text
.p2align 4,,15
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
--
一部省略
--
movl 4(%eax), %edx
movl %edx, (%esp)
call _getc
--
ここも省略
--
movl 8(%eax), %eax
movl %ebx, (%esp)
movl %eax, 4(%esp)
call _putc
--
以下も省略
0361デフォルトの名無しさん
2007/04/26(木) 13:49:25puthchar()についてはコンパイラの最適化でさえ主観と申されるかw
主観だから黙ってろと言うことなので以下割愛。
0362デフォルトの名無しさん
2007/04/26(木) 13:50:05そのソースは自分スタイルじゃないって評価はいらねーってw
0363デフォルトの名無しさん
2007/04/26(木) 13:51:210364360
2007/04/26(木) 13:51:42--
#include <stdio.h>
int main(int argc, char ** argv)
{
int ch = getchar();
printf("%c", ch);
return 0;
}
--
.file "foo.c"
.def ___main; .scl 2; .type 32; .endef
.text
.p2align 4,,15
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl $16, %eax
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
call __alloca
call ___main
call ___getreent
movl 4(%eax), %eax
movl %eax, (%esp)
call _getc
movl %eax, (%esp)
call _putchar
--
以下省略。下手に対照実験なんかするもんじゃないなw
0365デフォルトの名無しさん
2007/04/26(木) 13:55:280366デフォルトの名無しさん
2007/04/26(木) 13:57:13"書式指定してない"んだからputchar()でいいじゃん。
何が気に入らないの?
0367デフォルトの名無しさん
2007/04/26(木) 13:57:45知ったかなんて言ったら失礼だよ。>357は偶偶知らなかっただけでしょ。
0368デフォルトの名無しさん
2007/04/26(木) 14:00:23しつこい、ここはお前スタイルでソースを評価するスレじゃないんだよ。
どこを見てもif()の中にfp=fopenを書いてはいけないという制約はないよw
0369デフォルトの名無しさん
2007/04/26(木) 14:02:45>366と>367は同一人物じゃありませんからね。
0370デフォルトの名無しさん
2007/04/26(木) 14:03:13> 別に問題ないね。
> それについて何も言及していないので
とか言っているが>>349に
> 一行に二文突っ込むのもよくない。
自分で良くないと言及しているのに問題ないと?w
所詮お前の主観、問題のない部分に対する突っ込みはトラブルになるんでご注意を。
ちうかこいつなんだ?プロ気取りか?w
0371デフォルトの名無しさん
2007/04/26(木) 14:05:10思いっきり勘違いしていないか?
> 一行に二文突っ込むのもよくない。
は、
>else { fd(fp); fd(fp); }
のことだぞ。
0372デフォルトの名無しさん
2007/04/26(木) 14:06:46だっておーーー(バンバン)(巨大VIPPERのAA略)
0373348
2007/04/26(木) 14:21:42printfを使って書いていました。いずれこれを、ファイルのダンプと文字コードを16進数で表示させる
プログラムに発展させるつもりでしたので・・・
0374デフォルトの名無しさん
2007/04/26(木) 14:21:53俺は366なんだが367じゃないし、そもそも349でも351でもないんだが。
っていうかputchar()についてしか言ってないのにifの中がどうとか言われても…・・・
0376デフォルトの名無しさん
2007/04/26(木) 14:54:080377デフォルトの名無しさん
2007/04/26(木) 16:11:12実行画面
実数入力==>10.4
四捨五入:10
実数入力==>10.5
四捨五入後: 11
になるプログラムを作成しなさい
この問題わかる方がいましたら教えてください(T_T)
0379デフォルトの名無しさん
2007/04/26(木) 16:16:36四捨五入したい値に0.5をどうにかして整数部だけ表示すればいいと思うよ
ちゃんとした回答が欲しかったら宿題スレにどうぞ
0380デフォルトの名無しさん
2007/04/26(木) 16:23:01#include <stdio.h>
int main(void) {
double x;
printf("実数入力==>");
scanf("%lf",&x);
if( x-(int)x >= 0.5 ) x=(int)x+1;
else x=(int)x;
printf("%0.lf",x);
return 0; }
0381デフォルトの名無しさん
2007/04/26(木) 16:24:520382デフォルトの名無しさん
2007/04/26(木) 16:28:50printf("%d", (int) (x + .5))だとどうなる?
0383デフォルトの名無しさん
2007/04/26(木) 16:35:53しかしこれを"%.20g"で出力すると1.499999999999998になる。
実際に内部形式から逆算すると1.4999999999999998が限界だ。
0384デフォルトの名無しさん
2007/04/26(木) 16:38:15その範囲内でなら問題ないんだけどね。
要するに、1.4999999・・・限りなく1.5に近い値ではなくそれを1.4で換算すればね。
0385デフォルトの名無しさん
2007/04/26(木) 17:56:18なにぶん始めたばっかしなので解りやすいやつでお願いします
0386デフォルトの名無しさん
2007/04/26(木) 18:05:490387デフォルトの名無しさん
2007/04/26(木) 18:16:18ブラックジャックを遊ぶプログラムをつくってたのですが
分からない点がでてきてしまいました。
52枚のカードの作成方法は(私が思うに)
文字型のポインタ char *card[]; を定義して
for文の二重ループの方法でマークと数字を書き込むんじゃないか……
と検討は付いたのですが
char型のポインタに"マーク"(文字列)と"数字"(整数値)の二つを
書き込む方法が見当たりません。。。
いったんは、書き込む数字を整数値から文字列に変えて再試行しましたが
for文の式(各マークに数字書き込む段階)で整数値を使っている以上
文字列への変更はできないように思われて・・・
どなたか
文字列のポインタに 文字列と整数値の相違種を書き込むをする方法を教えてくださいm(_ _)m
0388デフォルトの名無しさん
2007/04/26(木) 18:26:23取り敢えず、char *card[]ではダメだね。
こんな手はある。
char cards[52][4] = {"S A", "S 2", "S 3", /* 途中省略 */ "S10", "S J", "S Q", "S K", "H A", /* 省略 */ "D K"};
動的にやるより自由度は高いよ。
動的にやりたいなら、char cards[52][4]を用意して
for (int ic = 0; ic < 52; ++ic) sprintf(cards[ic], "%c%2d", "SHCD"[ic / 13], ic % 13 + 1)かな。
0389デフォルトの名無しさん
2007/04/26(木) 18:45:51card / 13 でスートが出るし card % 13 + 1で数字が出る
0390388
2007/04/26(木) 18:48:170391デフォルトの名無しさん
2007/04/26(木) 19:11:390392デフォルトの名無しさん
2007/04/26(木) 19:27:46これなら自由だべ。
static char const suits[] = "SHCD";
static char const numbers[] = " A 2 3 4 5 6 7 8 910 J Q K";
char cards[52][4];
for (int sc = 0; sc < 4; ++sc) {
for (int nc = 0; nc < 13; ++nc) {
sprintf(cards[sc * 13 + nc], "%c%2.2s", suits[sc], numbers + nc * 2);
}
}
0393デフォルトの名無しさん
2007/04/26(木) 19:28:37配列名sのs[2][2]に2つの文字列を表示させたい時は
どうすることが考えられますかね?
1つの文字列
japan korea eng
NULL eng/fra bra
NULL NULL arg
このeng/fraみたいな表示したいんだけど。
0394393
2007/04/26(木) 19:29:270395デフォルトの名無しさん
2007/04/26(木) 19:30:31ちっとは人に伝わるように努力しろよ
0396393
2007/04/26(木) 19:30:49その次に/fraをいれたい
0397デフォルトの名無しさん
2007/04/26(木) 19:32:500398デフォルトの名無しさん
2007/04/26(木) 19:34:10データ構造がどうなってて、どうしたいのか
0399デフォルトの名無しさん
2007/04/26(木) 19:34:41誰か教えていただけるとありがたいです・・・。
0400デフォルトの名無しさん
2007/04/26(木) 19:36:29sscanf で抜き出してもいいし、固定桁ならstrncpyしてもいいし
1文字ずつ読んで1つ1つコピーしてもいいし
0401デフォルトの名無しさん
2007/04/26(木) 19:41:04ありがとうございます!
がんばってみます。
0402393
2007/04/26(木) 19:42:16表示するときだけ2つ表示させて
プログラム内ではその場所に2つめが入ってるようにしたいんですけど。
japan korea eng
NULL eng/fra bra
NULL NULL arg
でいうとeng/fraと表示させたいけど
s[1][1]の中にはfraがはいってる感じに。
0403デフォルトの名無しさん
2007/04/26(木) 19:44:140404デフォルトの名無しさん
2007/04/26(木) 19:46:34#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 10
int main(void){
char *filename="8桁の数字がタブで区切られながら書いてあるデータ";
FILE *fp;
long array[ARRAY_SIZE];
int i;
fp=fopen(filename, "r");
if(fp==NULL){
fprintf(stderr, "\nError: %s file cannot open.\n", filename);
exit(1);
}
for(i=0;i<ARRAY_SIZE;i++) fscanf(fp, "%ld", &array[i]);
for(i=0;i<ARRAY_SIZE;i++) printf("%3d : %ld\n", i, array[i]);
fclose(fp);
return 0;
}
0405393
2007/04/26(木) 19:48:23やっぱり。
s[1][1]に文字列engがはいってるとする。
この文字列を違う領域にコピーして
次の文字列fraをs[1][1]にいれ
fraをその違う領域にstrcatでつなげてその違う領域を表示
がベストかな?
0406デフォルトの名無しさん
2007/04/26(木) 19:50:18独り言ならよそでやって欲しい。
そうでないなら他人にも理解できる文章を書いてくれ。
0407393
2007/04/26(木) 19:57:49大体できそうだ
プログラムが。
2次元配列2つ使わないといけないのかめんどくさ
0408デフォルトの名無しさん
2007/04/26(木) 20:01:45何をしたいのかさっぱり分からない
0409デフォルトの名無しさん
2007/04/26(木) 20:04:52きみには理解できなくて結構
0410デフォルトの名無しさん
2007/04/26(木) 20:10:06unsigned int b[8];
};
struct a f(void);
int main(void){
int i;
struct a p;
p=f();
for(i=0;i<=7;i++)
if(p.b[i]==1){
printf("?");
}
}
return 0;
}
のようなプログラムで、
構造体の要素の配列bには0か1しかいれないので、
ビットフィールドかビットフラグを使って書き換えたいのですが、
添字が使えないのでfor文が使いにくいです。
どうすればいいでしょうか。
0411デフォルトの名無しさん
2007/04/26(木) 20:13:120412デフォルトの名無しさん
2007/04/26(木) 21:15:12ありがとうございます!
ポインタではなく、二次元配列だったんですね
引き続き頑張ってみます、ありがとうございました
0413デフォルトの名無しさん
2007/04/26(木) 21:41:07お前は理解できたのか?
0414デフォルトの名無しさん
2007/04/26(木) 21:46:21コラ!409=393なんだから触っちゃいけません!!
0415デフォルトの名無しさん
2007/04/26(木) 21:53:13もう見てないかも知れないが、俺は>>389の方法が良いと思うんだがなあ。
表示するときだけ文字列に変換すればいいだけなんだし。内部では 0 〜 51
の数値で扱えば良いじゃん。で、表示の時に printf("%c%d", "SCHD"[n / 4], n % 13);
みたいにする(AJQKも変換したければする)。というか、数値から文字列に
計算して変換する関数を一つ作れば良い。
0〜51で扱うと数値から種類や値を出すのに面倒な計算が必要でデバッグの
時に楽じゃないと思うなら 4 ビットづつに分ければ良い。それなら16進
出力させれば桁で分かれるから分かり易い。
0416デフォルトの名無しさん
2007/04/27(金) 02:02:390417デフォルトの名無しさん
2007/04/27(金) 06:43:29rは毎回書き換えられていてr->nextが作られていないようですが、どこでr->nextを作っていますか?
0418デフォルトの名無しさん
2007/04/27(金) 07:51:58作っていない作っていない。リンクの繋ぎ替えだけで中身を作り直しているわけじゃないよ。
0419デフォルトの名無しさん
2007/04/27(金) 09:08:05シフトして論理積をそのままつかうと表記が長くて汚いので
マクロを使いますがこのように書けば良いでしょうか
#define x(s,t) (((s)>>(t))&1)
0420デフォルトの名無しさん
2007/04/27(金) 09:52:53for (int n = 0; n < 16; ++n)
printf("%c", a & (1<<n) ? 'o':'x');
でいいじゃん。
コンパイラによっては警告が出て嫌なら
(a & (1<<n)) != 0 でいいし、
nの代わりにenumなりの定数にして特定のフラグにすることも出来るし。
0421デフォルトの名無しさん
2007/04/27(金) 10:41:530422デフォルトの名無しさん
2007/04/27(金) 11:19:273つランダムに選ばれた3つの整数a,b,cの和を、人間に求めさせて、計算にかかった時間(秒)を表示するプログラムなんですが、
実行すると、どれだけ計算に時間を使っても「0.0秒」と表示されちゃいます。
以下のようなソースなんですが、どこかおかしいところがあるでしょうか?
ちなみに、Mac OS Xのターミナル & CotEditor を使っています。
教えてエロい人...。
0423422
2007/04/27(金) 11:21:15#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a,b,c; /*加算する数値*/
int x; /*読み込んだ値*/
clock_t start,end; /*開始時刻,終了時刻*/
srand(time(NULL)); /*乱数の種を初期化*/
a = 100+rand()%900; /*100~999の乱数を生成*/
b = 100+rand()%900; /*100~999の乱数を生成*/
c = 100+rand()%900; /*100~999の乱数を生成*/
printf("%d+%d+%dは何ですか?: ",a,b,c);
start=clock(); /*計測開始*/
while (1) {
scanf("%d",&x);
if (x==a+b+c)
break;
printf("\a違いますよ!!\n再入力して下さい: ");
}
end=clock(); /*計測終了*/
printf("%.1f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
return (0);
}
0424デフォルトの名無しさん
2007/04/27(金) 11:24:11exit(0)
}
int main(){
char *c;
c=(char *)calloc(10,sizeof(char));
sample();
free(c);
return 0;
}
上記のように、mainで確保した領域を開放するには、mainの最後にfreeを行うだけでいいのでしょうか?
それとも、exitがある関数にも、引数を参照渡しにして、exitの直前にfreeを行わなければならないのでしょうか?
0425デフォルトの名無しさん
2007/04/27(金) 11:29:21教条主義的に必ず解放したいのならexit()する関数でもfree()するべき
……というよりは、exit()を使わないようにするべき。
0426デフォルトの名無しさん
2007/04/27(金) 11:31:32clock()は環境依存な関数なので、OS Xの該当関数のマニュアルページを見て味噌。
或いは、CLOCK_PER_SECの値も確認して味噌。
それよりは、time()を使って秒単位の計測で済ませる方が入門者にはいいと思うが。
#つーか、某洋は何考えてclock()なんか使ってるんだ?
0427デフォルトの名無しさん
2007/04/27(金) 11:42:35それ、本のままなのか?
典型的なscanf()の使い方の悪い例だぜ・・・
ためしに実行したがWindowsでは経過時間みたいでちゃんと出たが
SolarisでgccだとCPU時間だから0.0しかでないな。
0428422
2007/04/27(金) 12:01:31なるほど。clock()は環境依存な関数なんですね。
Windowsではうまく動作しても、OS Xじゃダメと...。
>>427
本のままのソースでつ。
この本、分かりやすいんだけど、
MacやUnix使用者のことあんまり考えてないのかな...。
0429419
2007/04/27(金) 12:24:39あと、代入式の左辺にしたり、関数にポインタを渡したり
できないのはどうにかできないでしょうか
0430デフォルトの名無しさん
2007/04/27(金) 12:41:08どうか知恵をください。
0431デフォルトの名無しさん
2007/04/27(金) 12:45:08日本語で頼む。
配列とポインタの間にパフォーマンスの違いは無い。
0432デフォルトの名無しさん
2007/04/27(金) 13:06:090433デフォルトの名無しさん
2007/04/27(金) 13:09:06配列かポインタか以前に何をしたくて何を聞きたいのか不明だな。
>>429
凝ったマクロを作るよりも、関数にしておけばデバッグの助けになるし型チェックはコンパイラがやってくれる。
ついでに、代入関数も作ってしまえばいい。
>>428
>MacやUnix使用者のことあんまり考えてないのかな...。
つーか、発想が古いんでしょ。
0434430
2007/04/27(金) 13:28:11ハイビジョンの画像を処理するために、一度読み込んで、回転かけたりしたいんです。
どういう風に読み込んで、どんな形式に納めればいいか教えて欲しいです。
0435デフォルトの名無しさん
2007/04/27(金) 13:35:29・ハイビジョンの画像とはなにか
・何から読むのか
・どう処理したいのか
・処理した結果をどうしたいのか
0436デフォルトの名無しさん
2007/04/27(金) 13:38:04bmpなら構造単純だから直で読み込めるけど
jpgとかpngなら自分でローダ作るよりライブラリ使ったほうが良い。
フォーマットの事書いてないからわからないけど何から読み込むの?
というか前準備として画像処理よりCの勉強した方が…
誤解なら申し訳ないけど文面から察するにポインタを十分に理解してると思えない。
0437デフォルトの名無しさん
2007/04/27(金) 13:39:49たびたびすいません。
画像は1920×1080画素のビットマップです。
これを読み込んで、回転行列をかけたりしたいです。
計算後はビットマップとして書き出したいです。
よろしくお願いします。
0438デフォルトの名無しさん
2007/04/27(金) 13:45:39何も難しいことはない
0439デフォルトの名無しさん
2007/04/27(金) 13:57:05「ビットマップ」のフォーマットを読む適当なライブラリを拾ってきて、その形式にあわせればいいよ。
0440デフォルトの名無しさん
2007/04/27(金) 15:27:29そんなもん自作せんでも ImageMagick とか色々なのが・・・宿題か?
0441デフォルトの名無しさん
2007/04/27(金) 15:54:26read(socket_fp,buf,256*sizeof(char))
ソケットから読み出した文字列はbufに格納されるのですが、
この時、\0文字の扱いはどうなるのでしょうか?
socketの内容をそのままコピーしてくれるのでしょうか?
それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
0442デフォルトの名無しさん
2007/04/27(金) 15:55:49>それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
そんな余計なことはしません。
0443デフォルトの名無しさん
2007/04/27(金) 15:59:54>ソケットから読み出した文字列はbufに格納されるのですが、
>この時、\0文字の扱いはどうなるのでしょうか?
バイト列に文字列なんて概念も無ければ特殊な文字もありません。
>socketの内容をそのままコピーしてくれるのでしょうか?
読み取ったものを読み取ったまま格納します。
>それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
上2点から容易に導けるように、なんら余計なことはしません。
そもそも256バイト読めと言われても読める分しか読みません。
従って戻り値は必ず確認して、不足があるようなら再度呼び出してください。
0444441
2007/04/27(金) 16:06:57ついでにもう2つ質問があるのですが、
ソケットから読み取ったバイト列が256個未満だった場合、
のこりの空きはどうなるのでしょうか?
0で埋められるのでしょうか?
またこのようなシステムコールについて、
OSが異なれば副作用の完了点等の挙動は異なるモノなのでしょうか?
0445デフォルトの名無しさん
2007/04/27(金) 16:27:00>のこりの空きはどうなるのでしょうか?
どうもならない。
>0で埋められるのでしょうか?
だから余計なことはしないんだってば。しつこいな。
>またこのようなシステムコールについて、
>OSが異なれば副作用の完了点等の挙動は異なるモノなのでしょうか?
システムコールに副作用完了点はありません。
呼び出し時の問題なら、コンパイラ依存です。
0446デフォルトの名無しさん
2007/04/27(金) 18:11:46このページの
sigpause(SIGALRM);
は、設定されたタイマーが0秒になるまで全ての処理を停止するってことですか?
また上の方のタイマーの時間を比較するところで
else{
val.it_value=oval.it_value;
oval.it_value.tv_sec=1;
oval.it_value.tv_usec=0;
}
としてるのは再設定されたタイマーの時間が元から設定されていたタイマーの時間より短い場合
元のタイマー設定時間をそのまま流用して、0秒になったら前のタイマーは1秒だけ待つってことですよね
0447デフォルトの名無しさん
2007/04/27(金) 18:39:21勉強するのは勝手なんで止めないけれど、現在のUnixでは押し並べてsigpause()は使用禁止になっているから要注意で。
また、秒単位より細かい精度のsleepをしたいだけなのなら、nanosleep()がある筈だからそれを使うこと。
#nanosleep()がない場合はusleep()で。
0448446
2007/04/27(金) 18:50:42いえ、signal関数の使い方を調べていました
Manpage見てもsigpause使用するなとなっていて詳しい解説なくて
自分の環境では試せないので両方ともいまいちどういうことをしているのか掴めなかったんです
0449デフォルトの名無しさん
2007/04/28(土) 11:12:27と置いたときに、data内にいくつ数値が記憶されてるかカウントする関数ない?
0450デフォルトの名無しさん
2007/04/28(土) 11:16:530451デフォルトの名無しさん
2007/04/28(土) 11:59:44sizeof(data) / sizeof(* data)
0452デフォルトの名無しさん
2007/04/28(土) 14:03:09とかよくやるが
0453446
2007/04/28(土) 15:48:32処理が先に進まないようにwhileを使って、ついでにsigpauseを使うと
引数にしたシグナルが割り込むまでnopのような処理をするってことですかね
0454デフォルトの名無しさん
2007/04/28(土) 17:42:31#include <stdio.h>
int main(void)
{
printf("Hello world\n");
}
エラー E2209 借金大王.c 1: インクルードファイル 'stdio.h' を
オープンできない
というメッセージが出て困ってます。
0455デフォルトの名無しさん
2007/04/28(土) 17:44:370456デフォルトの名無しさん
2007/04/28(土) 18:39:09困っているのですか。
0457デフォルトの名無しさん
2007/04/28(土) 18:46:350458デフォルトの名無しさん
2007/04/29(日) 00:03:02それコンパイラの設定やってないでしょ。
ヘルプみてちゃんと設定して再チャレンジ。
コンパイラをインストールしていない悪寒がするが、、、、。
0459デフォルトの名無しさん
2007/04/29(日) 00:19:21phoebeなんて使ったことないから知らないけれど
0460デフォルトの名無しさん
2007/04/29(日) 00:20:06c=fgetc(stdin);
c=fgetc(stdin);
c=fgetc(stdin);
と記述し、実行時に"a"と入力した場合、最後のcに格納されるのは何なのでしょうか?
fgetcをするごとにprintfをしてみると、改行(?)が表示されたのですが、その様に定義されているのでしょうか?
0461デフォルトの名無しさん
2007/04/29(日) 00:24:44ところで、fgetcの戻り値はcharではなくintだよ。
0462460
2007/04/29(日) 00:40:16考えてみたら、2回目のcに'\n'が格納された後は入力待ちになりますよね。
意味不明なことを質問していました。すみません。
>fgetcの戻り値はcharではなくint
今までずっとcharだと思ってました…
0463デフォルトの名無しさん
2007/04/29(日) 02:48:44さっぱりわかりません・・・
教えていたたけませんでしょうか?
0464デフォルトの名無しさん
2007/04/29(日) 03:04:54多分、それC言語じゃないよ。
0465デフォルトの名無しさん
2007/04/29(日) 03:08:38プラプラ入れ忘れです( ´・ω・)
0466デフォルトの名無しさん
2007/04/29(日) 03:17:320467デフォルトの名無しさん
2007/04/29(日) 03:31:310468デフォルトの名無しさん
2007/04/29(日) 03:42:26ここ、C++のスレじゃないよ。
0469デフォルトの名無しさん
2007/04/29(日) 04:54:20char http_send_text[][] = {if(num && 1){"GET "},if(num && 2){"/ "}};
という感じで、char配列の宣言時に内部で条件分岐使った初期化をさせたいんですけど、
無理っぽいのでしょうか?
ポインタ使って動的にメモリ確保して文字列を格納する方法が一番最初に思い浮かぶのですが、
他に上のような単文で実現できるような上手い方法はありませんか?
コンパイラの機能特有のものでも構いませんので、詳細をおねがいします。
0470デフォルトの名無しさん
2007/04/29(日) 08:25:36あ・・・すいませんでした。
0471デフォルトの名無しさん
2007/04/29(日) 08:25:45なんでも単文にすればいいってもんでもないだろうに。
0472デフォルトの名無しさん
2007/04/29(日) 10:20:35誰かわかる人いたら、教えてください。
0473デフォルトの名無しさん
2007/04/29(日) 10:30:31cの質問なのか?
ジョンソン法の質問なのか?
0474デフォルトの名無しさん
2007/04/29(日) 11:18:04ジョンソン法をCではどのように作ればいいのか、ってことなんですけど。。。
0475デフォルトの名無しさん
2007/04/29(日) 12:23:07赤影
Peercastの配信者。32歳職歴無しニート。
奨学金の返済約620万を返済せずに毎日ネトゲをプレイしPeercastで配信している。
更に自分を批判してる人は無職だと決めつけ、批判より働くことの良さを教えろと言い出す。
こんな屑を許していいのか。許せるはずが無い。
日本学生支援機構に通報しよう。
現行スレ
http://yy33.kakiko.com/test/read.cgi/peercast/1177501343/
他はまとめサイト、ブログを参照
ニートでありながら奨学金の返済もせず出所不明の金で以下の構成のPCを組んでいます
CPU:Intel Core2Duo E4300 (2.61Ghz)
メモリ:Team 1024MB (DDR400)
HDD: Hitachi Western Digital WD2500BB(250GB) Maxtor 6Y120L0(120GB) Seagate ST330621A(30GB) HDT725032VLA36(320GB) 計720GB
グラフィックカード:GeForce 6600GT VRAM 128.0MB
サウンドカード:Sound Blaster Audigy2 Value
キャプチャーカード:SAA7130TVPCI(玄人志向)
ウェブカメラ:Qcam Starter(Logicool)10万画素、アイトーイカメラ30万画素、
Quickcam Communicate STX(Logicool)30万画素,LifeCam NX-6000(Microsoft) 200万画素
テレビ:28F-401S(MITSUBISHI)
0476デフォルトの名無しさん
2007/04/29(日) 14:15:54プログラムをC言語で作りたいのですが、
参考になるサイトとかあれば教えてください。
具体的には、制御したいアプリケーションに対して、
・Alt+Kのようなショートカット入力
・ファイル名を自動でyymmdd形式で入力
を自動で行わせたいです。
0477デフォルトの名無しさん
2007/04/29(日) 14:19:40いくらなんでも漠然としすぎ
何が聞きたいかを整理してから来てくれんか
0478デフォルトの名無しさん
2007/04/29(日) 15:00:44コンパイル時にエラーとする方法はないでしょうか?
ソースコードa.cppにSHORT i;
ソースコードb.cppにINT i;
と宣言した場合、コンパイル時にエラーを出力といった具合です。
0479デフォルトの名無しさん
2007/04/29(日) 15:13:11それを同時にインクルードするソースがあればエラーになる。
そうでなければ、リンク時にしかエラーは出ない。
0480デフォルトの名無しさん
2007/04/29(日) 15:14:14シングルトンパターン使おうぜ。
0481デフォルトの名無しさん
2007/04/29(日) 15:31:04>>474はそのプログラムを作って欲しいんじゃないの?w
0482デフォルトの名無しさん
2007/04/29(日) 16:29:29elseが悪いらしいんでけどさっぱり
教えてください。
#include<stdio.h>
int main(void)
{
int a,b,c;
prrintf("A="); scanf("%d",&a);
prrintf("B="); scanf("%d",&b);
if(a > b)
a = a * 2;
b = b * 2;
printf("A=%d B=%d",a,b);
else if(a < b)
c = a;
a = b;
b = c;
printf("A=%d B=%d",a,b);
else
printf("A=%d B=%d",a,b);
return(0);
}
0483デフォルトの名無しさん
2007/04/29(日) 16:33:19誰か、ジョンソン法作ってあげなよw
0484デフォルトの名無しさん
2007/04/29(日) 16:50:55elseが悪いらしいので
elseを直してください
0485デフォルトの名無しさん
2007/04/29(日) 17:15:05は現状こうなってる。
...
if(a > b) {
a = a * 2;
}
b = b * 2;
printf("A=%d B=%d",a,b);
else if(a < b) {
c = a;
}
a = b;
b = c;
printf("A=%d B=%d",a,b);
else {
printf("A=%d B=%d",a,b);
}
...
0487デフォルトの名無しさん
2007/04/29(日) 17:30:23なんとなく分かったような
分からないような。。
0488デフォルトの名無しさん
2007/04/29(日) 17:44:050489デフォルトの名無しさん
2007/04/29(日) 17:47:36単純なミスだったようです
ありがとうございました。
0490デフォルトの名無しさん
2007/04/29(日) 21:04:45接続先のホストネームしか知らない場合、
どのように相手先のIPアドレスを得れば良いのでしょうか?
具体的にはどのような関数を使えばいいのでしょうか?
0491デフォルトの名無しさん
2007/04/29(日) 21:10:55gethostbyname
0492デフォルトの名無しさん
2007/04/29(日) 21:31:240493デフォルトの名無しさん
2007/04/29(日) 21:37:280494デフォルトの名無しさん
2007/04/29(日) 23:39:200495デフォルトの名無しさん
2007/04/30(月) 02:14:08鯖のIPアドレス覚えられん
0496デフォルトの名無しさん
2007/04/30(月) 02:16:28あんたにとって必要か不必要かで、全世界レベルの規格や規定を覆すことは出来ないのさ・・・
0497デフォルトの名無しさん
2007/04/30(月) 02:22:53でも実際にぜんぜん普及してないじゃん
Sunあたりがすべてのマシンをネットに繋げと叫ばない限りあと30年くらいIPv4でもおk
0498デフォルトの名無しさん
2007/04/30(月) 02:25:16徐々に移行しないと、俺らも困る羽目になるぞ。
0499デフォルトの名無しさん
2007/04/30(月) 02:43:58不足して大混乱になったあげくに「こんなこともあろうかと」と
いいつつIPv6が出てきて段々と混乱が収束ってパターンじゃないのかなあ。
0500デフォルトの名無しさん
2007/04/30(月) 02:48:27当たり前じゃん。っつーかお前無知だな。知ったかぶったり自分都合で考えない方が良いぞ。
不足すると分かっているから32bitから増やしてんだがw
そもそも32bitで約43億通りだろ?実際にはそれだけ固有のものは出来ないが
地球上の人口とユーザを考えたら絶対に今世紀中に不足するよ。
http://ja.wikipedia.org/wiki/IPv6
0501デフォルトの名無しさん
2007/04/30(月) 02:58:58vistaって、v6対応でしょ?
ISPの機材の変更に金がかかるらしいけど、あと10年かからんで移行しそうな気が。
0502デフォルトの名無しさん
2007/04/30(月) 03:11:120503デフォルトの名無しさん
2007/04/30(月) 03:29:22どうしたらいいでしょうか?
どこかにリストを作っておいて開放作業が必要なリソースを登録しておき、
最後になったらリストを参照して開放させるで良いでしょうか?
この他にみなさんおオススメの方法はありませんか?
0504デフォルトの名無しさん
2007/04/30(月) 06:40:12それでいいと思うよ
その一括開放作業をさせたいメモリを確保する関数に登録作業も行わせればok
0505デフォルトの名無しさん
2007/04/30(月) 11:59:29実行ファイルは生成されるのにコアダンプすることがあるんですが
なぜなのでしょうか?
結構調べたんですがよくわかりませんでした--;
↓だと動くんですが
ld -o a.out /usr/lib/crt1.o /usr/lib/crti.o /usr/ccs/lib/values-Xa.o\
/usr/local/lib/gcc/i386-pc-solaris2.10/3.4.6/crtbegin.o main.o sub.o\
/usr/local/lib/gcc/i386-pc-solaris2.10/3.4.6/crtend.o /usr/lib/crtn.o -lc
0506デフォルトの名無しさん
2007/04/30(月) 12:52:41[test]
って文字列から
testだけ抜き出したいんですけどどうすればいいんでしょうか?
sscanf( "[test]" , "[%s]" , str );
と書いても test] が抜き出されるんです。
0507デフォルトの名無しさん
2007/04/30(月) 12:55:43sscanf( "[test]" , "[%[^]\n]]" , str );
うーんマンダム
0508デフォルトの名無しさん
2007/04/30(月) 13:05:43[test\n
までひろっちまう
0509デフォルトの名無しさん
2007/04/30(月) 13:06:230510デフォルトの名無しさん
2007/04/30(月) 16:18:49関数名が同じものがどこかに含まれてない?
リンクの順番を変えると有効になる関数が交換して、
結果として変なことになるよ。
たとえばパラメータにポインタを期待している関数に
整数を渡したら惨事が起こるでしょ。それと同じことがおきているんじゃないの。
0511デフォルトの名無しさん
2007/04/30(月) 18:47:57同じ名前の関数が複数箇所に入ってるんじゃね?
0512デフォルトの名無しさん
2007/04/30(月) 19:17:17お前も無知だな
0513デフォルトの名無しさん
2007/04/30(月) 20:36:35C言語で可能でしょうか?
また、可能な場合に具体的にはどのような処理を行うのでしょうか?
0514デフォルトの名無しさん
2007/04/30(月) 20:43:19再配置は不可能だから。
0515505
2007/04/30(月) 21:19:16>>511
そんな気がしてきました。
↓見てるんですが、言われてみれば確かに同じ関数っぽいのが複数ファイルにありますね
ttp://www.globe.to/~oka326/archive/elf_doc_sgml_ja/elf_doc-3.html
0516デフォルトの名無しさん
2007/04/30(月) 21:26:24再配置型GCでも実装すれば
0517デフォルトの名無しさん
2007/04/30(月) 22:41:53自分でいじれる部分なら、バッティングしている関数をstaticに
して回避できるけど、いじれなかったり、他のファイルから呼ん
でたら無理だな。
0518513
2007/04/30(月) 23:27:09格納する対象がどのくらいの大きさになるか、
またどのくらいの数量の処理になるのか予測できない状態なので、
各処理単位に動的にメモリを確保させて使わせるように考えています。
この場合は元になるプロセスでメモリのリロケーションとか
行わなければならないのでしょうか?
一番簡単にメモリ管理を行う方法は他にありませんか?
0519デフォルトの名無しさん
2007/04/30(月) 23:28:380520デフォルトの名無しさん
2007/04/30(月) 23:31:400521デフォルトの名無しさん
2007/05/01(火) 00:54:50#define MAX 1000000
int main(void)
{
int a[MAX],i;
printf("実行されました\n");
return 0;
}
上記のプログラムについてですが、MAXの0を1つ消して10万にすると実行されますが
100万にすると自分の環境では実行されませんでした。使用しているのはBCCで
OSはWinXPです。配列の要素に上限ってありますか?
0522デフォルトの名無しさん
2007/05/01(火) 00:57:080523デフォルトの名無しさん
2007/05/01(火) 00:58:34static int a[MAX];
にするか、コンパイラのオプションでスタックサイズを大きくするか。
0524デフォルトの名無しさん
2007/05/01(火) 01:00:01ご意見、ありがとうございます。それについて調べてきます。
0525デフォルトの名無しさん
2007/05/01(火) 01:05:20あるためにこの領域はスタック上に確保されることになる。ということでリンカオプションで
これ以上の値をスタックサイズに指定していれば実行可能になる。しかしこのように
大きい領域を必要とする場合はmallocでヒープから取得して使用するのがフツー。
0526デフォルトの名無しさん
2007/05/01(火) 01:06:550527デフォルトの名無しさん
2007/05/01(火) 01:08:19それを防ぐには、イメージそのものをなることはできないのだ。
少なくとも今の技術では無理だ。
0528デフォルトの名無しさん
2007/05/01(火) 01:11:540529デフォルトの名無しさん
2007/05/01(火) 01:17:19抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
0530デフォルトの名無しさん
2007/05/01(火) 01:36:58> 小振りながら彼女の肢体はしなやかに、
まで読んだ。
0531デフォルトの名無しさん
2007/05/01(火) 01:49:02部長からラブコメ禁止令くらって後半2割くらい検閲削除されたことがある。
0532デフォルトの名無しさん
2007/05/01(火) 01:53:49ラブコメってどうせ男同士だったりすんじゃねぇのか?
検閲削除で、正解だ。部長、GJ!
0533デフォルトの名無しさん
2007/05/01(火) 01:58:30対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
0534デフォルトの名無しさん
2007/05/01(火) 02:58:54Accept: */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: jun.2chan.net
Connection: Keep-Alive
0535デフォルトの名無しさん
2007/05/01(火) 04:00:07そんなんできんの?と実行したら本当にできた
600行ぐらいだったが感動した
どれぐらい勉強すればこんなの作れるようになるの
0536デフォルトの名無しさん
2007/05/01(火) 04:12:13それなりの初心者にも簡単に作れるかと。
0537534
2007/05/01(火) 04:56:01TCPソケットで簡易ブラウザを作ってる者ですが、
jpegをhttpプロトコルでダウンロードし、ヘッダとボディ部に分ける所まで出来ました。
ここで質問があるのですが、httpプロトコルのボディ部はそのままjpegフォーマットになっているのでしょうか?
手を加えなくても表示させたり、ディスクに保存できるのでしょうか?
転送コーデックが設定されていた場合、C言語でつかえるライブラリなどはありませんか?
0538デフォルトの名無しさん
2007/05/01(火) 05:13:200539デフォルトの名無しさん
2007/05/01(火) 05:27:26基本的には >>538 です。
簡単に言うと、ボディ部がそのまま JPEG にできることもあるし、gzip
で圧縮されていることもあるし、chunked encoding になってて途中に
何かが挟まってることもある。そういうのをヘッダで判断する。
0540gost
2007/05/01(火) 13:47:01>> 4の倍数で無ければ、"n is not ROUND(4)" を出力するプログラムを教えてください
0541デフォルトの名無しさん
2007/05/01(火) 13:50:53void main (void)
{
int kaz,cnt;
char hantei;
printf("数字を入力\n");
scanf("%d",&kaz);
printf("計算する?(Y/N)\n");
scanf("%c",&hantei);
if(hantei=Y){
for(cnt=0;cnt<5;cnt++){
kaz=kaz*kaz;
}
printf("計算結果:%d");
}
else
{
printf("入力結果:%d");
}
}
どうしてもあと一つ、エラーが出てしまう。
if文の最初のところがおかしいのではないかと・・・
エラー E2451 sukyanf.c 12: 未定義のシンボル Y(関数 main )
0542デフォルトの名無しさん
2007/05/01(火) 13:52:57○ if(hantei='Y'){
シングルクォートでかこまにゃ
0543デフォルトの名無しさん
2007/05/01(火) 13:54:53まるちうざい
0544デフォルトの名無しさん
2007/05/01(火) 13:54:560545デフォルトの名無しさん
2007/05/01(火) 13:56:42しかし、判定の前に結果が出てしまう
0546デフォルトの名無しさん
2007/05/01(火) 14:07:30scanf()が%dで数字を変換したあとに食い残した改行文字を、
次のscanf()が食っちまうから。
0547デフォルトの名無しさん
2007/05/01(火) 14:09:08だっけ?
0548デフォルトの名無しさん
2007/05/01(火) 14:26:25printf("計算結果:%d");
いったい何を出力させるつもりだ?
0549デフォルトの名無しさん
2007/05/01(火) 14:36:29scanf("%d",&kaz);
fflush(stdin);
0550デフォルトの名無しさん
2007/05/01(火) 14:38:430551デフォルトの名無しさん
2007/05/01(火) 14:39:17言いたいことがあるならはっきり言え
0552デフォルトの名無しさん
2007/05/01(火) 14:39:200553デフォルトの名無しさん
2007/05/01(火) 14:42:38何か問題でも?これといってgetsみたいな報告はされてないが?
http://www.google.co.jp/search?q=fflush&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
0554デフォルトの名無しさん
2007/05/01(火) 14:44:09問題はないよ。何の足しにもならない環境があるだけで。
0555デフォルトの名無しさん
2007/05/01(火) 14:45:03だったらその 環境 をあげてみたら?古いものだったら却下な。
逐一古い発展途上のものを使ってたらやってられない業界だから
0556デフォルトの名無しさん
2007/05/01(火) 14:45:06環境依存だってことだろ。
0557デフォルトの名無しさん
2007/05/01(火) 14:46:17ごちゃごちゃうるせーんだよ、実例を挙げないバカほどうぜぇ役立たずなクズはいねーもんだなぁをいっw
0558デフォルトの名無しさん
2007/05/01(火) 14:46:32Cygwinはフラッシュきかなかったよ。
0559デフォルトの名無しさん
2007/05/01(火) 14:46:34fflushは出力ストリーム用だ
0560こいつら無知のくせしてだめなことしか覚えないバカwwww
2007/05/01(火) 14:47:03標準入力のフラッシュは・・・
554 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:44:09
>>553
問題はないよ。何の足しにもならない環境があるだけで。
556 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:45:06
>>553
環境依存だってことだろ。
こ と だ ろ ? その証拠を提示してくれ。勝手にそういうことにしないでくれよw
0561デフォルトの名無しさん
2007/05/01(火) 14:47:42だいたい、どういう意図で、その位置にfflush()入れてるのか分からない。
0562デフォルトの名無しさん
2007/05/01(火) 14:47:51入力バッファをクリアする標準的な手段は無いよ
0563デフォルトの名無しさん
2007/05/01(火) 14:50:13scanf()使ってると、クリアもいろいろ面倒な部分があるけど。
0564デフォルトの名無しさん
2007/05/01(火) 14:52:530565デフォルトの名無しさん
2007/05/01(火) 15:04:32#include <ctype.h>
int gtc(void) {
int ch;
while( isspace(ch=getchar()) && ch!=EOF );
return ch;
}
scanf("%d",&kaz);
printf("計算する?(Y/N)\n");
ch=gtc();
if(ch=='Y' || ch=='y'){
0566デフォルトの名無しさん
2007/05/01(火) 15:05:200567デフォルトの名無しさん
2007/05/01(火) 15:09:20kaz=kaz*kaz;
っつーか、この計算って、2を入力してcnt<4にしたら値は表示されたけど
それ以上になると2^32を超えてダメなんじゃね?
0568デフォルトの名無しさん
2007/05/01(火) 15:21:49数字[改行]した場合有効だが、余計なことをするとやはり使えないから。
要するにscanf("%d",&kaz);のところも変えるべきだな
0569デフォルトの名無しさん
2007/05/01(火) 15:26:020570デフォルトの名無しさん
2007/05/01(火) 16:05:290571デフォルトの名無しさん
2007/05/01(火) 16:15:160572デフォルトの名無しさん
2007/05/01(火) 16:36:02そういう場合はその環境では出来ないことは出来ないで通すハメになるんだが?
そんなもののために詰まらん手間や時間のロスがあって済むならやれば良い
0573デフォルトの名無しさん
2007/05/01(火) 16:46:20以上。
0574デフォルトの名無しさん
2007/05/01(火) 16:47:010575デフォルトの名無しさん
2007/05/01(火) 17:08:25だったら実装されているもので使えるものを使って対処する、そんなもんだろ?
出来ないなら出来ないなりに頭を使えYO!
>>565みたく実装されている範囲内で自分で作って実装とかな
0576デフォルトの名無しさん
2007/05/01(火) 17:19:46そうでないところで動かす必要性が出た場合に混乱するということ。
その知識を持っておくに越したことは無い。
0577デフォルトの名無しさん
2007/05/01(火) 17:24:11実装されている範囲内で用意しようってことなんだが?出来ないものは出来ない
たとえそれが新しくても。だから幅広く共通するものを使う、そうだろ?
0578デフォルトの名無しさん
2007/05/01(火) 17:25:110579デフォルトの名無しさん
2007/05/01(火) 17:34:51限られた範囲内でしか使わない事が確定してる場合は
処理速度とか確実性とかの高いものを採用するのは悪い事ではない。
0580デフォルトの名無しさん
2007/05/01(火) 17:43:12初心者に注意書きなしで変なことを教えなければ大丈夫だろ。
0581デフォルトの名無しさん
2007/05/01(火) 17:48:00fflush(stdin)とかrewind(stdin)とか、ちょっとコードが短くなるけどさ。
0582デフォルトの名無しさん
2007/05/01(火) 17:50:020583デフォルトの名無しさん
2007/05/01(火) 18:07:40画面に「もう一度最初から打ち直してください」って出るようにしたらいいんじゃね?
0584デフォルトの名無しさん
2007/05/01(火) 18:10:480585デフォルトの名無しさん
2007/05/01(火) 18:11:170586デフォルトの名無しさん
2007/05/01(火) 18:33:48これじゃダメかい?
0587デフォルトの名無しさん
2007/05/01(火) 19:05:20とかやっちゃう俺チキン
0588デフォルトの名無しさん
2007/05/01(火) 19:10:23最初の一文字だけ getchar して、
それが改行かどうか注意しつつ fgets していくことになるのか?
0589デフォルトの名無しさん
2007/05/01(火) 20:10:18EOFもみないと。
0590デフォルトの名無しさん
2007/05/01(火) 21:28:03入門篇なのにぜんぜんついていけないorz
マジで入門なんですかね?
0591デフォルトの名無しさん
2007/05/01(火) 21:32:16http://pc11.2ch.net/test/read.cgi/tech/1175137007/
こっちへくれば、きっとナイスガイな 33 が手と足取り教えてくれるぞw
0592デフォルトの名無しさん
2007/05/01(火) 21:44:57fflush(stdin);
はダメって話はよくきくんだが。
0593デフォルトの名無しさん
2007/05/01(火) 21:59:560594デフォルトの名無しさん
2007/05/01(火) 22:26:46foo.cにはfunc1()とfunc2()が含まれていて、
#include "foo.c"
とすることで、bar.cのmainからfunc1()を呼び出したい。
void func1()
{
…
func2(); ・・・・(a)
…
}
のような中身だとして、
func2の挙動だけ変更したい。
ただし、foo.c自体は改変してはいけないとします。
0595594
2007/05/01(火) 22:27:22bar.cの中で、
#define func1 func1_org
#include "foo.c"
#undef func1
void func2()
{
…
}
void main()
{
func1();
}
のようにしたんだけども、
(a)のところもfunc2_org()に置き換わってしまうので、
元と同じ挙動になってしまう。
foo.cを書き換えずにfunc2()の中身だけ変更することは可能ですか?
0596デフォルトの名無しさん
2007/05/01(火) 22:28:040597デフォルトの名無しさん
2007/05/01(火) 22:28:54本家よりはマシなんじゃないのか?
0598デフォルトの名無しさん
2007/05/01(火) 22:29:58微妙。
0599デフォルトの名無しさん
2007/05/01(火) 22:31:34#define func2() func2_org()
#include "foo.c"
#undef func2
void func2_org() { ... }
でいけると思う。
func2() という関数とマクロが両方ある場合は、
func2() はマクロの (func2)() が関数の呼び出しになる。
0600594
2007/05/01(火) 22:33:20いや、こんなことするの自分でも初めてなんですが、
foo.cのほうは変なライセンスなので弄ってはいけない。
だけど、そこにある関数を部分的に使用したいんです。
0601デフォルトの名無しさん
2007/05/01(火) 22:37:52あれ、入力吐き捨てるだけでも必要?
どうでもいいけど^Zの後に入力を続けちゃうと入力待ちのままになるのね…
0603デフォルトの名無しさん
2007/05/01(火) 22:46:270604594
2007/05/01(火) 22:46:41>#define func1 func1_org
>#include "foo.c"
>#undef func1
ここ書き間違いでした。
#define func2 func2_org
#include "foo.c"
#undef func2
0605594
2007/05/01(火) 22:52:46foo.c:2292: error: previous definition of 'func2_org' was here
のようになってしまいます。
0606デフォルトの名無しさん
2007/05/01(火) 23:04:46決定版って、普通に読み捨てればいいだけじゃん。
0607デフォルトの名無しさん
2007/05/02(水) 00:08:37scanf("%*[^\n]%*c");
これでいいだろ
0608デフォルトの名無しさん
2007/05/02(水) 00:40:38bar.c で foo.c をインクルードしてるのに
何で foo.c をまた単独でコンパイルしてるんだぜ?
0609デフォルトの名無しさん
2007/05/02(水) 00:51:42どうしても「1から〜までの」の数の表示が0になってしまいます。 (「合計は〜です」は正常に作動)
(例:10を入力→「1から0までの合計は55です」)
よろしくお願いします。
#include <stdio.h>
void main(void)
{
int total; /*合計*/
int n; /*入力数*/
scanf("%d", &n);
total = 0;
while(n > 0){
total = total + n;
n = n - 1;
}
printf("1から%dまでの合計は%dです\n", n, total);
}
0610デフォルトの名無しさん
2007/05/02(水) 00:53:170611デフォルトの名無しさん
2007/05/02(水) 00:54:31が偽になった時点でどう考えてもnは0以下
0612デフォルトの名無しさん
2007/05/02(水) 00:54:40どこまでの事を使っていいのか分からない
0613609
2007/05/02(水) 00:55:56お騒がせしました。
0614デフォルトの名無しさん
2007/05/02(水) 00:58:320615デフォルトの名無しさん
2007/05/02(水) 00:59:32氏んでいいぞ
0616デフォルトの名無しさん
2007/05/02(水) 01:57:32もちつけw
なんてたってゴールデンウィークだからな
まあそんなオレは新入社員がぶっ壊した鯖2つを復旧中で休みなし
なんで新入社員に鯖管やらせるんだよ
0617デフォルトの名無しさん
2007/05/02(水) 01:58:320618デフォルトの名無しさん
2007/05/02(水) 02:03:22人の宿題をやってあげるときは
ソースを全角で書け
0619デフォルトの名無しさん
2007/05/02(水) 02:50:080620デフォルトの名無しさん
2007/05/02(水) 03:43:270621デフォルトの名無しさん
2007/05/02(水) 03:53:440622デフォルトの名無しさん
2007/05/02(水) 04:02:010623デフォルトの名無しさん
2007/05/02(水) 04:12:530624デフォルトの名無しさん
2007/05/02(水) 09:06:05勉三さんがつんつるてん!(壊れたコロスケ風に)
0625デフォルトの名無しさん
2007/05/02(水) 10:26:430626デフォルトの名無しさん
2007/05/02(水) 10:57:33int main ()
{
char *gyaku (char *a) ;
char *string ;
string = "taro" ;
printf ("%s\n", gyaku(string)) ;
return (0) ;
}
char *gyaku (char *a)
{
char *b ;
*b = *(a+3) ;
*(b+1) = *(a+2) ;
*(b+2) = *(a+1) ;
*(b+3) = *a ;
*(b+4) = '\0';
return (b) ;
}
taroをoratにしたいんですけどうまくいかないです。
だれかたすけてください。
0627デフォルトの名無しさん
2007/05/02(水) 11:04:27{
static char b[5];
b[0] = a[3];
b[1] = a[2];
b[2] = a[1];
b[3] = a[0];
b[4] = '\0';
return b
}
0628デフォルトの名無しさん
2007/05/02(水) 11:06:39文字列リテラルは初期化の時しか使っちゃらめぇ…
プロトタイプ宣言をmainに入れちゃらめぇ…
0629デフォルトの名無しさん
2007/05/02(水) 11:06:46ありがとうございます。
ポインタを戻り値にはできないのでしょうか??
0630デフォルトの名無しさん
2007/05/02(水) 11:07:43つっこみどころはいろいろあるが根本的にまずいのは
ローカルの自動変数のポインタを返すのがまずい。
渡された配列の内容が変わってもいいのならaを直接
いじればいいのでは?
0631デフォルトの名無しさん
2007/05/02(水) 11:07:49関数gyakuの戻り値の型はchar*で、間違いなくポインタだが。
0632デフォルトの名無しさん
2007/05/02(水) 11:15:21ここだけ的外れ。
0633デフォルトの名無しさん
2007/05/02(水) 11:16:44>ローカルの自動変数のポインタを返すのがまずい。
これは別にいいのよ。Cは値渡しだから。
0634デフォルトの名無しさん
2007/05/02(水) 11:18:43#include <stdlib.h>
char* gyaku (char *a,int size) ;
int main ()
{
char *string ;
char *b;
string = "taro" ;
b=gyaku(string,4);
printf("%s",b);
free(b);
return (0) ;
}
char* gyaku (char *a,int size)
{
char *b = (char*)malloc(size+1);
for(int i=0;i<size;i++){
b[i] = a[size-(i+1)];
}
b[size] = '\0';
return b;
}
0636デフォルトの名無しさん
2007/05/02(水) 11:28:26文字列なんだから、strlen使えばいいだろと思う。
0637デフォルトの名無しさん
2007/05/02(水) 11:30:58みなさんありがとうございます。
勉強続けてみます。
0638デフォルトの名無しさん
2007/05/02(水) 11:31:010639デフォルトの名無しさん
2007/05/02(水) 11:34:53ああ、ごめ。配列と勘違いしてた。
話は変わってプロトタイプ宣言をmainの中でしてもいいでしょ。ふつうはしないけどね。
0640デフォルトの名無しさん
2007/05/02(水) 11:35:34#include <stdio.h>
int main ()
{
char *gyaku (char *a) ;
char string[] = "taro";
printf ("%s\n", gyaku(string)) ;
return 0;
}
char *gyaku (char *a)
{
char *head, *tail;
char tmp;
head = tail = a;
while (*tail != '\0'){
tail++;
}
tail--;
while (head < tail) {
tmp = *head;
*head = *tail;
*tail = tmp;
head++;
tail--;
}
return a ;
}
0641デフォルトの名無しさん
2007/05/02(水) 11:36:58プロトタイプ宣言が有効となるスコープが main() 内のみ ってやつか
あんまり見ないねー
0642デフォルトの名無しさん
2007/05/02(水) 11:43:31翻訳単位の残りの部分ずっとその宣言が有効になる独自拡張を施した処理系は結構ある。
0643デフォルトの名無しさん
2007/05/02(水) 12:31:06入門書に出てきたんですが、利用する状況をイメージできませんでした。
0644デフォルトの名無しさん
2007/05/02(水) 12:36:17struct Data
{
enum Type type;
union {
int integer;
double real;
} d;
};
例えばこうして時と場合に応じて整数と実数のどちらの形でも保持できるデータ構造とか
0645デフォルトの名無しさん
2007/05/02(水) 13:14:09プロトタイプ宣言を関数ブロックの先頭に書いておいたソースが、新しい
gcc でコンパイルエラーになってびっくりしたのを思い出した。
(外に出したら出来たけど、うーむ・・・)
0646デフォルトの名無しさん
2007/05/02(水) 13:16:22main() だとまずないけど、2つの関数を呼び合って再帰させる
ようなのだと書くこともある。
0647デフォルトの名無しさん
2007/05/02(水) 14:30:27*(b+1)って書いてるけど
その分のメモリーを確保してないでしょ
char * b;でchar型のメモリーアドレスを保持するメモリーを1つ確保しただけだから
0648デフォルトの名無しさん
2007/05/02(水) 14:33:20で、>>642,645 のような処理系で跳ねられることもありうると…
プロトタイプ宣言の有効範囲をスコープで制御するのはマイナーな部類なんかな
0649デフォルトの名無しさん
2007/05/02(水) 14:46:300650デフォルトの名無しさん
2007/05/02(水) 14:47:20普通はライブラリに丸投げすりゃ良いことだけど
例えば自分でTCPプロトコル叩きたいとかって場合に
共用体使うことでTCPヘッダのパースを行うなんてやり方もある
0651デフォルトの名無しさん
2007/05/02(水) 15:02:35#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
FILE *file1;
FILE *file2;
char drag[255];
int cnta,cnti;
cnti=0;cnta=0;
while(*(argv[1]+cnta)){
if(*(argv[1]+cnta)=='\\'){inp[cnti]='\\';cnti++;inp[cnti]='\\';}
else {inp[cnti]=*(argv[1]+cnta);}
cnti++;cnta++;}
inp[cnti]='\0';
file1 = fopen(drag, "rb");
file2 = fopen("test.txt", "w");
/*ファイル変換処理は省略*/
fclose(file1);
fclose(file2);
return 0;}
ドラッグ対応のファイルコンバータを作りたいのですが、
exeファイルに任意ファイルをドラッグして実行⇒txt生成せず←これがやりたい!のですがどうすればいいのでしょうか。
コマンドプロンプト窓にexeファイル名とスペースを入力後任意のファイルをドラッグして実行⇒txt生成となります。
0652デフォルトの名無しさん
2007/05/02(水) 15:11:18#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
FILE *file1;
FILE *file2;
char inp[255];
int cnta,cnti;
cnti=0;cnta=0;
while(*(argv[1]+cnta)){
if(*(argv[1]+cnta)=='\\'){inp[cnti]='\\';cnti++;inp[cnti]='\\';}
else {inp[cnti]=*(argv[1]+cnta);}
cnti++;cnta++;}
inp[cnti]='\0';
file1 = fopen(inp, "rb");
file2 = fopen("test.txt", "w");
/*ファイル変換処理は省略*/
fclose(file1);
fclose(file2);
return 0;}
0653デフォルトの名無しさん
2007/05/02(水) 15:16:21そのサイトには「できない」と書いてあるようだが。
0654デフォルトの名無しさん
2007/05/02(水) 15:24:05デバッグしてください。
デバッガで変数の値を見ながらステップ実行するとか、要所要所でprintfするとかで、
どこまで思った通りに動いているのか確認しましょう。
そのwhileは\を\\に変換してるようだけど、そんなことしなくていいよ。
0655デフォルトの名無しさん
2007/05/02(水) 15:25:26Win32APIじゃないんだからわざわざ\を\\にしなくていい
0656デフォルトの名無しさん
2007/05/02(水) 15:27:41>>651
問題があるようなら、その生成したファイル名(inp)を出力してみましょう。
0657652
2007/05/02(水) 15:41:33できない、ことをやっているのか、それも問題ですね。
拾い読みのみでなんとかしようとしてるど素人なので時間はかかりますが
アドバイス試していこうと思います。
コマンドプロンプトとかかなり無縁そうな人に多少の需要があるようなので、なるべく簡単なUIにしたいんですよね。
0658652
2007/05/02(水) 15:53:52printf("%s\n",inp);
fflush(stdin);
getchar();
(やめたほうがいいんでしょうか)だと
C:\\Documents and Settings\\All Users\\デスクトップ\\Norton AntiVirus 2003.lnk
と意図した結果にはなりました
0659デフォルトの名無しさん
2007/05/02(水) 16:02:450660デフォルトの名無しさん
2007/05/02(水) 16:15:14既にstdinに何かあった場合用じゃね?
まぁそもそも入力ストリームに対するfflushの動作は未定義なんだが
0661デフォルトの名無しさん
2007/05/02(水) 16:15:390662デフォルトの名無しさん
2007/05/02(水) 16:17:55もとのページ見たら、なんの意味も無く入れてあるぞ。
0663デフォルトの名無しさん
2007/05/02(水) 16:21:310664デフォルトの名無しさん
2007/05/02(水) 16:30:27要求されているわけでもないのにディレクトリ区切り文字が\\になっているわけで、
>654や>655が指摘している通りその余計な処理が原因だと言うことがよく判るね。
結論:fopen()に渡す文字列はバックスラッシュをダブらせる必要は無い。
0665デフォルトの名無しさん
2007/05/02(水) 16:59:28それ直してもexeにファイルをドラッグしたら出来ない。
コマンドからだとおk。
試しにfcloseでtest.txtへの書き込みを終えてから、
test.txtをfopenして中身を取り出してみたら出来た。
しかしプログラムが終わったあとtest.txtはどこにもなかった。
何故だろう・・・
0666デフォルトの名無しさん
2007/05/02(水) 17:05:020667デフォルトの名無しさん
2007/05/02(水) 17:05:03その実行モジュールのワークディレクトリを指定していないから、デフォルトのワークディレクトリに書かれているんじゃね?
#もしかして、My Documentsとかか?w
0668デフォルトの名無しさん
2007/05/02(水) 17:07:37それを考えて今ローカルディスク全体に検索かけてます。
0669652
2007/05/02(水) 17:25:41FILE *file1;
file1 = fopen(argv[1], "rb");
ファイルにドラッグした挙動は×、プロンプト窓にドラッグは○、でした
printf("%s\n",argv[1]);
ファイルにドラッグした挙動は○、プロンプト窓にドラッグは○
なのでなぜかなと思っていたところ次のサイトを教わったので置換をしてみたんです。
ttp://www.ipa.go.jp/security/awareness/vendor/programming/b08_01_main.html
0670デフォルトの名無しさん
2007/05/02(水) 17:34:09"%s\n"では末尾に空白(や改行などの制御文字)がついていても見えないから、"[%s]\n"などとしてみるといいよ。
#この場合がそれかどうかは知らんが。
0671?
2007/05/02(水) 18:42:10っていう内容の課題がでてるんですけど
まだ初心者レベルなんでわかりません;
教えてください!!
0672デフォルトの名無しさん
2007/05/02(水) 18:46:42float n[1000],heikin=0,hensa;
int i;
for(i=0;i<1000;i++){
scanf("%f",n[i]);
heikin+=n[i];
}
heikin/=1000;//←heikinに平均が入る
偏差ってどうやって出すんだっけ?
平均との差の二乗を、どうのこうのってやるんだよな、確か。
0673668
2007/05/02(水) 19:00:11#include <string.h>
int main(int argc, char *argv[]){
FILE *file1;
FILE *file2;
char inp[255];
if(argc > 1){
file1 = fopen(argv[1], "rb");
if(!file1)return 0;
strcpy(inp,argv[0]);
for(int i=strlen(inp)-1 ;i>=0;i--){
if(inp[i] == '\\')
break;
else
inp[i] = '\0';
}
strcat(inp,"test.txt");
file2 = fopen(inp, "w");
if(!file2)return -1;
//ここ適当↓
while( (fgets(inp,sizeof(inp),file1)) ){
fprintf(file2,inp);
}
fclose(file1);fclose(file2);
}
else{
printf("引数が足らん");
}
return 0;
}
結局ディスクを検索しても出てこなかったので、argv[0]のパスからexeのディレクトリを取り出して出力してみた。
変数とかファイル出力は適当。一応これでドラッグ&ドロップでファイル作れた。
0674?
2007/05/02(水) 19:06:43まだ基本的なことしかしてないのにこんな難しいやり方の課題を出されてたんですね↓
びっくりです;
0675デフォルトの名無しさん
2007/05/02(水) 19:13:05問題の方は1000個固定じゃなくて、最大1000個なんだろうけど。
0676デフォルトの名無しさん
2007/05/02(水) 19:13:100677デフォルトの名無しさん
2007/05/02(水) 19:13:380678デフォルトの名無しさん
2007/05/02(水) 19:14:23あと、>>673 は別の話題だからな
0679デフォルトの名無しさん
2007/05/02(水) 19:16:57[2] 問題文(含コード&リンク):
1000個までの、整数あるいは少数を打ち込んで、
その平均と標準偏差を表示することのできるプログラムを作成せよ。
http://pc11.2ch.net/test/read.cgi/tech/1176996941/247
>>671
解答ついてるから見てみ
まさか同一人物じゃないよな?
0680?
2007/05/02(水) 19:21:29はいっありがとうございます!!
>>677
そうなんですか!?
きっとみんなできないのかも;
>>678
ええ!?
別のですか?
すみません;
>>679
ありがとうございます!!!!
同一人物ではないです;
まじ助かりました☆
0681デフォルトの名無しさん
2007/05/02(水) 19:53:02雑なソースがかなりすっきりしました
文字列のポインタ配列って便利ですね
0682?
2007/05/02(水) 20:08:29↑の読み込んでくれなくて実行できません;
なんででしょうか???泣
0683デフォルトの名無しさん
2007/05/02(水) 20:15:23int main(void) { int i, j = 0; printf("i: %d, j: %d", i, j); return (0); }
これをコンパイルして実行すると
# i: 134513638, j: 0
と表示されるのですか、なぜiの値が0ではなく134513638のような値になるのでしょうか。
この134513638というのは何に由来しているのですか。
教えてください。
0684デフォルトの名無しさん
2007/05/02(水) 20:18:20i を初期化してないじゃん
0685デフォルトの名無しさん
2007/05/02(水) 20:18:50初期化しないと適当な値が入ってるよ。
0686デフォルトの名無しさん
2007/05/02(水) 20:19:02i が何か適当な数値で初期化されていないから
ちなみに、表示された数値は、iが割り当てられたメモリのアドレスの番地を
10進数で表示したものになっているらしい。検証してみたら俺の環境ではそうだった。
0687デフォルトの名無しさん
2007/05/02(水) 20:20:010688デフォルトの名無しさん
2007/05/02(水) 20:20:04int i = 0, j = 0;
だな。
その数字はたまたまそこにあったゴミ
0689デフォルトの名無しさん
2007/05/02(水) 20:21:16でもいいや
0690デフォルトの名無しさん
2007/05/02(水) 20:22:42それはお前の浅はかな考え。低レベルな低学歴バカは貧弱な知識や考えしかもっていないと
バレないように黙っていた方が身のためだぞw 以外にお前が起こしているトラブルは
おまえ自身のおろかさにあるようだな。まぁ、バカには何を言ってもダメだから馬鹿にされるんだよねw
お前の価値観で大した意味とか決められるわけねーだろw
ちゃんと検証してみろ。どういう値が入ったのかってな。自分が予期しなかったことを言われると
そんなことはとか言い出す奴ほど、路上では予期しなかったトラブルを他人のせいにして逃げようとするんだよなw
お前みたいなクズは路上に出てくるなよ、迷惑だ
0691本日の低学歴低脳バカザル
2007/05/02(水) 20:24:15まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
自分基準にもほどがある大ボケw そんなこといったら世の中お前にとって意味の無い検証なんて
いくらでもあるわ。それが重要になることも知らずにな、クーーーックックック(ケロロ軍曹のクルル曹長風に)
0692デフォルトの名無しさん
2007/05/02(水) 20:25:48int main(void) {
int i, j = 0;
printf("i: %d, j: %d \n", i, j);
printf("%d / %X / %p \n",i,i,i);
return (0);
}
↑でやってみるとアドレスの番地がそのまま値として入ってしまっていることが分かるよ。
誰かさんにとっては重要ではないにしろ、何でそういう値になったかくらい、アドレスの番地を
調べてみて気づくこともあるもんだよ。あっ、バカはアドレスの番地すら理解していないだろうね。
こいつじゃポインタとかぜんぜんわかっていなさそうだから以後放置よろw
0693デフォルトの名無しさん
2007/05/02(水) 20:30:01それはダメだw
0694デフォルトの名無しさん
2007/05/02(水) 20:32:00&i
0695デフォルトの名無しさん
2007/05/02(水) 20:32:38ヒント: =の評価は右から
0696デフォルトの名無しさん
2007/05/02(水) 20:32:41.| | | レ | | | | | J || | |
∩___∩ | | | J | | | し || | |
| ノ\ ,_ ヽ .| レ | | レ| || J |
/ ●゛ ● | .J し | | || J
| ∪ ( _●_) ミ .| し J|
彡、 |∪| | .J レ
/ ∩ノ ⊃ ヽ >>692
( \ / _ノ | |
\ " / | |
\ / ̄ ̄ ̄ /
 ̄ ̄ ̄ ̄
0697デフォルトの名無しさん
2007/05/02(水) 20:32:47どういう意図でやってるんだろうな。
デバッグだと「フフフフ・・・」が入ってたりするけど。
0698デフォルトの名無しさん
2007/05/02(水) 20:33:16ヒント: j が定義されてない
0699デフォルトの名無しさん
2007/05/02(水) 20:40:36明示的に初期化されないメモリが確保されたとき
自動で0x00を入れるより0xCCみたいな適当な値で埋めといたほうが
バグが見つかりやすいからそうしてる処理系もあるみたいよ。
0700デフォルトの名無しさん
2007/05/02(水) 20:41:49>>692 みたいな笑えるコードが検証コードのつもりだったのなら、
多分変数自身のアドレスではないだろうな。
たまたま昔の処理でアドレスを入れる為に使われた領域に
たまたま i が確保されただけだろう。
0701デフォルトの名無しさん
2007/05/02(水) 20:45:220702デフォルトの名無しさん
2007/05/02(水) 20:45:36読み込んだくれないとは?
コンパイルできないってこと?
0703デフォルトの名無しさん
2007/05/02(水) 20:48:48ならば、Cを学ぶにあたってどんな意味があるのか、低脳な俺にわかるように教えてください。
0704?
2007/05/02(水) 20:51:58打った数字も結果も表示されないのですが・・・
なぜですかぁ????
0705デフォルトの名無しさん
2007/05/02(水) 20:54:560706デフォルトの名無しさん
2007/05/02(水) 20:58:18初期化されていないから値は不定。&付けろ初心者
0707デフォルトの名無しさん
2007/05/02(水) 20:59:53>アドレスの番地を調べてみて気づくこともある
このソースのどこで調べているの?
0708?
2007/05/02(水) 21:00:37すみません
0709デフォルトの名無しさん
2007/05/02(水) 21:01:23ソースうp
長いようならあぷろだ使ってね
0710652
2007/05/02(水) 21:15:12ありがとうございました
file1 = fopen(argv[1], "rb");でこけてるとばかり思ってましたがちがうようですね
file2 = fopen("test.txt", "w");との兼ね合いですかね。アイデアがあれば打開できるものですね
0711?
2007/05/02(水) 21:15:24http://pc11.2ch.net/test/read.cgi/tech/1176996941/247
の250のソースを使ったんですが・・・
わかりますか???
0712デフォルトの名無しさん
2007/05/02(水) 21:15:34こっちからうp
1000個も入力するの嫌だから負数で入力ストップ
http://sa-wiki.com/upload/src/up0121.txt
0713デフォルトの名無しさん
2007/05/02(水) 21:17:39リロードするの忘れた
ソースを変更した?してないならこの人は1000分のデータを乱数から取得している
とりあえず>>712に作ったので見てみて
0714713
2007/05/02(水) 21:18:51俺が作ったわけじゃないよ
0715?
2007/05/02(水) 21:24:33やっと解決しました☆
でも数字を打ったあと結果がでなくて
ソース名を打ったら表示されました・・
なんでですか???
こういうもんなのですか?
0716デフォルトの名無しさん
2007/05/02(水) 21:31:32>でも数字を打ったあと結果がでなくて
>ソース名を打ったら表示されました・・
数字って何?ソース名って何?実行中の話だよね?
0717?
2007/05/02(水) 21:34:211000個の数字を入力してみたんです
ソース名はファイルの名前です
わかりにくくてすみません;
0718?
2007/05/02(水) 21:37:10#QNANOe+0000ってでるのですがこれは何を意味するのですか?
0719デフォルトの名無しさん
2007/05/02(水) 21:38:46非数。
結果が未定義の計算をしたらそうなるはず。
0720?
2007/05/02(水) 21:40:56なにからなにまですみません;
ありがとうございます
0721デフォルトの名無しさん
2007/05/02(水) 21:41:15fopenとprintfどちらかでやってみて。
注目は、立ち上がり時のargv。まあやってみてくれ、そうすりゃ分かる。
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
FILE *file1;
int i=0;
if (argc > 1) {
file1 = fopen(argv[2], "rbx");
// printf("%s\n",argv[1]);
}
while(i!=argc){
printf("%s\n",argv[i]);
i++;
}
fflush(stdin);
getchar();
return 0;
}
憶測に過ぎないが、どうも、fopenの方は、
stdin<=>システムバッファ<=>ファイルで一枚間に噛んでる故の、
立ち上がり時の引数にDOSプロ自体のみ(argv[0])渡されるっぽい。
0722デフォルトの名無しさん
2007/05/02(水) 21:41:240723683
2007/05/02(水) 21:58:33宣言さえすれば、明示的に初期化しなくても0で初期化されるのかと思い込んで
いましたが、そうではないんですね。
お礼が遅くなってすみません。レスをくれた方、どうもありがとうございました。
0724デフォルトの名無しさん
2007/05/02(水) 22:00:40> 立ち上がり時の引数にDOSプロ自体のみ(argv[0])渡されるっぽい。
ドロップ起動時とコマンドライン引数明示の差?
ドロップ起動時って (Win32)GetCommandLine のみ生きてて
CRT は argc/argv を埋めないのかな
0725デフォルトの名無しさん
2007/05/02(水) 22:16:15どう違うの?俺の環境で試しても違いは現れなかったが
0726デフォルトの名無しさん
2007/05/02(水) 22:30:362通り作ってみたところ片方が動いてくれません。
Cdivって関数はちゃんとできてるみたいなんですが、Ctesで「rが定義されてない」とかいわれてしまいます。
どこがおかしいんでしょうか?
0727デフォルトの名無しさん
2007/05/02(水) 22:31:270728726のソース
2007/05/02(水) 22:31:34#include <math.h>
typedef struct Complex_tag{
double r,i;
} Cmplx;
void Cdiv(Cmplx *x,Cmplx *y,Cmplx *ans){
double a;
if(fabs(y->r)>=fabs(y->i)){
a = y->i / y->r;
ans->r = (x->r + x->i * a) / (y->r + y->i * a);
ans->i = (x->i - x->r * a) / (y->r + y->i * a);
}
else{
a = y->r / y->i;
ans->r = (x->r * a + x->i) / (y->r * a + y->i);
ans->i = (x->i * a - x->r) / (y->r * a + y->i);
}
}
void Ctes(Cmplx *x,Cmplx *y,Cmplx *ans){
ans->r = (x->r * y->r + x->i * y->i) / (y->r * y->r + r->i * y->i);
ans->i = (x->i * y->r - x->r * y->i) / (y->r * y->r + r->i * y->i);
}
void main(){
Cmplx x,y,ans,*px,*py,*pans;
px = &x; py = &y; pans = &ans;
printf("x(r,i) = "); scanf("%lf,%lf",&px->r,&px->i);
printf("y(r,i) = "); scanf("%lf,%lf",&py->r,&py->i);
Cdiv(px,py,pans);
printf("x / y = (%f , %f)\n",pans->r,pans->i);
Ctes(px,py,pans);
printf("x / y = (%f , %f)\n",pans->r,pans->i);
}
0729デフォルトの名無しさん
2007/05/02(水) 22:33:13いや、どこがって言われても
君さ、見もしないもののどこがおかしいかなって言われて分かる?
せめてソースを...
0731729
2007/05/02(水) 22:35:48ゴメンね>>726
void Ctes(Cmplx *x,Cmplx *y,Cmplx *ans){
ans->r = (x->r * y->r + x->i * y->i) / (y->r * y->r + r->i * y->i);
ans->i = (x->i * y->r - x->r * y->i) / (y->r * y->r + r->i * y->i);
} ↑
ここ
0732729
2007/05/02(水) 22:36:59void Ctes(Cmplx *x,Cmplx *y,Cmplx *ans){
ans->r = (x->r * y->r + x->i * y->i) / (y->r * y->r + r->i * y->i);
ans->i = (x->i * y->r - x->r * y->i) / (y->r * y->r + r->i * y->i);
} ↑
ここ
右から2つ目
r->i になってる
0734デフォルトの名無しさん
2007/05/02(水) 22:57:070735デフォルトの名無しさん
2007/05/02(水) 23:15:43これを見てすぐわからないようじゃヤバいだろ。
0736デフォルトの名無しさん
2007/05/03(木) 01:09:08もう一度読み込むことはできませんか?
TCPプロトコルで受信したデータはプログラムから読み込まれると消去されるのでしょうか?
0737デフォルトの名無しさん
2007/05/03(木) 01:17:08一旦readした時点でバッファから消されるはずだから、普通に考えれば無理だろう
0738デフォルトの名無しさん
2007/05/03(木) 02:20:050739デフォルトの名無しさん
2007/05/03(木) 02:21:09読み込んだものは自分で管理するしかないだろ。
0740デフォルトの名無しさん
2007/05/03(木) 02:21:280741デフォルトの名無しさん
2007/05/03(木) 06:59:58ありがとうございました。
イメージがわきました。
0742デフォルトの名無しさん
2007/05/03(木) 12:02:55どなたか教えてください
0743デフォルトの名無しさん
2007/05/03(木) 12:18:53「windows gcc インストール」でググって、最初のページを見てみるとか。
0744デフォルトの名無しさん
2007/05/03(木) 12:26:10Cygwin + MinGW + GCC 相談室 Part 3
http://pc11.2ch.net/test/read.cgi/tech/1177944767/
0745デフォルトの名無しさん
2007/05/03(木) 12:28:32からおしえてください!!
0746デフォルトの名無しさん
2007/05/03(木) 12:44:07サンプル集が欲しいのか
手軽に試せる実行環境が欲しいのか
入門用のテキストなり学習ソフトが欲しいのか。
0747デフォルトの名無しさん
2007/05/03(木) 12:45:22世の中のRFIDが全部ネットに繋がる世の中を想像してみ?
IPv6でも足りない可能性があるよ
0748デフォルトの名無しさん
2007/05/03(木) 12:46:46たしかゲーム風に進めていく学習ソフトがあったはず
0749デフォルトの名無しさん
2007/05/03(木) 12:57:14IPv6は79228162500000000000000000000通り
7,9228,1625,0000,0000,0000,0000,0000
7穣9228予1625垓通り
使いきれるかなぁー
0750デフォルトの名無しさん
2007/05/03(木) 12:57:51じゃ、じゃあ砂粒一つ一つが繋がったらどうかしらっ
0751デフォルトの名無しさん
2007/05/03(木) 13:26:140752デフォルトの名無しさん
2007/05/03(木) 13:30:36もう来てるょ
0753デフォルトの名無しさん
2007/05/03(木) 17:10:37いろいろ調べたけどわからなくて。
0754デフォルトの名無しさん
2007/05/03(木) 17:13:12配列と同じスコープ内なら、sizeof(配列) / sizeof(配列[0])
0755デフォルトの名無しさん
2007/05/03(木) 17:13:46ローカルで確保してるなら
sizeof(array)/sizeof(array[0])
で取得できる。関数引数として受け取った配列のという事なら仕様上不可能
別の引数として要素数渡せ
0756デフォルトの名無しさん
2007/05/03(木) 17:20:170757デフォルトの名無しさん
2007/05/03(木) 17:56:23どもっす
>同じスコープ内
>ローカルで確保
>関数引数
からしてわかってませんがヒントになりますた。ありがとう。
0758デフォルトの名無しさん
2007/05/03(木) 18:06:47尤も、配列は関数の引き数にできないから(ポインタになってしまう)同じことだけど。
0759デフォルトの名無しさん
2007/05/03(木) 19:01:31の時はsizeof(array)/sizeof(array[0]) 使えないんですかね…。
要素数を宣言してないからこそ使いたいのに…。
0760デフォルトの名無しさん
2007/05/03(木) 19:04:08>758
0761デフォルトの名無しさん
2007/05/03(木) 19:06:090762デフォルトの名無しさん
2007/05/03(木) 19:22:11用語がわかってないから意味が通じてないみたいです。精進します。
0763デフォルトの名無しさん
2007/05/03(木) 19:27:45>unsigned char XXX [] ={1,2,3,4,…
>の時はsizeof(array)/sizeof(array[0]) 使えないんですかね…。
>要素数を宣言してないからこそ使いたいのに…。
できるかできないかは、やってみれば分かる事。
ということだ。
0764デフォルトの名無しさん
2007/05/03(木) 19:33:09亀レスで申し訳ありません
無事インストールできました
ありがとうございました
0765デフォルトの名無しさん
2007/05/03(木) 20:29:220766デフォルトの名無しさん
2007/05/03(木) 20:44:120767デフォルトの名無しさん
2007/05/03(木) 20:46:36それがその携帯で動くかどうかは別問題。
0768デフォルトの名無しさん
2007/05/03(木) 20:47:44探せばあるかもしれんが。
0769デフォルトの名無しさん
2007/05/03(木) 21:02:260770デフォルトの名無しさん
2007/05/03(木) 21:11:01携帯でプログラムの実習やアプリの開発が出来きるようにしたら
結構受けそうだな。と考えていた矢先、>>765の書き込みを発見、
これは、携帯で動く開発環境を作れと言う神の思召しか?
0771デフォルトの名無しさん
2007/05/03(木) 21:12:200772デフォルトの名無しさん
2007/05/03(木) 21:16:050773デフォルトの名無しさん
2007/05/03(木) 21:17:280774デフォルトの名無しさん
2007/05/03(木) 21:20:260775デフォルトの名無しさん
2007/05/03(木) 21:26:26ttp://ja.wikipedia.org/wiki/BREW
0776デフォルトの名無しさん
2007/05/03(木) 21:29:390777デフォルトの名無しさん
2007/05/03(木) 21:39:34若いやつの携帯にメールを送ったら返信が異常に早くて、メールを打つところを実際にみてたら、
電光石火の親指だった。
0778デフォルトの名無しさん
2007/05/03(木) 21:41:12そうか・・・。
キーボードに慣れていると何が哀しくて親指打ちしなけりゃならないんだと思ってしまうけど、
訓練次第でなんとでもなるんだな。
人間てすごいわ。
0779デフォルトの名無しさん
2007/05/03(木) 23:09:34aa はint 型で、buffはchar型配列で、適当な文字列が入っています。
これをコンパイルすると、VCコンパイラだとうまく行きますが、
GCCコンパイラでコンパイルすると、↓以下の警告がでます。
incompatable implicit declaration of bilt-in function 'strlen'
何がいけないのでしょうか。 もちろん、stdlib.hはインクルード宣言をしています。
0780デフォルトの名無しさん
2007/05/03(木) 23:11:340781デフォルトの名無しさん
2007/05/03(木) 23:12:00strlenがstdlib.hで宣言されてるなんて初耳だな
0782デフォルトの名無しさん
2007/05/03(木) 23:28:320783デフォルトの名無しさん
2007/05/04(金) 00:07:44scanfを使うとコンパイラが"scanfではなくscanf_sを使え"と警告を出してきます。
同様の警告はgetsを使ったときにも出ます。
警告なので実行しても特に問題はないみたいなんですが、
scanfとscanf_sにはどのような違いがあるのでしょうか?
コンパイラはVsualC++2005ExpressEditionです。
0784デフォルトの名無しさん
2007/05/04(金) 00:11:29scanfだけじゃないが、VC++2005で○○_sというセキュアなバージョンが追加されてる関数がある
違いはバッファとして指定した引数のサイズが指定できるようになってる事
gccとかへの移植性を考えると使わない方がいい
VC++2005でしか使わないならどっちでもいい
0785デフォルトの名無しさん
2007/05/04(金) 00:15:30scanfは入力するデータのサイズを制限出来ない為にデータが溢れたりしてえらい事になる可能性がある。
0786デフォルトの名無しさん
2007/05/04(金) 00:35:21size_t型はなのは知ってるけど、>>779みたいに、
int型にそのままぶち込んでは何か問題でも生じるのですか?
0787デフォルトの名無しさん
2007/05/04(金) 00:39:56size_tの最大値が、intの最大値より大きかったら、問題が起きる場合が。
気にしなくていいかな?
0788デフォルトの名無しさん
2007/05/04(金) 01:15:35特に気にする必要は無いと思うが、typedef unsigned long size_tとなってるような
処理系が無いとは言えないから出来ることならsize_tを使った方がいいだろうな
0789デフォルトの名無しさん
2007/05/04(金) 01:54:540790デフォルトの名無しさん
2007/05/04(金) 01:58:43まあ、可能性としてあるだけで
実際に64bit環境だからといって2G/4G以上の文字列長を
必要とすることはまず無いだろうが。
それ以前にファイルサイズ等でコーディング上の無理が出て
どこか修正する必要が出てくるだろうし。
0791デフォルトの名無しさん
2007/05/04(金) 02:02:02#ifdef _WIN64
typedef unsigned __int64 size_t;
#else
typedef _W64 unsigned int size_t;
#endif
0792デフォルトの名無しさん
2007/05/04(金) 02:02:590793デフォルトの名無しさん
2007/05/04(金) 02:20:590794デフォルトの名無しさん
2007/05/04(金) 07:40:25有り得なさ過ぎw
0795ニュースナビゲーター
2007/05/04(金) 12:03:58「祭」に、のりおくれるな。
2ちゃんねるニュース速報+ナビ
http://newsnavi.2ch.net/
WWWブラウザの「お気に入り」や「ブックマーク」に登録しよう。
0796デフォルトの名無しさん
2007/05/04(金) 12:06:00>ほとんどの処理系においてtypedef unsigned size_tとされてるはずだから
longじゃなくても、その時点で、intより最大値が大きいじゃん。
0797デフォルトの名無しさん
2007/05/04(金) 13:45:07close()がもし失敗したら〜、hoge hoge〜 なんて処理を、
丁寧に書いているプログラムなんて、今まで見た事がない件。
いい例とか、どっかにありますか?
0798デフォルトの名無しさん
2007/05/04(金) 14:17:022000*2000*2000*3の配列を作って、そこに色情報を入れようとしたのですが
データ量が多過ぎてプログラムが動きません。
ポインタを使うのがいいのか、他にもっといい方法があるのか、是非教えてください!
お願いします!
0799デフォルトの名無しさん
2007/05/04(金) 14:27:23メモリをたくさん積んだマシンを使う。
0800デフォルトの名無しさん
2007/05/04(金) 14:27:50closeの失敗なんて意識したことないなぁ。
やってもログを出力させるだけとか・・・
0801デフォルトの名無しさん
2007/05/04(金) 14:30:240802デフォルトの名無しさん
2007/05/04(金) 14:47:02てきとーなハッシュ関数を定義するとか。
0803デフォルトの名無しさん
2007/05/04(金) 15:22:03バッファをフラッシュしてファイルを閉じてるから、close()失敗したら、write()のエラー処理と同じことをすればいいよ。
小さいファイルの読み書きだと、write,readではエラーがでなくて、close()ではじめてエラーがでるとか、すごいありそう。
0804デフォルトの名無しさん
2007/05/04(金) 16:30:140805デフォルトの名無しさん
2007/05/04(金) 16:42:25オンメモリで処理するのはあきらめてファイルにしたら。
それでもとてつもなくでかいファイルになってしまうが。
あとはデータの性質に合わせて省メモリ化するように工夫する。
例えば配列の全要素に必ずしもデータが詰まっていないなら「疎な配列」を使ってみる。
0806デフォルトの名無しさん
2007/05/04(金) 21:33:19ヒント:低レベル出力関数はバッファリングしない
0807デフォルトの名無しさん
2007/05/04(金) 21:34:160808デフォルトの名無しさん
2007/05/04(金) 21:59:07struct man{
struct man *prev;
char name[20];
int score;
struct man *next;
};
が相互リンクリストでつながっていて、これをスコア順に並べなおしたいのです。
直接選択法を使ってやりたいのですが、ポインタのつなぎかえが分からずできません。
どうすればよいかどなたか教えてください。お願いします。
0809デフォルトの名無しさん
2007/05/04(金) 22:09:36直接選択法のソート自体は出来る?int配列とかで。
0810デフォルトの名無しさん
2007/05/04(金) 22:24:13swap(struct man *a, struct man *b)
{
struct man* a_prev = a->prev;
struct man* a_next = a->next;
struct man* b_prev = b->prev;
struct man* b_next = a->next;
a_prev->next = b;
b->next = a_next;
b_prev->next = a;
a->next = b_next;
b->prev = a_prev;
a_next->prev = b;
a->prev = b_prev;
b_next->prev = a;
}
じゃね?
加えて実際には、端にあるノードの場合の処理が必要だが。
0811デフォルトの名無しさん
2007/05/04(金) 22:47:26できます。数列の最初の項を最小と仮定してほかの項と比べていって
より小さいときは交換するってやつですよね。
>>810
ありがとうございます。やってみます。
0812デフォルトの名無しさん
2007/05/04(金) 23:01:34する場合もあるし、しない場合もある。
0813デフォルトの名無しさん
2007/05/04(金) 23:20:52#include<stdio.h>
int main(void)
{
int n1,n2,n3,max;
puts("三つの整数を入力してください。");
printf("整数1;") scanf("%d",&n1);
printf("整数2;") scanf("%d",&n2);
printf("整数3;") scanf("%d",&n3);
max=n1;
if(n2>max) max=n2;
if(n3>max) max=n3;
printf("最大値は%dです。\n",max);
return(0);
}
でビルドするとほとんどエラーになるので自分なりに試して
0814デフォルトの名無しさん
2007/05/04(金) 23:21:34int main(void)
{
"int n1,n2,n3,max";
puts("三つの整数を入力してください。");
printf("整数1;") scanf("%d",&n1);
printf("整数2;") scanf("%d",&n2);
printf("整数3;") scanf("%d",&n3);
"max=n3";
"if(n2>max) max==n2";
"if(n3>max) max==n3";
printf("最大値は%dです。\n,max");
return(0);
}
でビルドすると上手くいくのですが
デバックなしで開始すると
三つの整数を入力してください。
整数1;n1
続行するには何かキーを押して下さいとなり
この先にいけないのですが何がいけないのでしょうか?
完成型は
三つの整数を入力してください。
整数1;n1
整数2;n2
整数3;n3
最大値はn3です
という形にしたいのです
0815デフォルトの名無しさん
2007/05/04(金) 23:25:000816デフォルトの名無しさん
2007/05/04(金) 23:27:500817デフォルトの名無しさん
2007/05/04(金) 23:30:470818デフォルトの名無しさん
2007/05/04(金) 23:36:15{→{
printfとscanf以外の"は不要
printf("整数1;")→printf("整数1;");
max=n3→max=n1;
max==n2→max=n2;
max==n3→max=n3;
printf("最大値は%dです。\n,max");→printf("最大値は%dです。\n",max);
}→}
修正点はこんなところか?
0819デフォルトの名無しさん
2007/05/04(金) 23:36:48自宅でC言語の勉強をしたいのですがLINUXじゃないとC言語ってできないんですか?
ウィンドウズ上でできるソフトウェアなんか知ってるよって方が居ましたら教えてください
0820デフォルトの名無しさん
2007/05/04(金) 23:38:32VisualStudioっていう非常に有名なソフトがあるよ
0821デフォルトの名無しさん
2007/05/04(金) 23:45:010822デフォルトの名無しさん
2007/05/04(金) 23:46:42#include<stdio.h>
int main(void)
{
int n1,n2,n3,max;
puts("三つの整数を入力してください。");
printf("整数1;"); scanf("%d",&n1);
printf("整数2;"); scanf("%d",&n2);
printf("整数3;"); scanf("%d",&n3);
max=n3;
if(n2>max) max==n2;
if(n3>max) max==n3;
printf("最大値は%dです。\n",max);
return(0);
}
0823岡本 ◆9dWns3XgdE
2007/05/05(土) 00:49:04aとかで無限ループしてしまってうざいんですけど。
0824デフォルトの名無しさん
2007/05/05(土) 00:51:030825デフォルトの名無しさん
2007/05/05(土) 01:01:38> if(n2>max) max==n2;
> if(n3>max) max==n3;
`='が1個多くないか?
まあ文字判定できないのはそれが原因じゃないけど つ>>824
あるいはis系の関数を使うか
0826岡本 ◆9dWns3XgdE
2007/05/05(土) 01:02:13うぃ〜気合入れてスキルアップします。
0828デフォルトの名無しさん
2007/05/05(土) 01:04:26つatof
0829デフォルトの名無しさん
2007/05/05(土) 01:15:42>>827
いや、別人
>>814のソースをコピペしてちょっといじっただけでそこまで見てなかったんだ
max=n3;
if(n2>max) max=n2;
if(n3>max) max=n3;
が正解だね
0830829
2007/05/05(土) 01:16:30max=n1;
if(n2>max) max=n2;
if(n3>max) max=n3;
だな
0831デフォルトの名無しさん
2007/05/05(土) 01:29:00>>818
0832デフォルトの名無しさん
2007/05/05(土) 01:29:02sscanfをfgetsと組み合わせて使っている限りは
毎回fgetsで入力を受けるchar配列の中身が更新されるからだよね?
0833デフォルトの名無しさん
2007/05/05(土) 01:34:21atoiとかは文字列"100"をint型の100に変換するだけ
文字'a'を数字に変換することはできないでしょ
>>823は数字かどうかを判別したいんじゃないの?
0834デフォルトの名無しさん
2007/05/05(土) 01:46:18scanf()を単にfgets()+sscanf()にしただけでは万事解決とはいかない。
scanf()が数字以外の文字を喰い残すという悪癖を回避できるだけだ。
0835デフォルトの名無しさん
2007/05/05(土) 02:05:39fgetc(stdin)と
getchar()は、入力バッファに何も無かった場合、どちらも入力待ちになるのでしょうか?
0836デフォルトの名無しさん
2007/05/05(土) 02:09:28よくその悪癖があるからfgets+sscanfにしろって言われるけど
それくらいならそのことを考慮してscanf呼び出した後は
入力を吐き捨てるようにすればいいんじゃないかなと思うんですが、どうなんでしょ?
0837デフォルトの名無しさん
2007/05/05(土) 02:24:480838デフォルトの名無しさん
2007/05/05(土) 02:30:14そうよ
入力がないんだから次には進まないでしょ
そんなことよりもおまいは>>500を読んでそんなことを思いついたのか
その発想力に嫉妬だわw
0839デフォルトの名無しさん
2007/05/05(土) 02:32:45そういうもんなんですね、どうもでした
0840デフォルトの名無しさん
2007/05/05(土) 02:34:27500番台と500の区別もつかないの?
0841デフォルトの名無しさん
2007/05/05(土) 02:50:23ありがとうございます。
正確には550のあたりです。すみません
0842デフォルトの名無しさん
2007/05/05(土) 03:19:05普通に問題なく動作させることは出来る。
ただ、そこまでしてscanfを使う必要があるのかというのが疑問。
「fgets+sscanfを使えばいい」とだけ聞いて
sscanfの戻り値を確認しない奴も結構居る(もちろん必要ない場合もある)。
0843デフォルトの名無しさん
2007/05/05(土) 06:30:48ややこしいならいったん変数に格納して、
文字コードで条件判断させればインじゃないか?
0844デフォルトの名無しさん
2007/05/05(土) 10:49:35複雑な構文解析が必要なときは、yacc+lexとか
0845デフォルトの名無しさん
2007/05/05(土) 11:18:11途端に糞めんどくさくなるから嫌なんだよ。
0846デフォルトの名無しさん
2007/05/05(土) 11:26:360847デフォルトの名無しさん
2007/05/05(土) 11:28:03int n1,n2,n3,max;
→;が型の前にありません
printf("整数1;"); scanf("%d",&n1);
printf("整数2;"); scanf("%d",&n2);
printf("整数3;"); scanf("%d",&n3);
→n1,n2,n3 定義されていない職別子です
printf("最大値は%dです。\n",max);
→max 定義されていない職別子です
とエラーになります
0848デフォルトの名無しさん
2007/05/05(土) 11:29:16max()がマクロもしくは関数として既に定義されていてコンパイルが
思うようにいかないのだろう。
maxnとか名前を適当に変えてやってみれ。
0849デフォルトの名無しさん
2007/05/05(土) 11:38:24>int n1,n2,n3,max;
>→;が型の前にありません
この、int の前はどうなってんのさ
0850デフォルトの名無しさん
2007/05/05(土) 12:19:52本には
int n1,n2,n3 max;
と書いてあります
0851デフォルトの名無しさん
2007/05/05(土) 12:23:56int main(void)
{
int n1,n2,n3,max;
puts("三つの整数を入力してください。");
printf("整数1;"); scanf("%d",&n1);
printf("整数2;"); scanf("%d",&n2);
printf("整数3;"); scanf("%d",&n3);
max=n1;
if(n2>max) max=n2;
if(n3>max) max=n3;
printf("最大値は%dです。\n",max);
return(0);
}
0852デフォルトの名無しさん
2007/05/05(土) 13:51:21それは誤植だw
0853デフォルトの名無しさん
2007/05/05(土) 15:35:42どうやってつくるんですか?
全部txtがはいってしまうんだけど
0854デフォルトの名無しさん
2007/05/05(土) 15:36:230855デフォルトの名無しさん
2007/05/05(土) 15:37:500856デフォルトの名無しさん
2007/05/05(土) 15:39:13と""で囲む
0857デフォルトの名無しさん
2007/05/05(土) 15:41:32ありがとうございます。
0858デフォルトの名無しさん
2007/05/05(土) 15:46:06とか拡張子つけておくと何かと便利だけどな。
makeするときはmake -fprojectname.mak
0859デフォルトの名無しさん
2007/05/05(土) 15:55:54そこがおそらくデフォルトで「テキスト文書」となっているんじゃないかな。
だから後ろに .txt の拡張子がつく。そこを「すべてのファイル」に変えて、
拡張子を自分でファイル名の最後に付けて保存すればいい。
0860デフォルトの名無しさん
2007/05/05(土) 16:02:11ttp://sourceforge.net/projects/notepad-plus/
個人的にはViラブだけどw
0861デフォルトの名無しさん
2007/05/05(土) 17:12:23Borland C++のmakeだとmakefileとmakefile.makの両方を受け付けてくれるのが便利だった
0862デフォルトの名無しさん
2007/05/05(土) 18:56:07#include <stdio.h>
int main(void)
{
int a=5;
int *b=&a;
printf("%d%p",*b,&a);
return 0;
}
このプログラムをコンパイルすると*aと&bの値が全く違うのはなぜでしょうか?
#include <stdio.h>
int main(void)
{
int a=5;
int *b;
b=&a;
printf("%d%p",*b,&a);
return 0;
}
これが違う値になるのは普通に理解できるのですが。。
0863デフォルトの名無しさん
2007/05/05(土) 18:58:47↓
このプログラムをコンパイルすると*bと&aの値が全く違うのはなぜでしょうか?
の間違いでした、
0864デフォルトの名無しさん
2007/05/05(土) 19:00:41&a==0x12345678 // aのアドレス
b==0x12345678 // aのアドレス
*b==5 // ポインタのデリファレンス(ポインタbから参照先の値を得る)
*bと&aの値が異なるのは当たり前
0865デフォルトの名無しさん
2007/05/05(土) 19:30:41int* b=&a;
と書いた方が分かりやすいかもね。
どっちでも動作は一緒なんだが。
0866デフォルトの名無しさん
2007/05/05(土) 20:07:51b=&a;
に分解するとわかるぞ。
つまり b==&a
0867デフォルトの名無しさん
2007/05/05(土) 20:08:50int* a, b;
でドツボにはまるだけだから素直に
int *a, b;
とかくのがお約束。このレベルのわかりやすさが必要な人間はそもそもCなんて使えない。
0868デフォルトの名無しさん
2007/05/05(土) 20:11:380869デフォルトの名無しさん
2007/05/05(土) 20:15:36つまりint *b=&a; では*b(bが指しているアドレスにあるint型のデータ)に&a(aのアドレス)を代入するわけでなく
int型を指し示すポインタbにaのアドレスを代入する
つまり僕が示した前者と後者ではコンパイラさんにとって全く一緒のものとして扱うということですか?
とりあえずこういうことで理解しましたが問題ないでしょうか?
0870デフォルトの名無しさん
2007/05/05(土) 20:19:530871デフォルトの名無しさん
2007/05/05(土) 20:21:17b に a のアドレスが入るという点においては一応問題はない。
0872デフォルトの名無しさん
2007/05/05(土) 20:23:210873デフォルトの名無しさん
2007/05/05(土) 20:26:56初期化に注目すれば int* b = &a; のイメージと言いたいわけか?
0874デフォルトの名無しさん
2007/05/05(土) 20:36:09丸暗記してしまっていいよ。理屈で考えても不満が出てくるだけだ。
0875デフォルトの名無しさん
2007/05/05(土) 20:37:490876デフォルトの名無しさん
2007/05/05(土) 20:42:08何の話かよくわからなかったぜ・・・
0877デフォルトの名無しさん
2007/05/05(土) 20:50:100878デフォルトの名無しさん
2007/05/05(土) 20:53:120879デフォルトの名無しさん
2007/05/05(土) 20:58:16ブラウザは何?
0880デフォルトの名無しさん
2007/05/05(土) 21:12:300881デフォルトの名無しさん
2007/05/05(土) 21:17:47今はauの携帯から書いてます、ここソフトバンク入りにくい
0882デフォルトの名無しさん
2007/05/05(土) 21:27:430883デフォルトの名無しさん
2007/05/06(日) 13:55:16これをなるべく早く実行したいんだ。実際の表示は行わなくていいらしい。
0884デフォルトの名無しさん
2007/05/06(日) 13:57:070886デフォルトの名無しさん
2007/05/06(日) 14:00:15main(){}
0887デフォルトの名無しさん
2007/05/06(日) 14:22:58まあ要するに、2^30までのどんな数字でも2進表示できるプログラム、だろうけど。
宿題スレに行ってね。&
0889デフォルトの名無しさん
2007/05/06(日) 15:15:03しっかし2^30まで表示するのは難儀だな
0890デフォルトの名無しさん
2007/05/06(日) 15:28:17どれぐらい遅いか比べてくださいお願いします
#include <bitset>
#include <iostream>
// 10進法→2進法
std::bitset<32> dec2bin(int _int) {
std::bitset<32> ret;
for(unsigned int i = 0; i < 32; ++i)
ret[i] = (_int & ( 1 << ((sizeof(int)*8-1)-i ) ) ) !=0;
return ret;
}
// 表示
int out(const std::bitset<32>& s) {
for (unsigned int i = 0; i < 32; ++i)
std::cout << s[i];
std::cout << std::endl;
return 0;
}
// main
int main() {
std::bitset<32> d = dec2bin(32);
for (unsigned int i = 1; i < 2<<30; i<<=1)
out(dec2bin(i));
return 0;
}
0891デフォルトの名無しさん
2007/05/06(日) 15:59:46ありがとうございます。
bcc32にてコンパイル致しましたがエラーが出てしまいます。
コンパイラは何を使われていますか?
0892883
2007/05/06(日) 16:19:45お騒がせ致しました。
0893デフォルトの名無しさん
2007/05/06(日) 16:25:55それ以外ならば(゚�听)を表示
って言うのを組みたいんですが、こんな感じですかね?
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int ran;
srand (time(0));
ran = rand () % 1000 + 1;
if (ran < 999) {
printf ("(゚-゚)");
}
else {
printf ("(゚�听)");
}
return 0;
}
0894デフォルトの名無しさん
2007/05/06(日) 16:32:41if (ran < 999) {
printf ("(゚-゚)");
}
↓
if (ran <= 999) {
printf ("(゚-゚)");
}
0895デフォルトの名無しさん
2007/05/06(日) 16:33:080896デフォルトの名無しさん
2007/05/06(日) 16:34:10いやまて
ran = rand () % 1000 + 1;
1〜999 なら (゚-゚)
1000 なら (゚�听)
でいいんだな?
(゚�听)が出る確率1/1000だけどいいんだな?
0898デフォルトの名無しさん
2007/05/06(日) 16:39:04#include <stdio.h>
#include <stdlib.h>
int main (void) {
int ran;
srand (time(0));
ran = rand () % 1000 + 1; //1〜1000の擬似乱数を出力
if (ran <= 999) { //ranが999以下の時に(゚-゚)を表示
printf ("(゚-゚)");
}
else { // ranが999以下の時意外に(゚�听)を表示
printf ("(゚�听)");
}
return 0;
}
0899デフォルトの名無しさん
2007/05/06(日) 16:40:56おk
0900デフォルトの名無しさん
2007/05/06(日) 16:42:57ありがとでした^^
0901デフォルトの名無しさん
2007/05/06(日) 16:43:01うちのVC.NET2003はtimeが見つからないって言ってるんだけど
0902デフォルトの名無しさん
2007/05/06(日) 16:49:52BCC55だと問題なく動きますよ
まぁ一応、チェックしてて気付いたんでtime.hをincludeして置きましたけど
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (void) {
int ran;
srand (time(0));
ran = rand () % 1000 + 1; // 1〜1000の擬似乱数を出力
if (ran <= 999) { // ranが999以下の時に(゚-゚)を表示
printf ("(゚-゚)\n"
" %d"
,ran);
}
else { // ranが999以下の時以外に(゚�听)を表示
printf ("(゚�听)\n"
"%d"
,ran);
}
return 0;
}
0903デフォルトの名無しさん
2007/05/06(日) 17:14:090904デフォルトの名無しさん
2007/05/06(日) 17:30:310905デフォルトの名無しさん
2007/05/06(日) 17:32:540906デフォルトの名無しさん
2007/05/06(日) 17:47:56Cでもプロトタイプ宣言は要るでしょう…
>>904
cl.exeでCでコンパイルするようにするオプションってありますか?
>>905
プリコンパイルヘッダなんて使ってません
0907デフォルトの名無しさん
2007/05/06(日) 18:09:03無くても呼べるってのと、あったほうがいいってのは別の話。
無くてもエラーにならずに呼べる。
0908デフォルトの名無しさん
2007/05/06(日) 18:10:06/TC
つかcl.exe 使ってんなら -?でわかるだろ
0909デフォルトの名無しさん
2007/05/06(日) 18:11:590910デフォルトの名無しさん
2007/05/06(日) 18:24:30無くても呼べるんですか
コンパイラの型チェックができないと、宣言のときの型の意味無いじゃんとか思って
Cでも必須って思ってました
>>908
�dクス
/TCオプション付けたら難なく通りました
>>909
おっしゃるとおり頭が悪い上に固くさらに怠け者の駄目人間です
0911デフォルトの名無しさん
2007/05/06(日) 19:11:29まあ入門書に載ってるソースがクソだからだけど
0912デフォルトの名無しさん
2007/05/06(日) 19:23:060913デフォルトの名無しさん
2007/05/06(日) 19:48:59プロトタイプや関数の定義がファイルスコープに無いときは、引数は呼び出し側にあわせて、戻り値はintが仮定される。
実際の呼び出し時には、intまたはdoubleへの格上げがあるけど。
ただ、この話は歴史の話になるので・・・
0914デフォルトの名無しさん
2007/05/07(月) 14:20:35せっかくなのでK&Rも買って読んでみようかと思っていますが
原著と訳本どちらにしようか迷っています
アマゾンのレビュー
ttp://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9EC-ANSI%E8%A6%8F%E6%A0%BC%E6%BA%96%E6%8B%A0-B-W-%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%8F%E3%83%B3/dp/4320026926
を読むと訳がひどいとのことですが
批判しているレビュアーさんの他のレビューを見てみると
ただのイチャモンのようにも思えてしまいますw
本当に理解に苦しむほどの訳なのでしょうか?
よければレビューなど聞かせていただければと思います
スレ違いや既出でしたらすいません
0915デフォルトの名無しさん
2007/05/07(月) 14:25:31まず入門サイトをはしごしてからでもいいと思うよ。金かけるのは。
0916デフォルトの名無しさん
2007/05/07(月) 14:28:08アメリカから来た日本人グラマもいたけど訳書持ってた。
特に意味不明な訳はないし
英語の勉強も同時にやりたいんでもないなら日本語版買っとけ。
0917デフォルトの名無しさん
2007/05/07(月) 14:30:12原書をそのまま読めるなら翻訳を読む必要は無い。
しかしそれ以前に、K&Rはプログラミング従事者で最近の言語に縁が無い人向けの本だ。
0918デフォルトの名無しさん
2007/05/07(月) 14:58:01猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/
ここでも読んで見るといい
0919デフォルトの名無しさん
2007/05/07(月) 15:01:18特にFAQ&Tips、リファレンスの検索ではなく網羅的な知識が必要とされる入門書においては。
0920デフォルトの名無しさん
2007/05/07(月) 15:07:37本は目的の言語で記述してあるアルゴリズムの本から入るのがいいと思うなあ
0921デフォルトの名無しさん
2007/05/07(月) 15:40:040922914
2007/05/07(月) 16:46:59普段は原書(英語しか読めませんがorz)か訳書の選択は
価格が同じで内容が同じ(追加や大きな訂正が無かったり)
なら原書を選ぶことにしています
が 買うとするとK&Rはちょっと値段差が大きいので・・・
あとプログラミング関係で英書はあまり読んだことがなく専門用語がちと不安です
>猫でもわかるプログラミング
これは良いですね ありがとうございます ぬこかわいいよぬこ
マクローリン展開を高校で教えられたというのはいいなぁ・・・
けどマクローリン展開と呼ぶ人はいまやほとんどいない
(たぶん)はずなのでテイラー展開と書いてほしかったような気もw
あとぱらぱらと眺めてみましたがこの説明だと
ポインタの理解が僕には辛いような気もします
配列とポインタの違いがよくわかりませんorz
>すべてを無料かつオンラインで済まそうとする奴にろくな奴はいない
アドバイスありがとうございます
入門書は大事だと思いますし良いものにお金を払うという
スタンスは大事だと思います とはいえお金が無くて
学習ができない人や国もいたりあったりするわけでそういう意味では
良い入門書ほどオンラインで無料公開されるべきなのかなとも思ったり
>アルゴリズムの本から入るのがいいと思うなあ
どちらかというとアルゴリズムの本は辞書的に使いたいと
思っていたのですがやっぱそれじゃ駄目ですか?w
0923デフォルトの名無しさん
2007/05/07(月) 16:51:23しるかボケさっさと勉強しる!
0924デフォルトの名無しさん
2007/05/07(月) 16:55:030925デフォルトの名無しさん
2007/05/07(月) 17:00:48こんなんじゃ結局身に付かなそうだな。
0926デフォルトの名無しさん
2007/05/07(月) 17:09:030927デフォルトの名無しさん
2007/05/07(月) 17:09:33物理的に読みやすくて出かけの暇つぶしで勉強するには丁度いい
0928デフォルトの名無しさん
2007/05/07(月) 17:28:49>917にも書いてあるけど、K&Rはプログラミング初心者向けではないよ。
0929デフォルトの名無しさん
2007/05/07(月) 18:14:30テキストエディタは何がお勧めですか?
0930デフォルトの名無しさん
2007/05/07(月) 18:22:57メモち(ry
0931デフォルトの名無しさん
2007/05/07(月) 18:34:07NotePad
0932デフォルトの名無しさん
2007/05/07(月) 18:35:08環境による。大抵の環境で使えるvi(及びその派生品)はお勧め。
0933デフォルトの名無しさん
2007/05/07(月) 18:35:49VisualC++ 2005 Express Edition
0934デフォルトの名無しさん
2007/05/07(月) 18:43:51エディタについての質問かよ。
0935デフォルトの名無しさん
2007/05/07(月) 19:26:41Winならサクラエディタ
しかし、初っ端からK&Rとは>>914は大物になる予感。
初心者が最初にやるなら0から始めるC言語学習帳(ttp://effy.ldw.jp/)が良さげ、
本気でCを勉強する気になったら独習Cに進んでもらえば良いでないかな。
0936デフォルトの名無しさん
2007/05/07(月) 21:58:020937914
2007/05/07(月) 21:59:34>マクローリン展開は普通に使ってるが
それは失礼しました けれど用語を使い分けるメリットが
それほどあるとは思えなかったりもします
マクローリンさんの世に広めた功績は大きいとは思いますが・・・
そんなこと言い出すとローラン展開と呼べなんて話になるかw
ご紹介いただいた学習帳や独習Cも見てみます
皆様レスありがとうございましたノシ
0938デフォルトの名無しさん
2007/05/07(月) 22:42:57「マクローリン」の方が「0 の周りのテイラー」より短いからメリットはある。
0939デフォルトの名無しさん
2007/05/07(月) 22:52:020940デフォルトの名無しさん
2007/05/07(月) 23:42:26どんな言語でも、スクラッチで書くときや、機械的な整形するときとかはviかな。
コメントは英文で・・
そのあとは、いまどきの各種IDEのエディタでマウスつかってデバッグかなぁ
”ttp://www9.plala.or.jp/sgwr-t/detail/lsic/install.html”のページを参考にして、
インスコしてみたのですが、最後のページ”ttp://www9.plala.or.jp/sgwr-t/detail/lsic/confirmation.html”の部分がうまくいきません。
うまくいかない理由にお心当たりのある方がおられましたら、ご教示して下さると、ありがたいです。
0942デフォルトの名無しさん
2007/05/08(火) 01:00:54PATHが通ってないだけな気がするが
0943デフォルトの名無しさん
2007/05/08(火) 01:09:17古いとか16bitとかってことだけじゃなく
NT系のOS(XPとか)と相性がイマイチで、不具合が出る可能性がある。
まあ、マニュアルは手元に置いて参照するのに便利だけど。
0944941 ◆GA6i1P9DC2
2007/05/08(火) 01:15:24"3.下図のように、著作権などの文字列が出力されればインストール完了です。"
がうまくいきません。文字列が何も出てきません。
何度かインスコしなおしてみたりもしましたが、改善されませんでした。
>>943
他にお勧めのコンパイラを紹介していただけないでしょうか?
0945デフォルトの名無しさん
2007/05/08(火) 01:40:36他にも、LSICはC89の規格にさえ準拠していない点が多々あるので、
今となっては歴史的な価値しかない。入門で使わない方がいい。混乱する。
他にお薦めというと、Cygwinでgccか、Borlandがタダで配ってるやつか、
MSがタダで配ってるやつになるかな。
0946デフォルトの名無しさん
2007/05/08(火) 01:49:530947デフォルトの名無しさん
2007/05/08(火) 02:04:41操作可能なプログラムまたはバッチ ファイルとして認識されていません。
も出ないのか?そりゃ変だな
まあWin使ってんならVC++入れてみ
0948デフォルトの名無しさん
2007/05/08(火) 06:02:050949デフォルトの名無しさん
2007/05/08(火) 06:17:59gcc
使いやすい
VC++
0950デフォルトの名無しさん
2007/05/08(火) 06:26:41Intel > VC++ > gcc じゃね?
0951デフォルトの名無しさん
2007/05/08(火) 06:59:28ところで、実際VC++の性能ってどうなのよ
0952デフォルトの名無しさん
2007/05/08(火) 08:00:03初心者はまだ速度なんて気にしなくていいから。
0953デフォルトの名無しさん
2007/05/08(火) 09:18:390954デフォルトの名無しさん
2007/05/08(火) 09:30:020955デフォルトの名無しさん
2007/05/08(火) 10:26:36と、万年初心者が申しております。
0956デフォルトの名無しさん
2007/05/08(火) 12:24:06今まで生きてきてhrefから貼ってるやつ見たのはじめてだよ
0957デフォルトの名無しさん
2007/05/08(火) 12:25:06みんな恋愛の初心者のボクにアドバイスください> <
0958957
2007/05/08(火) 12:26:31X みんな恋愛の初心者のボクにアドバイスください> <
O 恋愛の初心者のボクにアドバイスください> <
いみわかんねー
0959941 ◆GA6i1P9DC2
2007/05/08(火) 12:51:42仰るとおり、とりあえずLISCから離れることにします。
>>946
そのようですね
>>947
初めはそのようなメッセージも表示されていましたが、"ttp://www9.plala.or.jp/sgwr-t/detail/lsic/install.html"に
従って設定を進めるうちに表示されなくなりました。
>>948
そのようですね。
そもそもこれを使用しようと思ったきっかけは、Cを勉強しようと思って買った本に書いてあったからなんですけどね。
>>945-948
自分なりにも調べてみたのですが、皆さんがお勧めしてしるVC++に関しては、
"ttp://ja.wikipedia.org/wiki/VC%2B%2B"に"最適化度があまりに高いので、開発に熟知していないと使用は危ない"と
記載されていましたので、しばらくの間は遠慮しようと思います。
そして、"ttp://ja.wikipedia.org/wiki/GNU%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3"によると、
GCCというのが、多言語に対応して、かつ、非常に多く利用されているようなので、そちらのほうを利用しようと思います。
>>956
hrefっていうのは、HTMLですよね?
0960デフォルトの名無しさん
2007/05/08(火) 12:54:560961デフォルトの名無しさん
2007/05/08(火) 13:14:13>"ttp://ja.wikipedia.org/wiki/VC%2B%2B"に"最適化度があまりに高いので、
>開発に熟知していないと使用は危ない"と
gccを選んだことについては何も言わないが、
この記述はページの構成を見るとわかるが
聞きかじった最適化ネタと無料版にしか興味のないド素人の記述なんで
鵜呑みにする必要はない。
0962デフォルトの名無しさん
2007/05/08(火) 13:46:35まあいいけど、まずはコードを書いて動かしてみるってとこから
始めるならIDEがいいけどね。コマンドラインは別に覚えればよし
0964941 ◆GA6i1P9DC2
2007/05/08(火) 13:53:25巨大で複雑なソフトの作成に有効とのことなので、そこまでできる技術を身につけたら使ってみようと思います。
0965デフォルトの名無しさん
2007/05/08(火) 13:57:30つっても初心者質問見てるとまともにデバッガ使ってないようなのばかりだけどな。
0967デフォルトの名無しさん
2007/05/08(火) 14:36:050968デフォルトの名無しさん
2007/05/08(火) 14:44:13.NET以降から内部エディタをVimにできなくなって使うのやめた
0969デフォルトの名無しさん
2007/05/08(火) 16:19:42LSI-Cを入れたくらいなんだし片っ端から入れてみては
この板でもVC++とbcc++はスレもあるくらいだし
0970デフォルトの名無しさん
2007/05/08(火) 16:45:35// ソース
#include <stdio.h>
#include <stdlib.h> // srandやrandが含まれる
#include <time.h>
main () {
int ran; // 乱数変数ranを定義
int kai = 0; // 回数変数kaiを初期化
srand (time(0));
ran = rand () %300 + 1; // 1〜300の間の擬似乱数を出力
kai = kai + 1; // kaiは1回毎に1増えるようにする(whileでの回数制御用)
if (kai == 10) { // kaiが10の時、Endと表示し、処理を停止
printf ("End");
}
else { // kaiが10でない時、ranとkaiを表示
printf ("%d\t%d\n",ran,kai);
}
0971デフォルトの名無しさん
2007/05/08(火) 16:47:3013行目のコメントは無視してください
while練習につかったソースの使いまわしなんですorz
0972デフォルトの名無しさん
2007/05/08(火) 16:49:060973デフォルトの名無しさん
2007/05/08(火) 16:49:15kai = kai + 1;
に戻って来れないので無理ですね・・・
お目汚し失礼しました。。。
0974デフォルトの名無しさん
2007/05/08(火) 16:53:58こうだな。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int kai;
srand((unsigned)time(NULL));
for(kai = 0; kai < 10; ++kai) {
int ran = rand() % 300 + 1;
printf("%d\t%d\n", ran, kai);
}
puts("End");
return 0;
}
0975デフォルトの名無しさん
2007/05/08(火) 17:42:47何処が問題なのでしょうか?
#include <stdio.h>
#include <stdlib.h> // srandやrandが含まれる
#include <time.h>
main () {
int ran; // 乱数変数ranを定義
int kai = 0; // 回数変数kaiを初期化
srand (time(0));
ran = rand () %300 + 1; // 1〜300の間の擬似乱数を出力
loop: // ラベル名
0976デフォルトの名無しさん
2007/05/08(火) 17:43:27if (kai == 10) {
printf ("End");
goto end; // 対応したラベル名に移動
}
else {
printf ("%d\t%d\n",ran,kai);
goto loop; // 対応したラベル名に移動
}
end: // ラベル名
return 0;
}
0977デフォルトの名無しさん
2007/05/08(火) 17:51:55珍妙な事は大好きです
因みにCははじめたばかりなので、まだよく解かってません
(専門学校で習ってるんですよ、一年生です)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int kai;
srand((unsigned)time(NULL)); // なんですかこれ><
for(kai = 0; kai < 10; ++kai) { // kaiを初期化、kaiは10より少ない、++kai??
int ran = rand() % 300 + 1; // ranは1〜300の整数乱数
printf("%d\t%d\n", ran, kai); // 変数ranとkaiを表示
}
puts("End"); // Endを吐く
return 0;
}
0978デフォルトの名無しさん
2007/05/08(火) 18:06:23loop:はran = rand() %300 + 1;の前じゃないと。
0979デフォルトの名無しさん
2007/05/08(火) 18:06:31そのコードは書いてある通りに動く。
きっとloop:の位置があなたの想定と違うのだろうけど。
要所要所にprintf()を置く(動きがわからないならもう1行毎でも置く)とか、
デバッガでステップ実行するとかで、自分の思っている通りに動作しているのか確認しましょう。
これを「デバッグ」と言います。
0980デフォルトの名無しさん
2007/05/08(火) 18:24:51ran = rand () %300 + 1;の前にloop:を配置してみましたが、動作は何一つ変わりません
srand (time(0));の前にも置いてみましたが、やはり変わりませんでした
意表をついてint ran;の前に置いたら、予想通りコンパイルエラーが出ました
(´・ω・`)・・・
>>979
確かに書いてある通りに動くのは解かるんです
(というか、書いていない通りに動くプログラムなんてないでしょうし・・・)
Windows Vistaなので、デバッガなんてありませんです
そもそも、このOS、プログラミングをまともに出来ませんから・・・
(学校の指定なので、仕方がないんです
将来的にはVistaが蔓延するよ、何て先生たちは言ってますけど、ありえないですよね
アメリカやEUの事情をきっと知らないんですよ)
取り敢えずprintfで色々やってみようと思います
0981デフォルトの名無しさん
2007/05/08(火) 18:41:53動作が何一つ変わらないってことはありえないんだけど。
0982デフォルトの名無しさん
2007/05/08(火) 18:42:470983デフォルトの名無しさん
2007/05/08(火) 18:43:350984デフォルトの名無しさん
2007/05/08(火) 18:49:39こうですよね?
#include <stdio.h>
#include <stdlib.h> // srandやrandが含まれる
#include <time.h>
main () {
int ran; // 乱数変数ranを定義
int kai = 0; // 回数変数kaiを初期化
srand (time(0));
loop: // ラベル名
0985デフォルトの名無しさん
2007/05/08(火) 18:49:42とかじゃね?
0986デフォルトの名無しさん
2007/05/08(火) 18:50:52kai = kai + 1; // kaiは1回毎に1増えるようにする(whileでの回数制御用)
if (kai == 10) {
printf ("End");
goto end; // 対応したラベルに移動
}
else {
printf ("%d\t%d\n",ran,kai);
goto loop; // 対応したラベルに移動
}
end: // ラベル名
return 0;
}
>>982
VS入ってるけど、BCCでコンパイルしてます
VSエラーはきまくるから嫌い・・・
clにPATH通らないし
>>983
コンパイルはしてあります
ファイルも保存できてます
その辺りに抜かりはないです
0987デフォルトの名無しさん
2007/05/08(火) 18:52:32ファイル名を確認してみましたが、特にそういうことはなかったです
ファイルパスも同じですし間違いないです
なんでだろ・・・
0988デフォルトの名無しさん
2007/05/08(火) 18:52:44流れを掴むのに if-goto で書いてみるのは悪い事ではないけど、
とりあえず先に進んだんでもいいと思うぞ。
0989デフォルトの名無しさん
2007/05/08(火) 18:55:43つvcvars32.bat
0990デフォルトの名無しさん
2007/05/08(火) 19:06:02forやってもいいんですけど
その前にifを、もう少しやりたいんですよね
学校では
printf → int → float → char → if → whileの流れなんですけどね
仰るとおりforは、まだです
因みに、どれも中途半端に習わされているので、色々微妙です
(charがポインタだなんて教えてくれなかったし・・・
int main (void)すら教えてくれなかったから、int main(void)の意味すら解からない
つか、printfよりputsの方がよさそうな気もするし・・・
ifだって&&や||等の符号は教えてくれませんでした)
>>989
まさか、それをPATHに通すんですか?
0991デフォルトの名無しさん
2007/05/08(火) 19:07:090992デフォルトの名無しさん
2007/05/08(火) 19:07:240993デフォルトの名無しさん
2007/05/08(火) 19:07:570994デフォルトの名無しさん
2007/05/08(火) 19:16:04vcvars32.batはPATHを通すコマンドも含まれてるから、それをパスの通ったとこに置いて
コマンドプロンプト起動時に実行すればよし。
0995デフォルトの名無しさん
2007/05/08(火) 19:17:380996デフォルトの名無しさん
2007/05/08(火) 19:23:27そうなんですか?
なんか手元の入門書にはcharはポインタとか書いてるんですが・・・
>>992
どの辺りが駄目なんでしょうか?
>>994
ちょっと見てみます
>>995
流石にそれはないです・・・
0997デフォルトの名無しさん
2007/05/08(火) 19:23:31それじゃ cl.exe 呼んで終了だから、コンパイルすらできない予感
>>990
コマンドプロンプト開く →
vcvars32.bat をコマンドプロンプト窓へドラッグ&ドロップ →
コマンドプロンプトで [Enter]
あとは コマンドたたけ
0998デフォルトの名無しさん
2007/05/08(火) 19:31:33そんな本があるはずない。いや、あって欲しくない
おまえさんの誤読じゃねえのか?
0999デフォルトの名無しさん
2007/05/08(火) 19:32:311000デフォルトの名無しさん
2007/05/08(火) 19:32:33因みに>>986にも書きましたが、コンパイラはBCCをつかっているので
問題なくコンパイルは出来ていますし
CL.EXEを直に動かしたり、ソースファイルをクリックしたり
コンパイルされたexeファイルをクリックしたりはしていません
全部cmdからbcc32 ソース名でコンパイルし
コンパイルされたプログラム名で実行しています
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。