C言語なら俺に聞け(入門篇) Part 11

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・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
2デフォルトの名無しさん:2007/04/17(火) 18:51:27
return 0;
3デフォルトの名無しさん:2007/04/17(火) 18:54:46
int main() {
4デフォルトの名無しさん:2007/04/17(火) 19:04:24
社会人新人研修でcやってるんだけどよー
なんか、配列だのループだので
サインコサインだの、配列の並べ替えだとかやってるわけよ。
要するに9割ぐらいの内容が数学の知識。
そんなの3問やって1日終わり。

おれがそこに行く前にOJTでやってた内容とはマーーったく違うし業務内容からもかけ離れてるわけ。
資格試験のための勉強みてーなかんじ。
おまえ、そんなのわかったら仕様書が書けるのか。仕様書が理解できるようになるのか。
きょうびC使うのか。
第一プログラマー自体大手電機メーカーは中国インドに外注が主流らしいってのに。
こんなわっかり難い書き方のソース出してたら上司に怒られるだろ。

第一!
並べ替えなんか関数があるじゃないいくらでも。。
サインコサインなんか関数があるじゃない。。

って思うのですがCではこんな小難しいのが大事なことなんでしょうか。('A`)
しかもVBみてーに順次デバッグデキネーシうぇうぇwwww
むりwwどこまでいったかわかんえwwwwww




5デフォルトの名無しさん:2007/04/17(火) 19:06:33
派遣?
6デフォルトの名無しさん:2007/04/17(火) 19:09:21
外部新人研修中の正社
7デフォルトの名無しさん:2007/04/17(火) 19:23:04
> 並べ替えなんか関数があるじゃないいくらでも。。
> サインコサインなんか関数があるじゃない。。
実務ではそれを使えばいいんだけど、裏でどうやっているのか知っておくことは悪くない。
特に並べ替えなんて様々な方法がそれぞれ一長一短あり、それを理解するのには自分で書いてみるのも一助になる。
8デフォルトの名無しさん:2007/04/17(火) 19:24:25
空缶回収師にでも転職汁
9デフォルトの名無しさん:2007/04/17(火) 19:27:02
プログラマに必要なのは忍耐力だから、その篩にかけられてるとでも思って我慢しろよ。

しっかし、役に立たない勉強に文句言っていいのはリア中までだぞ
10デフォルトの名無しさん:2007/04/17(火) 19:28:12
うちの大学のある教授がswich-case文を忌み嫌ってて、
if-elseif-else...じゃないとダメって言ってた。
なんか、最適化できないとかなんとか言ってたけど、
swich-case文って良くないの?
11デフォルトの名無しさん:2007/04/17(火) 19:29:21
>>4
>要するに9割ぐらいの内容が数学の知識。
どこが「要するに9割」なのか解らん。
>なんか、配列だのループだの
が数学だと思っちゃうほど算数弱いのか、と思ったが
スレタイが読めないくらいだから国語も弱いんだろうな。
12デフォルトの名無しさん:2007/04/17(火) 19:30:06
>>10
その莫迦 (又は老害)、クビね。
13デフォルトの名無しさん:2007/04/17(火) 19:31:14
>>10
default があるとジャンプテーブル化できないとか聞いたことはあるが、ホンマかいな?
というか、if-else if-else ってそんなに最適化されるのかな?
14デフォルトの名無しさん:2007/04/17(火) 19:33:24
VCならdefault: __assume(0);で基本的にジャンプテーブル化するはず。
15デフォルトの名無しさん:2007/04/17(火) 19:33:58
C言語でRPG作りたいんですが、正直難しいと思います。
でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
C言語の基礎からすべてを叩き込んでくれませんか??
お願いします。
1610:2007/04/17(火) 19:34:20
初心者はよくbreak文を忘れて
バグに悩むから、みたいなことも言ってた
17デフォルトの名無しさん:2007/04/17(火) 19:37:49
>>15
RPGにも色々あるけど
どんなのがいいの?
><DOS画面でもいいですか?
18デフォルトの名無しさん:2007/04/17(火) 19:52:10
>>15
HSPは触ったことないけど、ブロック崩し作れるってことは
HSPってどんなかしらないけどwin32apiの知識もあるって
ことでしょ?違うか?
とりあえず、C言語の基礎なら、WisdomSoftで勉強したら?
そして、まぁとりあえずポインタと配列、構造体、関数ポインタ、etc
を勉強しつつ、win32apiもさわっていじってみる。
そんである程度いじれるようになったら
winprocのメッセージ毎の処理を嫌になるほど処理する。
成す者は常に成り行く者は常に至る!!

ま、気長にね
19デフォルトの名無しさん:2007/04/17(火) 19:57:54
Cなんか消えろ( ´Д` )
20デフォルトの名無しさん:2007/04/17(火) 20:35:39
いやいや、俺が
21デフォルトの名無しさん:2007/04/17(火) 20:41:46
>>18
HSPはapi呼ばなくても、ブロック崩しくらい作れるんじゃね?
22デフォルトの名無しさん:2007/04/17(火) 23:06:25
char *a[10], b[10];

で、aに"あいうえお"、bに"かきくけこ"と入ってる時に、
bの内容をaに代入することはできるのでしょうか?

strcpy(a, b);

だと上手くいかないのですが・・・。
ポインタが・・・ややこしいです
23デフォルトの名無しさん:2007/04/17(火) 23:08:43
char *a[10];
これはchar型へのポインタ配列なので入れられない

char a[10], b[10];
こうすれば両方、char型配列なのでコピーできる
24デフォルトの名無しさん:2007/04/17(火) 23:16:54
>>23
つまり、char *a[10]で定義されるaは、
ポインタの指すアドレスを(違う文字が入ってるアドレスに)変えることでしか、
文字を変えれないということでしょうか?
char *a[10], b[10];で宣言した場合は
strcpy使わないで
a = b;
で単純にコピーしたような感じになるんですかね?
頭がショートしそうなんですが・・・
25デフォルトの名無しさん:2007/04/17(火) 23:19:05
そもそも char* a[10] に "あいうえお"は入らない
26デフォルトの名無しさん:2007/04/17(火) 23:19:31
a は charへのポインタの配列[10]
b は charの配列[10]

コピーできるわけがない。
27デフォルトの名無しさん:2007/04/17(火) 23:19:51
あえて入れるならa[0] = b;とでもしとけ
28デフォルトの名無しさん:2007/04/17(火) 23:20:03
#include <stdio.h>
int main()
{
int array[3][2];
array[0][0] = 10;
printf("%d\n");

return 0;
}

ミスって↑みたいに書いたんだけど何故かコンパイル通った。
しかも実行結果は普通に

10

って表示されたんだが・・・。理由分かる人いたら教えてくれ。
フォーマット指定子の%dに対応する変数や式が無いと、
無意味な整数が生成されるんじゃなかったっけ?
試しに3行目と4行目を消してみたらそんな感じだった。

しょーもない質問で申し訳ない。
29デフォルトの名無しさん:2007/04/17(火) 23:23:09
フォーマット指定子と引数の数が食い違った場合の動作は未定義だから、
その結果として10が出力されたに過ぎない。理由を問うのはナンセンス。
30デフォルトの名無しさん:2007/04/17(火) 23:28:57
未定義って言うのは、結果はなんでもあり、たまたまあなたが期待していた
動作をするかもしれないが、実行したとたんにあなたの鼻から悪魔が出てき
てもそれはそれでOK。

31デフォルトの名無しさん:2007/04/17(火) 23:30:19
>>28
うちの環境でも、array[0][0]の中身が出力された。(数値変えても出る

アセンブラとか良く分からんけど、
たまたまイバチン最後にアクセスしたナントカメモリの中身を吐いたとか、そういう理由では?
どっちにしろ何かを意図してすべきことじゃないし。
もし勘違いだったら、詳しい人フォロー頼みます
32デフォルトの名無しさん:2007/04/17(火) 23:30:25
>>28
一番最後に宣言した配列の先頭を読むみたいだな
理由は知らないけど。
33デフォルトの名無しさん:2007/04/17(火) 23:33:03
偶然スタックが重なっただけだろ。
34デフォルトの名無しさん:2007/04/17(火) 23:35:22
いや、単にスタックに詰まれてただけじゃないの?
3528:2007/04/17(火) 23:39:50
最後にアクセスしたメモリ?スタック?
に10が入っててそれを吐き出した〜って感じなのかな。
何となく疑問は解消した気がする。
みんな色々とレスしてくれてサンクス
36デフォルトの名無しさん:2007/04/17(火) 23:42:00
スタックに入ってるのはarray[0][0]へのアドレスで、
それを参照したら10が入ってたって感じじゃないかな?
37デフォルトの名無しさん:2007/04/17(火) 23:43:48
>>36
いいえ。
printf()が期待したスタック領域が実際に呼び出し側で用意されていなかったので、
呼び出し側のローカル変数が参照されただけのことです。
38デフォルトの名無しさん:2007/04/17(火) 23:45:07
ローカル変数がどうスタックに積まれるか、想像すればピンと来そうだよな。
世の中には変わった積み方もあるんだろうけど。

39デフォルトの名無しさん:2007/04/17(火) 23:49:36
バッファーオーバランによる脆弱性を突いた、クラッキングの
一番初歩的な技につながるのだよね。これって

>>28は参照だけど、アドレスをぶっこめば、クラック用の関数にぶっ飛ばせるよね
40デフォルトの名無しさん:2007/04/17(火) 23:52:51
void world(char *flag2[]);

int main(void)
{
char flag[3][];

world(&flag[0]);
}

なぜエラーなのか分からない。
41ヒント:配列宣言:2007/04/17(火) 23:57:44
>>40
エラーメッセージを読めば判ると思うよ。
42デフォルトの名無しさん:2007/04/18(水) 00:07:06
>>41
ポインタの記述が間違ってるとは分かってるんだが
どうやっても分からない・・・orz
43デフォルトの名無しさん:2007/04/18(水) 00:11:59
char flag[3][];
/*      ^ */
44デフォルトの名無しさん:2007/04/18(水) 00:18:43
仮に char flag[3][5]; としたとすると、

仮引数: char*[]
実引数: char(*)[5]
45デフォルトの名無しさん:2007/04/18(水) 00:26:39
>>44
正しい記述方法はどうすればいいんでしょうか(orz
46デフォルトの名無しさん:2007/04/18(水) 00:28:28
何をしたいのか>>40のコードだけからは読み取れない。
配列のポインタとポインタの配列のどっちを渡したいんだ?
4740:2007/04/18(水) 00:33:47
>>46
配列のポインタです。
48デフォルトの名無しさん:2007/04/18(水) 00:36:10
void world(char (*flag2)[]);
じゃね?
49デフォルトの名無しさん:2007/04/18(水) 14:40:45
キーボードから身長を入力し、
0以外なら2倍の数を表示し繰り返し、
0だったらば処理を終わらせる

これを教えてください
50デフォルトの名無しさん:2007/04/18(水) 14:52:14
>>49
宿題スレへ。
51デフォルトの名無しさん:2007/04/18(水) 15:22:04
>>49
int height;
while(1) {
    scanf("%d", &height);
    if(height==0) break;
    printf("%d", height * 2);
}
52デフォルトの名無しさん:2007/04/18(水) 16:09:55
>>40
まず 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言語では配列全体を表す名前は
配列の先頭要素へのポインタになるため)。
53デフォルトの名無しさん:2007/04/18(水) 17:36:27
>>40
もう一つ書いておこう。
char flag[3][5]; と宣言された配列をそのまま func(flag) のようにして
他の関数の引数で渡したい場合は void func(char flag2[][5]); または
void func(char (*flag2)[5]); になる。つまり下のレベルの要素数が
5であることは省略できない。というか、省略可能なのは一番上のレベル
だけだ。
54デフォルトの名無しさん:2007/04/18(水) 18:54:02
文字の配列から、ある文字の場所を探してくれるstrchr関数みたいに、
int型の1次元配列から、ある数値を探してくれる関数ってある?
55デフォルトの名無しさん:2007/04/18(水) 19:13:05
>>54
残念ながら無い
56デフォルトの名無しさん:2007/04/18(水) 19:33:27
では、for文でぐるぐる回してifで同値breakしますね

int 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};
みたいに逆に求められる配列を用意しておくべき?
57デフォルトの名無しさん:2007/04/18(水) 21:08:38
>>54
これでもお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;
}
58デフォルトの名無しさん:2007/04/18(水) 21:36:24
>>54
ソート列なら bsearch があるけど。
59デフォルトの名無しさん:2007/04/18(水) 22:35:06
質問です。
gcc4.1.2を使用しています。

以下のようなコード
switch(i){
case 100:
int a=10;
printf("%d\n",a);
break;
}
をコンパイルすると
"expected expression before 'int'"
とエラーが出ます。

caseの直後に変数宣言があるためのようです。

コードには問題ないように思うのですがこれはなぜでしょうか?
よろしくお願いします。
60デフォルトの名無しさん:2007/04/18(水) 22:40:33
>>59
Cではブロックの先頭でしか変数宣言は出来ない
61デフォルトの名無しさん:2007/04/18(水) 22:44:04
ラベルもおけなかったのか。これは知らなかった。

6259:2007/04/18(水) 22:46:05
>60

これだったら問題なくコンパイルできます。
switch(i){
 case 100:
  printf("yes\n");
  int a;
  printf("%d\n",a);
 break;
}

これはC++的な解釈をしているせいですか?
どちらにしても>59がエラーになる理由を知りたいです。
63デフォルトの名無しさん:2007/04/18(水) 22:46:30
switch(i){
case 100:
{
int a=10;
printf("%d\n",a);
}
break;
}
64デフォルトの名無しさん:2007/04/18(水) 22:47:18
ラベルは構文上「ラベル付き文」という文の一種の一部。
ラベル付き文は、ラベルとその直後に続く文からなっている。
65デフォルトの名無しさん:2007/04/18(水) 22:47:43
>>62
それはgcc拡張。
C99でもブロック先頭以外でも変数を宣言できるが、
変数宣言は文ではないからラベルをつけることは出来ない。
66デフォルトの名無しさん:2007/04/18(水) 22:52:40
以下2つは問題ありませんでした。

switch(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の直後の変数宣言が問題のように思います。
不思議だ・・・
67デフォルトの名無しさん:2007/04/18(水) 22:58:30
終了条件が"end"を入力したら終了ってプログラムつくりたいんですが
strcmp()関数つかう以外に方法ってないですかね?
68デフォルトの名無しさん:2007/04/18(水) 23:02:55
>64,65
なるほど、そういうことでしたか。
以下でもエラーになることを確認しました。
a100:
  int a;
  printf("%d\n",a);
  goto a100;

>63
エラーが発生しないことを確認しました。
これはブロックに対してラベルを張るって感じなんですかね。

>60-65
納得できました。
大変勉強になりました。ありがとうございました。
69デフォルトの名無しさん:2007/04/18(水) 23:04:43
-ansi -pedantic -Wall あたりをつけてコンパイルしとけよ
70デフォルトの名無しさん:2007/04/18(水) 23:08:01
>>67
char 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);
}
71デフォルトの名無しさん:2007/04/18(水) 23:10:56
>>70
-1 いらんだろ
72デフォルトの名無しさん:2007/04/18(水) 23:14:01
buf[3]=='\r'もmemsetも余計
73Cくん:2007/04/18(水) 23:32:51
柴田望洋の明快C言語と解きながら学ぶC言語を終了しました。
ほぼ理解はできました。
次の勉強本としてはどのようなものがお勧めですか?
一応、明解C言語実践編を買ったのですが、
そろそろなにか作りながら学びたいと思ってます。
お勧めの本はありますでしょうか?
74デフォルトの名無しさん:2007/04/18(水) 23:34:16
>>73
作りたいものを決めてから、どの本を買うかきめたら?
75Cくん:2007/04/18(水) 23:36:31
時計とか身近な物が作りたいです
76デフォルトの名無しさん:2007/04/18(水) 23:37:18
PICに関する本がオススメだ
77Cくん:2007/04/18(水) 23:39:47
ぬおーーがんばる!!
78デフォルトの名無しさん:2007/04/18(水) 23:43:47
>>75
OSがWindowsなら、プログラミングWindowsとか。
高いけど、CでWindowsの本って、ほかにはあんまりなさそうな気がする。
79デフォルトの名無しさん:2007/04/18(水) 23:46:24
C++なら「インサイドVisualC++」と「MFCによるWindows95プログラミング」だけど、新しいバージョンに対応した本がでてるか分からない。
80デフォルトの名無しさん:2007/04/18(水) 23:55:56
>Cくん
まずはWindowsの画面をCで表示してみ。
それができんと時計作れんし
Win32API SDK とかで検索してみ。
81デフォルトの名無しさん:2007/04/19(木) 01:02:04
>>80
おまえドSだろ
82sage:2007/04/19(木) 02:18:22
よろしくお願いします。

cで作ったDLLをVB.netで呼び出すにはどのようにしたらいいのでしょうか
教えて下さい
83デフォルトの名無しさん:2007/04/19(木) 02:20:01
82です

すみません、名前にsageって入れちゃいました
84デフォルトの名無しさん:2007/04/19(木) 04:03:27
>>82
VB.netのスレで聞け
VB.netで呼び出せるDLLの呼び出し方法はその製作言語に依存しない
呼び出す方法は呼び出す側の問題
85デフォルトの名無しさん:2007/04/19(木) 04:14:07
実数の割り算をするときって
分母がぴったり0.0かどうかを判定すればいいんですか?
それとも±0.00001以内とかのほうがいいんですかね?
86デフォルトの名無しさん:2007/04/19(木) 04:18:38
close_at_toleranceでググれ
87デフォルトの名無しさん:2007/04/19(木) 07:37:04
実数の0除算なら正負の無限大かNaNになるだろ。
88デフォルトの名無しさん:2007/04/19(木) 17:49:41
NaNを検出するような関数ないですか・
89デフォルトの名無しさん:2007/04/19(木) 17:53:49
isnan()
90デフォルトの名無しさん:2007/04/19(木) 17:59:36
_isnan(d)
math.hかfloat.hをインクルード
91デフォルトの名無しさん:2007/04/19(木) 18:01:08
dってなんだ
doubleね
92デフォルトの名無しさん:2007/04/19(木) 18:06:30
C99でisnanがマクロとして追加されてたんだね
93ど素人:2007/04/20(金) 01:13:07
29歳ひきこもり、資格・職歴無しです。
就職のこと考えたのですが、プログラムとか知識あれば、食っていけますか?
今の生活だと、パソコンくらいしか触れて無いので。
プログラムの勉強始めようかな?とか思って。
94デフォルトの名無しさん:2007/04/20(金) 01:15:58
ひきこもるような人間がプログラムに限らずなにかを勉強してものにすることなんかできないよ。
どうせ途中で投げ出すことになるんだから、はじめからやらないほうがましだろ。
95デフォルトの名無しさん:2007/04/20(金) 01:30:52
おれもド素人の24歳資格なしバイト生活
プログラム歴は1ヶ月でなんとか理解してきて
やっと「3+5は8です」って表示できるようになったよ
自分ではすごく感動したんだけどやっぱりまわりと比較するとセンスなくてだめみたいだね
でもこのスレ見ながらなんとかついていこうとしてる
おれにとってはレベル高いけど少しずつ理解できるようになってきたように感じる…
食っていけるかわからないけど努力すればできるようになるとは思う
9685:2007/04/20(金) 01:34:47
isnan()なんてものがあったんですね。
ぴったり0で除算した場合の結果がINFになるのはわかるのですが、
限りなく0に近い値で割った場合の結果というのは
誤差というか精度的には問題ないんですか?
97デフォルトの名無しさん:2007/04/20(金) 01:44:27
>>93
あなたには、農村などでの自給自足の生活が適していると思われます
プログラムだけで生きていくことはできませんが、
食べ物を自給自足できるなら生きて行くことはできるでしょう

農協はある程度の常識と交渉スキルが無いと食い物にされますので
あなたは農協とは間違っても関わりを持たないように気をつけて!

(プログラムはそれ自体では何の役にも立ちません
あなたの作るプログラムを使うことによって何らかの価値を生み出すことができるかどうかが問題です)
98デフォルトの名無しさん:2007/04/20(金) 03:18:27
>>96
そりゃ除数がDBL_MINとかなら0で除算しなくてもINFになる可能性は高い。
でもINFになった時に元の除数を見てそれが0でなければ0除算による結果ではないと分かるじゃないか。
演算の結果だけでなくその演算のオペランドも確認していけばどこで精度が落ちたか分かる。
あと、isnanつながりでfpclassifyがあるのでINFやNaNや非正規化数、0なんかを区別できるようになる。
99デフォルトの名無しさん:2007/04/20(金) 04:49:27
文字列の配列を動的に作る関数(javaのsplitみたいなやつ)を作ったのですが、
その関数で作られた配列の長さってどうやって求めればいいのでしょうか?
100デフォルトの名無しさん:2007/04/20(金) 06:52:35
>>99
char**を返す関数ってことだよね?
文字列配列を作った関数しかそれを知らないから、
配列とその要素数を返すようにしてやるか(関数は配列を返して、要素数は引数で返してもらう等)、
配列の最後にNULLを入れた要素を追加して返してやり、NULLが出るまで配列を走査するか。
101デフォルトの名無しさん:2007/04/20(金) 08:06:54
>>93-95
人月単価安ければ、コミュニケーション能力に問題ありでも仕事あるんじゃない?
おいらのプロジェクトでも
日本語ほとんどしゃべれない中国人 人月単価40万円でいるから
(日本語できる優秀な中国人との抱き合わせでだけど・・・)」

でも日本人で、プロジェクトを取り纏めれるようになれば人月100万ぐらいはいけるよ
102デフォルトの名無しさん:2007/04/20(金) 08:09:01
そういう話はマ板でやれ
103デフォルトの名無しさん:2007/04/20(金) 10:36:36
猫でもわかるプログラミングで勉強しています。
C言語編第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を使っています。
104デフォルトの名無しさん:2007/04/20(金) 10:54:58
>>103
time_t が64bitだから
%ld を %lld にしてみ
105103:2007/04/20(金) 11:22:20
>>104
0ではなくなりました。
ありがとうございました。
106デフォルトの名無しさん:2007/04/20(金) 12:47:15
質問です。
VC6.0でC言語で一個DOS上で動くアプリケーション作ったんだが
これデータベース接続するにはどうしたらいい?
使うのはOracleで、
とりあえずSQL文書く知識だけはあるんですが。
OO4Oとかいうのを使ってみたいんだがググってかなり調べてみたんだがもうちんぷんかんぷん
まず何をすればいいんだ…
107デフォルトの名無しさん:2007/04/20(金) 12:57:38
>>106
こんにちは。
そりゃDOSで動かそうとするとちんぷんかんぷんだろう。
OO4OはActiveXだから、さくさく作るならVBの参照設定にチェックを入れて
ADO経由で画面に貼り付ける(だったかな?うろ覚え)
DOSからやろうとすると素人では先ず無理。ActiveXの仕組みを全部C/C++で書かなくちゃいけない。
もちろん、OO4Oはインストールしてあるんだよね。
108デフォルトの名無しさん:2007/04/20(金) 13:03:37
レスありがとうございます!!(ノД`)
OO4Oはインストールしてあります。
ActiveXですか。あんま知識ないんでよくわからないですが、
VBの参照設定にチェックとはどういうことでしょう?
C言語で作成したのですがVBも関係あるのでしょうか。
幼稚な質問で申し訳ないです;
109デフォルトの名無しさん:2007/04/20(金) 14:08:14
>>108
OO4Oは
・VB用のタイプライブラリ
・C++用のクラスライブラリ
の2種類あるが、どちらもCから呼び出すようにはできていない。
なので
  ・C++ で、クラスライブラリを使用する関数を作成し
   C のコードから呼び出す。
ことになる。

どうしても C だけで、ということであれば、
OO4Oを捨てて Pro*C を使う手もある。
110デフォルトの名無しさん:2007/04/20(金) 14:22:43
Pro*Cは使いこなすのが難しいときいたのでOO4Oにしようと思ったのですが。

>・C++ で、クラスライブラリを使用する関数を作成し
> C のコードから呼び出す。

クラスとかそういうのを使うのはJavaで少しかじった程度ですが、
とりあえずこれに挑戦してみます。
ありがとうございます。
111デフォルトの名無しさん:2007/04/20(金) 14:31:09
Cを勉強し始めて簡単なものなら作れるようになったのですが、
ソースがどうしても長く汚くなってしまいます。
文法の入門書とかではなくて、見やすいソースにしたり、綺麗に書くこつとか
業界のスタンダードな書き方みたいなそういう本や解説しているサイトありませんか?
例えば私がある関数を作ると
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行でした。
112デフォルトの名無しさん:2007/04/20(金) 14:33:23
>>111
気にスンナ
switch 〜 case はどうしても長くなる。
なんでもかんでもswitch 〜 caseにしてしまうのなら
そっちを気にしてみれば
113デフォルトの名無しさん:2007/04/20(金) 14:40:40
>>111
可能なら、caseごとの処理を別の関数にすればいい。
ポイントは、引き数を極力少なくできるポイントで分けること。
#具体例を書こうと思ったが、余りにやっつけなコピペなんで断念。
114デフォルトの名無しさん:2007/04/20(金) 14:57:03
>>112
if elseよりはまだ短くできるかなと思ったのですが、確かに乱用してる感はあります。
そのあたり気をつけてみます。ありがとうございました。

>>113
なるほど、さらに細かくしちゃうんですね。名前考えるのが大変ですね・・・
あまり再利用しないものは関数にしてなかったんですが、試してみます。
ありがとうございました。
115デフォルトの名無しさん:2007/04/20(金) 15:29:46
もしくは#defineでまとめとくのもあり
116デフォルトの名無しさん:2007/04/20(金) 16:02:52
実用プログラムはソースの大半が退屈なエラー処理の連続だ。
教科書の例題はそれを省いてるから短く見通し良く見えるだけの話で。
117デフォルトの名無しさん:2007/04/20(金) 17:02:34
>>100
そうです。今は仰るように引数で返してもらうようにしてたのですが、
ちょっと強引かと思うんで、走査の方も試してみます。
ありがとうございました。
118デフォルトの名無しさん:2007/04/20(金) 17:28:38
走査のが強引な気がするが。
構造体にしちゃいかんの?
119デフォルトの名無しさん:2007/04/20(金) 17:31:01
学校の宿題でむずそうな課題が出たのですが
誰か相談に乗ってくれませんか。ヒントとか教えていただけたらうれしいのですが
[email protected]へお願いします
120デフォルトの名無しさん:2007/04/20(金) 17:31:44
それはむずそうだな
121デフォルトの名無しさん:2007/04/20(金) 18:17:34
>>119
個人で相談に乗ってくれる人はいないんじゃないか?
丸投げしたいのなら
C/C++の宿題を片付けます 86代目
http://pc11.2ch.net/test/read.cgi/tech/1176996941/
丸投げではなく自分のためにも理解したいのならここで
アップローダ使ってソースもしくは問題文を提示すると教えてもらいやすいよ

最後に釣りなら帰れ
122デフォルトの名無しさん:2007/04/20(金) 18:24:41
>>118
なるほど。頭固かったです。
構造体でも全く問題ないです。
ありがとうございました。
123デフォルトの名無しさん:2007/04/20(金) 18:48:19
ソースを細分化して見やすくしたいんだけど、
よくつかう処理なら2、3行のものでも関数にすべき?
124デフォルトの名無しさん:2007/04/20(金) 18:51:50
>>123
そのほうが楽じゃない?
仮になんらかの問題で修正するとき関数にしてなかったらすべてを修正しなきゃいけないし
#define 使うって手もあるけど
125デフォルトの名無しさん:2007/04/20(金) 19:06:09
>>124
>#define 使うって手もあるけど
勘弁してくれ。
126デフォルトの名無しさん:2007/04/20(金) 19:08:09
#defineつかう手はねーな
127デフォルトの名無しさん:2007/04/20(金) 19:19:46
#define で、fore だなw
128デフォルトの名無しさん:2007/04/20(金) 19:45:17
>>125-126
あれま、やっぱだめか

>>123
#define なしで
129デフォルトの名無しさん:2007/04/20(金) 20:02:14
ccmathのdeqsy関数の引数の意味って分かりますか?
マニュアル読んでもちっとも理解できません。
お願いします。
130デフォルトの名無しさん:2007/04/20(金) 21:08:09
#defineの何が悪い!
131デフォルトの名無しさん:2007/04/20(金) 21:17:49
決まった長文(ヘルプとか)しか表示しないprintfなんかはよく#defineで短くしちゃうんだけどなあ
132デフォルトの名無しさん:2007/04/20(金) 21:51:45
最近の最適化コンパイラはstatic関数を積極的にインライン化しようとするから、
マクロでなければならない場所以外は関数でかいときゃいいだろ。
133デフォルトの名無しさん:2007/04/20(金) 22:20:42
オライリーのC実践プログラミングという本で一通り勉強したんですが
少し消化不良な感じがします。
入門書とその次に読む本でお勧めのがありましたら教えてください。
134デフォルトの名無しさん:2007/04/20(金) 22:27:43
Visual C++.net Version2003 で実行した瞬間画面が消えるのを
防ぐにはどうしたらよいのでしょうか?
135デフォルトの名無しさん:2007/04/20(金) 22:30:01
たとえばデバッグなしで開始を使用するなど
136デフォルトの名無しさん:2007/04/20(金) 22:37:56
>>134
情報が少ないな

コンソールとかコマンドプロンプトとかは分かるレベル?
それとも窓作ってるのに一瞬で終了?
137デフォルトの名無しさん:2007/04/20(金) 22:41:12

main.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;
}
138デフォルトの名無しさん:2007/04/20(金) 22:41:53
>>134
たしか、どっかに消えないようにするオプションがあったよ。
設定関係を探しまくれば見つかるんじゃね?
139137:2007/04/20(金) 22:44:08
ソースのように線形リストを追加するプログラムを書いたのですが、
addUser関数から戻ってきた後、headのアドレスがNULLに戻ってしまいます。
head = addlistでアドレスを書き換えたと思うのですが、
なぜNULLに戻ってしまうのでしょうか?
ちなみにaddUser関数はmain関数内部から呼び出しています。
140デフォルトの名無しさん:2007/04/20(金) 22:46:20
134ですが・・

printf("hllo");

を実行すると消えます。
14185:2007/04/20(金) 22:50:33
>98
INFやNaNの発生に関して認識が間違ってるかもしれませんが、考えるに
非常に大きい分子に対して分母が0に近いような場合でも、
結果が与えられたビットで表せなければ、ぴったり0でなくてもINFになる、ということですね。

これまではあまり考えず、割り算の前に分母が0に近くないかをチェックしていたのですが、
ふと、ぴったり0かどうかをみるだけでいいんじゃないか?って気がしてきたので質問させてもらいました。

おっしゃるようにisnan()とかを使って問題が発生した場合のみ処理を変えたほうが、
計算精度という意味では良さそうですね。
勉強になりました。どうもありがとん。
142デフォルトの名無しさん:2007/04/20(金) 22:59:42
>>140
1. コマンドプロンプトから実行する
2. main の return の前に、 getchar() とか入れる
143デフォルトの名無しさん:2007/04/20(金) 23:03:55
>>142
最後の行にブレイクポイント入れるのが簡単じゃね?
144デフォルトの名無しさん:2007/04/20(金) 23:06:13
getchar()  入れると消えないですね。
ありがとうございました。
145デフォルトの名無しさん:2007/04/21(土) 01:08:55
領域の確保と解放の仕方は下記の通りで正しいですか?

char **table = (char **)malloc(256);

free(table);
146デフォルトの名無しさん:2007/04/21(土) 01:11:32
>>145
正しいと言えば正しいけど、微妙に間違っていると言えば間違っている。

取り敢えずmallocとfreeの使い方は間違いではない。
が、mallocに渡している256って何? って話にはなる。
そこにはsizeof(char*)の整数倍の値が入らなければならないのではないのか。
147デフォルトの名無しさん:2007/04/21(土) 01:17:08
>>146
やはりこの辺りの理解が足らないみたいです。
ちなみにリスト構造のダブルポインタでも同じように
領域確保するのでしょうか?

typedef struct{
 int a;
 char b;
} LIST;

LIST **list = (LIST **)malloc(sizeof(LIST *) * 256);
148デフォルトの名無しさん:2007/04/21(土) 01:55:34
とりあえずリスト構造について勉強してからの方が・・・
149デフォルトの名無しさん:2007/04/21(土) 02:02:20
/* 2次方程式 a * x^2 + b * x + c = 0 の解を求めるプログラム */

#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);

次レスへ
150デフォルトの名無しさん:2007/04/21(土) 02:04:52
if (d > 0.0)/* 判別式D>0 */
{
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;
}

このようなプログラムを書いてみたのですがもうちょっとすっきりさせることは可能でしょうか?
個人的には無駄に長いなあと思ってしまうのですが。
151デフォルトの名無しさん:2007/04/21(土) 02:15:35
何をどうすっきりさせたいのかわからないけど、
判別式を計算する関数
解を導く関数
に分ければ少なくともmainはスッキリ
152デフォルトの名無しさん:2007/04/21(土) 02:28:46
>>137
int a=0;
hoge(a);

void hoge(int a){
 a=1;
}
ってやっても呼び出し元のaは変化しないのはわかるよな。

で、137のソースを↓を使って書き換えてみて。多分これでわかると思う。
typedef LIST* PLIST;
153137:2007/04/21(土) 03:24:44
>>152
ありがとうございます。変数headはポインタですが、
この場合addUser関数に対して参照渡しとならないのでしょうか?
154デフォルトの名無しさん:2007/04/21(土) 03:38:04
cには参照渡しがないので、ポインタだろうと値渡しされる。
155デフォルトの名無しさん:2007/04/21(土) 03:39:43
>>151
入力関数も分けておこうや。
156137:2007/04/21(土) 03:45:51
>>154
参照渡しまでも勘違いしているかも…。
headにはアドレスが渡り、そのアドレスが
NULLから別のアドレスに変わると思っていました。
値渡し…よく分からなくなってきました。
157デフォルトの名無しさん:2007/04/21(土) 04:05:45
>>151のソースをいじっていたら
すっきりどころか無駄に長くなったように見える
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3847.txt
158デフォルトの名無しさん:2007/04/21(土) 04:11:25
いんや、元のよりはずっとわかりやすいよ。

ただし
 else if (d == 0.0) /* 判別式D=0 */

 else if (pSolutions->d == 0.0) /* 判別式D=0 */
はいただけない。とは思うものの宿題レベルだからこれでいいのかな…。
159デフォルトの名無しさん:2007/04/21(土) 05:02:44
>>156
先ずは>152で指摘されたことをやってみよう。
160デフォルトの名無しさん:2007/04/21(土) 07:12:34
>>158
>いんや、元のよりはずっとわかりやすいよ。

だから「ように見える」と言ったわけで。
「無駄に長い」という言葉から察するに
おそらく>>150の期待していたすっきり感には当てはまらないだろうが、
可読性はそういう初心者の主観的直観的なものとは別のところにあるということを匂わせたつもり。
161デフォルトの名無しさん:2007/04/21(土) 15:52:00
線形リストを再帰関数を使って全削除するプログラムを考えているのですが、
currentの直前のリストの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;
 }
}
162デフォルトの名無しさん:2007/04/21(土) 16:04:41
>>161
えーと
void foo(int bar) {bar = 1;}
があったときに

int baz = 10;
foo(baz);
printf("%d", baz); // 10が出る

のと同じ理由でそれでは直前のnextにNULLは入りません。
多分、deleteAllList(baka->next);って呼んでるんだよね。

LIST型が双方向リストじゃない限りその関数の中から直前の
ポインタを求めることはできないから(始点を別に持ってたら別だけど)、
ひとつまえのポインタを渡すようにしてやればいいんじゃないかな。
163デフォルトの名無しさん:2007/04/21(土) 16:10:49
こんな感じ。関数の冒頭で
current = nodeとなっているのをcurrent = node->next;に書き換え、
current = NULL;とやっているところを、node->next = NULL;
に書き換えればいい。

もちろんdeleteAllListを呼んでいるところは全部ひとつ前のポインタを
渡すように書き換える必要がある。deleteAllList(baka->next);とやっていたとしたら、
deleteAllList(baka);のように。
164デフォルトの名無しさん: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);
}
165デフォルトの名無しさん:2007/04/21(土) 20:20:20
>>164
>コンパイルしようとすると変数のtypeが違うかconflictingがどうとかでます

せっかくコンパイラが親切に、エラー内容を教えてくれてるのに
無視しないで具体的に書いてよ
166デフォルトの名無しさん:2007/04/21(土) 20:26:33
>>164
ついでに言うと、どう直せばいいのか以前に無茶苦茶すぎる
おとなしく基本から順にやった方がいいよ

・main の戻り値を float じゃなくて int にする
・verlet の定義の最後の } の後の ; はいらない
・verlet に return がない
・以下の部分は main の中に移動
>vf=1;
>dt=0.01;
>now=vf*dt-1;
>past=-1;

などなど
167デフォルトの名無しさん:2007/04/21(土) 20:44:04
どこ直すとかっていうレベルじゃねーっていうか、ほぼ全行に突っ込み所あるのって珍しいぞ。
とりあえず数時間まともに入門サイトでも読んできたら?
168デフォルトの名無しさん:2007/04/21(土) 22:07:48
>>163
指摘の通り、前のリストのnextを持たせてやる事で
NULLを入れてやることができました。
ありがとうございました。
169デフォルトの名無しさん:2007/04/21(土) 22:31:54
>>164
これは釣りか?釣りなのか?
マジなら、まず人のソースを読め。
#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; /* 今のうちは付けとけ */
}
170デフォルトの名無しさん:2007/04/21(土) 22:35:25
>>169の本人です。このたびは偉そうにソースを晒してすみません。
元はといえば、甘やかして育てた母が悪いのです。
でも、立派な社会人で幸せな家庭を築いていますので、許してやってください。
171デフォルトの名無しさん:2007/04/21(土) 22:35:55
こういうレベルでCを使うならなら、
浮動小数点数は常にdoubleを使っておけばよいと思う。
172デフォルトの名無しさん:2007/04/22(日) 00:02:11
変数名ってもしかして頭文字が数字だったらダメなの?
173デフォルトの名無しさん:2007/04/22(日) 00:03:35
当然
174172:2007/04/22(日) 00:08:19
/(^o^)\ナンテコッタイ

>>173
即レスアリガトン
175デフォルトの名無しさん:2007/04/22(日) 00:28:46
------------------
a.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に挿入

するプログラムのソース作れる方いますか?
176かなり初心者:2007/04/22(日) 00:35:00
#include <stdio.h>#include <stdlib.h>
void 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」と表示されないようにしたいです。
どなたか教えてください。
177デフォルトの名無しさん:2007/04/22(日) 00:53:08
>moji(x);

>if (x<0){break;}
を入れ替えたらいいんじゃね?
178164:2007/04/22(日) 02:01:56
>>165 >>166 >>167 >>169

ありがとうございます。ホンマすいません。今大学4回生で研究室配属になって
同級生たちは皆プログラムできるから基礎の説明とばされて、課題だされてちょっと勉強してやってみたんですが
こんなアリサマでした・・・。提出火曜で(出題は金曜)土日は研究室にだれもいなくてきけなくて困ってたのです。。。

returnの使い方がいまいち分からないのですがあとは分かった気がします。returnは数学でいうところの
f(x)=の部分ってことで、プログラムの関数のカッコの中が数学でいうところの関数の中身って感じでいいんですかね。。。
179デフォルトの名無しさん:2007/04/22(日) 02:04:42
つっこみたいけどまぁいいや
180デフォルトの名無しさん:2007/04/22(日) 02:23:07
まあ、似たようなもんだ。
181デフォルトの名無しさん:2007/04/22(日) 02:24:59
即席で使えるレベルまで覚えさせるつもりだった言語がCってまたハードだな
182デフォルトの名無しさん:2007/04/22(日) 02:34:32
春休みの内に何とかしておくべきだったな
183デフォルトの名無しさん:2007/04/22(日) 03:06:53
2147483647+1 = -2147483648

このようになる理由がわからない。教えてください。
184デフォルトの名無しさん:2007/04/22(日) 03:14:23
7fffffff+1 = 80000000
185デフォルトの名無しさん:2007/04/22(日) 03:38:14
>>183
2^31=2147483648
2^32(値の上限は2^32-1)を2進数で表して、先頭の32桁目を1か0で符号として扱い
+-で半分に分けて使っていることに関して理解していりゃ、あとは
>>184 の理屈で16進数に置き換えて -2^31 が 80000000
FFFFFFFF が-1というのが分かれば良いかと。
186デフォルトの名無しさん:2007/04/22(日) 03:49:57
すいません

3×3のマスでたとえば
 111
1□□□
1□□□
1□□□
となっていればこれの条件を満たすのは
 111
1■□□
1□■□
1□□■
 111
1□□■
1□■□
1■□□

となりますがこのように縦横彫るマスの数だけを与えて
それを満たすすべてのパターンを出力ってできますか
187デフォルトの名無しさん:2007/04/22(日) 03:55:14
4×4など大きくなっても対応できるように、お願いします
ピクロスではありません。
188デフォルトの名無しさん:2007/04/22(日) 04:14:28
枝刈りのない全数探索ならそんなに難しくはないと思うが。
その横軸と縦軸に並んでいる数字も変化するんだよな?
189デフォルトの名無しさん:2007/04/22(日) 05:40:19
ちょっとやってみてるけどややこしいwww
190デフォルトの名無しさん:2007/04/22(日) 07:46:58
ちょっとやってみた。単純に総当たり。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3851.c
なんか上手いやり方ないんかな。
191189:2007/04/22(日) 07:54:14
>>190
速いなー。なんかおれ、気づいたらビールを飲み始めてしまっていてリタイアw
てかなんかおれの書きかけのコードよりはるかに短い…。
192デフォルトの名無しさん:2007/04/22(日) 18:01:32
#include <stdio.h>
int 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だと思ったんですが違うようで・・お願いします
193デフォルトの名無しさん:2007/04/22(日) 18:02:58
>>192
static int a=0;は一度しか初期化されない
2回目以降は前回の値を保持している
194デフォルトの名無しさん:2007/04/22(日) 18:04:33
>>193
一度しか初期化されないんですか。謎が解けました!。ありがとうございました
195デフォルトの名無しさん:2007/04/22(日) 18:38:01
>>194
static変数とグローバル変数だけだぞ。

int func(void){
int a=0;
return ++a;
}

だと、関数が呼び出される度にa=0で初期化されるからな。念のため
196デフォルトの名無しさん:2007/04/22(日) 18:48:25
>>195
了解しました。auto変数は毎回初期化されるんですね
197デフォルトの名無しさん:2007/04/22(日) 19:16:37
正確には「自動で初期化はされないから自分でやれ」
198デフォルトの名無しさん:2007/04/22(日) 20:17:42
関数内のstatic変数は、スコープ(可視範囲)が関数内であるだけで、外にあると
思うと分かりやすいかな。
その関数専用で外部に見せる必要がない管理データを持つのに使ったりする。
199かなり初心者(176):2007/04/22(日) 22:35:34
>>177さんありがとうございました
しかし、どうして入れ替えただけでいいんでしょう?
まったく基礎ができてないやつです。
200デフォルトの名無しさん:2007/04/22(日) 22:54:06
>>199
プログラムは基本、上から順に実行されるんだから
上から順に追っていってみなよ
201199:2007/04/22(日) 23:12:41
>>200さんありがとうございます。かなり基本的なこと聞きます。
int mainの中に入れないといけないプログラムと
{}の外に書くプログラムの違いってなんですか?
参考書見てまんま書き写しているだけなんで、教えてください。
202デフォルトの名無しさん:2007/04/22(日) 23:26:29
一般的には特定の処理をする部分を分けて書いた方が見通しがいいから
別の関数に書き出してそれをmain関数から呼び出すことで特定の処理をmain関数から追い出す
後で再利用することもできるので何度も書く手間も省ける
203デフォルトの名無しさん:2007/04/22(日) 23:50:21
>>201
教えようにも、君に分かるように教えるのはたぶん無理

足し算引き算すら知らない幼稚園児に、高校数学の微積を教えることが出来るか?
そーいうことだ
204デフォルトの名無しさん:2007/04/23(月) 00:41:38
>>202
うちじゃへぼSEのせいで1プロジェクトが終わっても再利用できるものは何もないという有様w
205デフォルトの名無しさん:2007/04/23(月) 01:35:16
>201
>int mainの中に入れないといけないプログラムと
>{}の外に書くプログラムの違いってなんですか?

main関数とは限らないけどソースに直接書くのは
宣言か関数定義だけ。
関数の外に文を書くことはできない。
行頭が#で始まる。プリプロセッサ命令はC言語の文法とは全く別。
206デフォルトの名無しさん:2007/04/23(月) 02:40:40
お前らの突っ込みはもっともだけど、多少はエスパーしてあげようよ…
207デフォルトの名無しさん:2007/04/23(月) 02:51:19
だがこの辺を説明しようとすると、うぜえ、よそへいけ、
って一斉につっこみが入るくらい長文かつややこしい説明になるんじゃないかなあ…
208デフォルトの名無しさん:2007/04/23(月) 06:02:23
そんなコードが参考書に載ってるとはとても思えんな。。。
209デフォルトの名無しさん:2007/04/23(月) 12:28:03
多分、参考書はソース全体を書いてあるんじゃなくて
一部を抜粋してるだけなんじゃないかな
それをmainの外だと勘違いしてるのだと思う
210デフォルトの名無しさん: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;
}
211210:2007/04/23(月) 13:00:39
f(x,i)
212デフォルトの名無しさん:2007/04/23(月) 13:03:29
>>210
らめぇ
213デフォルトの名無しさん:2007/04/23(月) 13:30:41
>>210
一概には言えない。そのコードの場合は、それ以前の段階でダメ。
214デフォルトの名無しさん:2007/04/23(月) 14:43:14
メモリ確保せずに構造体の中身弄るなんてなかなか感じさせてくれるじゃない
215デフォルトの名無しさん:2007/04/23(月) 15:24:23
オマイ等のお陰で、C言語の基礎が概ね理解できた。
今、専門学校でデータベースやXMLやっててCやったせいか理解しやすい
皆、ちんぷんかんぷだ。俺はすんなり入る。
オマイ等、サンクス!オマイ等に光あれ!
216デフォルトの名無しさん:2007/04/23(月) 15:38:26
おれアンデッドだから、光はちょっと勘弁。
217デフォルトの名無しさん:2007/04/23(月) 16:10:44
>>215
それはお前が頑張った証拠だ
感謝するなら自分のやる気に感謝しとけw
218デフォルトの名無しさん: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++;}}
219デフォルトの名無しさん:2007/04/23(月) 17:17:08
>>218
色々と突っ込みどころだらけで恐らくは期待した通りには動かないだろうとは思うけど、
いきなり画面が黒くなったりうんともすんとも言わなくなるとは思えないな。
220デフォルトの名無しさん:2007/04/23(月) 17:17:17
te[i]に何も入っていない段階で-1と比較しているからだと思うが。
221デフォルトの名無しさん:2007/04/23(月) 17:21:31
>>219
scanf の落とし穴に引っかかっても
画面が(ry になるような感じじゃないものな
222デフォルトの名無しさん:2007/04/23(月) 17:34:44
そうか、teの初期値によってはスタックオーバフローするのか。
223デフォルトの名無しさん:2007/04/23(月) 17:37:49
再帰じゃないし、スタックオーバーすることある?
# 不正アクセスはあるけど
224デフォルトの名無しさん:2007/04/23(月) 17:38:28
スタックオーバーフローはしないんじゃね?
225デフォルトの名無しさん:2007/04/23(月) 17:44:05
条件がそれば&te[i]が進みすぎて、9x系ならアクセスバイオレーションでBSoD出たりするんじゃね?
226デフォルトの名無しさん:2007/04/23(月) 18:10:40
scanf でどこかのメモリが破壊されて、
それがスタートアップルーチン用の何かの情報を壊して
その影響で再帰呼び出しか巨大なスタック領域の確保が
行われたりとか?
227デフォルトの名無しさん:2007/04/23(月) 18:32:52
Cコンパイラの評価について質問です。
if ((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のどちらが先に評価されるのでしょうか?
228デフォルトの名無しさん:2007/04/23(月) 18:33:06
権限ないところに書き込もうとしたらそれだけで青画面出たりするだろ。
229デフォルトの名無しさん:2007/04/23(月) 18:37:27
>>227
socket() の戻り値が0を超えるかという評価
230デフォルトの名無しさん:2007/04/23(月) 18:40:02
231210:2007/04/23(月) 18:46:58
携帯で書いてる途中で休み時間が終わってしまったので
慌てて見直さずカキコしちゃいました(汗

mallocを書き忘れましたけど、
*をつけて左辺に置いてはいけない例を
お願いします
232210:2007/04/23(月) 18:50:37
aとbにintつけるのも忘れてたorz
233デフォルトの名無しさん:2007/04/23(月) 18:52:12
>>232
何を知りたいのかよく判らんから、具体的な質問にしてくれ。
234デフォルトの名無しさん:2007/04/23(月) 19:23:12
char str[] この[]の中に数字が入るときがありますよね。char str[20]とか。
この数字の意味が分からないのです。いやなんとなく分かるんですが、バシっと分かりません。
しかも[]の中の数字なんて無くても良いと思うのですが。

どんな時に使うのですか?

すいません、基本的なことで。

お願いします。
235232:2007/04/23(月) 19:24:18
>>233
>>213さんに、一概には言えない、と言われたから、どんなときに
戻り値がint*型の関数を代入式の左辺に
*をつけて使ってはいけないのか
教えてください(--;)
236デフォルトの名無しさん:2007/04/23(月) 19:25:41
その戻り値が指す先が合法ではないとき。
237デフォルトの名無しさん:2007/04/23(月) 19:30:00
>>234
確保する領域の大きさを自分で決めたいときにつかいますよー
scanfで文字列を読み込んだり
文字列をstrcatで繋げたり
sprintfで文字列を作るときに
領域が用意されてないと大変になります(--;)
238デフォルトの名無しさん:2007/04/23(月) 19:31:48
>>234
char を20個確保
int a[15] なら int を15個確保
239デフォルトの名無しさん:2007/04/23(月) 19:37:30
>>234
宣言するときに
char a[]="text";
のように初期化する文字列があれば
括弧のなかには数字は無くても
文字数+1の領域が用意されます。
char a[];
だけだと領域の大きさが分からないからダメです。
関数の引数で
char a[]
と書かれてるときはポインタとして扱われて
char *a
となります。

多分こんなかんじだと思う(--;)
240デフォルトの名無しさん:2007/04/23(月) 19:37:59
>>235
関数がNULLを返すとき。
関数が無効なポインタを返すとき。
変更不能なオブジェクトを指しているポインタを返すとき。
241227:2007/04/23(月) 19:41:51
つまり条件分岐文は左から右に評価されるのが決まりであるという事ですよね。
参考になるページを貼っていただいて助かりました。
なんとか理解できそうです。
242デフォルトの名無しさん:2007/04/23(月) 19:43:29
>>241
条件分岐文ってのが何を意味してるのか今ひとつわからんが、
一般的には左から右に評価されるわけじゃないぞ
243デフォルトの名無しさん:2007/04/23(月) 19:44:24
>>237,>>238,>>239
ありがとうございます!

バッチリ理解できました。

調べても答えが見つからなくて困ってました。

本当に助かりました。ありがとうございます。

これで先に進めます♪
244デフォルトの名無しさん:2007/04/23(月) 19:45:25
文字列じゃなくてchar型の配列として考えるなら
char a[16]="0123456789abcdef";
printf("%1s\n",a[i])
みたいに文字数ぴったりで宣言することもある
(--;)と思う
245235:2007/04/23(月) 19:49:56
>>240
つまり普通にポインタを扱うときと同じ注意をすればいいんですね。(--;)
あと関数内の静的じゃない変数のポインタもダメですね
ありがとうございました
246デフォルトの名無しさん:2007/04/23(月) 19:50:42
>>241
ここの一番下14-5を見るといい
http://www9.plala.or.jp/sgwr-t/c/sec14.html
247デフォルトの名無しさん:2007/04/23(月) 19:53:03
>>246
演算子の優先順位とオペランドの評価順序は別物
248デフォルトの名無しさん:2007/04/23(月) 19:53:57
何もそんな怪しげなサイトから優先順位表を探してこなくても……
249デフォルトの名無しさん:2007/04/23(月) 19:57:05
>>247
質問者はオペランドの評価順は聞いていないと思うけど
質問の内容からも ( )、=、>、< の評価順位を聞いていると思うんだけど違うの? 
250デフォルトの名無しさん:2007/04/23(月) 19:59:57
いや、どう見ても評価順序の質問だと思うが・・・
251デフォルトの名無しさん:2007/04/23(月) 20:02:25
>>249
お前さん、評価順序と優先順位を混同してるんじゃない?
252デフォルトの名無しさん:2007/04/23(月) 20:06:40
>>250-251
ごめん funcAかfuncBかだったね
逝ってきます
253デフォルトの名無しさん:2007/04/23(月) 20:10:12
3項演算子やビット関係の演算子でよくミスするなぁ…
a = 0x01;
x = 0x01 + a & 0x01 == 0x00 ? 0x01 : 0x10;
わけわかんない(--;)
254デフォルトの名無しさん:2007/04/23(月) 20:20:29
不安になったらすぐに括弧使え
255デフォルトの名無しさん:2007/04/23(月) 20:28:04
(--;) <- これ目障りなんだが
256デフォルトの名無しさん:2007/04/23(月) 20:31:01
すいません(i--;)
257デフォルトの名無しさん:2007/04/23(月) 20:47:20
文は括弧でくくれないんじゃないのか。
258201:2007/04/23(月) 23:17:49
基礎的な質問にお答えありがとうございました。
単語の意味もわからず文法習っている感じなんですよね。
ただいま配列変数やっております。
259デフォルトの名無しさん:2007/04/23(月) 23:20:01
>>257
別にくくってもいいと思うが・・・
260デフォルトの名無しさん:2007/04/23(月) 23:23:32
式はくくってもいいが文(式文)はくくっちゃダメだろと重箱の隅突付き
261デフォルトの名無しさん:2007/04/23(月) 23:33:23
重箱の隅、って事はない。
その辺りの区別を「どうでもいいや〜」とか思ってると
いつまでたっても初心者を脱することはできない。
262デフォルトの名無しさん:2007/04/23(月) 23:42:49
ポインタについてなんですが、
char *str;

str="ABC";
は可能で
scanf("%s",str);
がダメな理由がわかりません。お願いします
263デフォルトの名無しさん:2007/04/23(月) 23:52:20
>>262
前者はただのポインタ変数へのポインタの代入。
後者はscanf()がポイント先を変更する前提としてのポインタの引き渡し。
従って、文法上は何ら問題がない。
ただ、scanf()の仕様上そのポインタのポイント先が代入可能領域でないといけないだけ。
264デフォルトの名無しさん:2007/04/23(月) 23:53:21
ポインタは矢印。

str → (どこも指していない)

>str = "ABC";

str → "ABC"
str は "ABC" を指す。OK

>scanf("%s",str);

str → ここに何かを書き込もうとする
どこも指していない場所に書き込もうとしているのでアウト

265デフォルトの名無しさん:2007/04/23(月) 23:57:23
どこも指していない、だとデフォでヌルポインタと
言っているみたいで誤解が生じないか?
266デフォルトの名無しさん:2007/04/23(月) 23:58:55
>>263-264
ありがとうございます。なんとなくわかりました。ポインタ変数には代入できないということですね
267デフォルトの名無しさん:2007/04/24(火) 00:00:02
>ポインタ変数には代入できないということですね

何でだよwww
268デフォルトの名無しさん:2007/04/24(火) 00:00:10
指している先がハッキリしていようと
書き込み可能領域じゃないといけないわけで
269デフォルトの名無しさん:2007/04/24(火) 00:02:15
>>266-267にワロタ
270デフォルトの名無しさん:2007/04/24(火) 00:12:50
おまいら頼むから俺にもわかるようにインダス語で文明してくれ
271デフォルトの名無しさん:2007/04/24(火) 00:16:34
>266
ポインタ変数に代入はできるぞ。代入できない変数に意味はないだろう。
char *str;
scanf("%s" str);
はstrに代入するのではなくstrが指している先にchar(の配列)を設定しようと
している(この辺の表現は微妙だけど、、、)
しかしこの場合strはでたらめなところを指しているのででたらめなところに
文字列を設定しようとする。たまたま動くかもしれないし、動かないかもしれない。
char *strの替わりにchar str[1024];とかするととりあえずは動くだろう
(バッファオーバーフローのことは目をつぶる)

int n;
scanf("%d" &n);
この場合に&nが指しているさき(すなわちnであるのだが)に数値を設定する。
この&nと上記のstrが同じような意味合い。
272デフォルトの名無しさん:2007/04/24(火) 00:20:19
楔形文字使うんだっけ?
そういえばUNICODEにもあったハズ・・・
273デフォルトの名無しさん:2007/04/24(火) 00:29:04
>>271
お前も理解があやふやだな
>>263とか>>268とか読んだか?
274デフォルトの名無しさん:2007/04/24(火) 00:48:34
>273
そう?わかってるつもりだけど。
微妙な表現があるのはわかってるけどこかまちがってるか?
275271&274:2007/04/24(火) 00:50:07
あ、インダス語は理解があやふやっていうかわかりませぬ。
276デフォルトの名無しさん:2007/04/24(火) 02:07:16
おまいら頼むから喪れにもわかるようにカードダスで印刷してくれ
277デフォルトの名無しさん:2007/04/24(火) 02:20:57
私の勉強中の本ではscanfを使わずに、
初心者はfgetsしてからsscanfを
使うようにと書いてあります。
なぜですか??
278デフォルトの名無しさん:2007/04/24(火) 03:13:52
>>277
scanf()は癖があって使いにくいから。
例えばscanf("%d", ...)がループの中にあったとして、うっかり数字以外の文字を入れてしまうと泣ける。
279デフォルトの名無しさん:2007/04/24(火) 04:04:45
Cでソケットプログラミングをしているのですが、どうしても分からない事があります。
↓はデータ受信側のソースの一部なのですが、

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が返ってくることなんてあるのでしょうか?

280279:2007/04/24(火) 04:22:57
調べたところ、connectのループを、接続を確立せずに抜けてるみたいなのですが・・・
SOCKET_ERRORである限り、永遠にconnectするように設計しているのですが、
何故(コネクションを確立せずに)ループを抜けてしまうのでしょうか?
281デフォルトの名無しさん:2007/04/24(火) 04:34:43
WSAGetLastError
282デフォルトの名無しさん:2007/04/24(火) 08:18:36
>>262
ポインタを通して読み書きするには、ポインタが適切なメモリ領域を指し示していなければならない。
ポインタが他の変数が適切なメモリ領域を指し示すようにするには、適切なメモリ領域へのポインタを代入すればよい。
その適切なメモリ領域へのポインタを得る方法には、
変数に&演算子を使用する、配列(先頭要素へのポインタへ変換される規則)、mallocなどといった方法がある。

"ABC"のような文字列リテラルは、自身のメモリ領域を伴った配列という扱いで、
ポインタ型の変数に書き込めば、その変数は文字列リテラルのメモリを指し示すようになる。

一方scanfでは、既に適切な(つまり読み書きできる)メモリ領域を指し示した状態のポインタを引数に取ることが
前提とされており、そこへ入力されたデータを書き込むという動作を行っているので、
適切なメモリ領域を指し示していないポインタを渡してはならないのだ。
283デフォルトの名無しさん:2007/04/24(火) 08:24:17
>小数部のないdoubleをlongに代入しても問題はない

これは間違いだよ、ととある所に書いてあったのだけど、別に
それほど問題にはならないんじゃ、とか思った漏れは逝って
良しですか?
284デフォルトの名無しさん:2007/04/24(火) 08:28:12
>>283
そこだけ抜き出されても、書かれた趣旨は判らない。
敢えて言うならdouble値はlong値よりもはるかに広い数を扱えるので、
単純に代入はできない。また、精度の問題で単純な代入では問題がある。
285デフォルトの名無しさん:2007/04/24(火) 09:48:08
>>283
それは暗黙的にlong intにキャストされる際に小数部を切り捨てられるから
小数部を使わないdoubleなら(表現幅がlongの範囲内であれば)実質的な
データの欠損は無いから大丈夫って意味じゃない?別に問題無い気がする。
284が言ってるようにlongの範囲外のデータが入ってるdoubleはアウアウだけど。
286デフォルトの名無しさん:2007/04/24(火) 11:14:35
>>285
単なる代入(暗黙のキャストによる切り捨て)でいいか、丸めを必要とするかは検討すべきだけどね。
287デフォルトの名無しさん:2007/04/24(火) 11:49:31
とりあえず初心者には配列=ポインタ+書き換え可能メモリーと教えた方がよくないか?
288デフォルトの名無しさん:2007/04/24(火) 11:51:59
>>285 >>286
浮動小数点型の内部表現では、
小数部のない数値の表現は頭の1ビットが
…(省略されました。各自ググって下さい)

って事じゃねーかな?
289デフォルトの名無しさん:2007/04/24(火) 12:10:05
いや、ググるもなにも、あんたが何を言いたいのか判らんのだが。
そもそも、小数部の有無と内部表現には関連が無いぞ。
290288:2007/04/24(火) 12:12:42
>>289
関連はあります
仮数部に注目して下さい
291デフォルトの名無しさん:2007/04/24(火) 12:32:19
2の補数表現で巡回少数形の値への危惧?
292デフォルトの名無しさん:2007/04/24(火) 12:40:43
うーん、小数部があろうがなかろうが最初の1ビットは記録されないのだけれど、
この自己主張の下手な困ったチャンは一体何が言いたいのだろう……
#まさかとは思うけど、IEEE前提だよね?
293デフォルトの名無しさん:2007/04/24(火) 15:21:11
c 入門の入門って本で勉強してます。
今日、ちょっとだけ他の本を立ち読みしたら・・・。
まだこんなに難しいのあるのかいな!ってな感じでショックを受けましたw
歳も30後半だし、中卒だしw超初心者だし。
c勉強してなんになるんだろうと思いながら毎日勉強してます。

ちょっと小言を言いたかっただけです。すっきり。
すみませんでした。
294デフォルトの名無しさん:2007/04/24(火) 15:56:17
じゃVB.NETかJavaをやれw
その歳でCをはじめても仕事ができるレベルになるまで時間がかかりすぎるだろ
295279:2007/04/24(火) 16:03:32
>>279です
WSAGetLastErrorで調べたところ、connect直後の値は0でした。
しかし、相手側のacceptはずっと接続待ちの状態でした。
なんか違うアドレスに接続してるのかと思って、アドレスを確かめましたが、
間違ってはいませんでした。というか、接続が確立される時とそうでない時があるのが不思議です。
もうダメぽ・・・
296デフォルトの名無しさん:2007/04/24(火) 16:04:52
30後半の人が、未成年でもできるようなことを
身につけてもどーしようもないだろ。
297デフォルトの名無しさん:2007/04/24(火) 16:09:40
>>296
それを言ったらプログラミングそのものが
298デフォルトの名無しさん:2007/04/24(火) 16:35:28
>>218ですが
#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++;}}
でまともにうごいたんですが
画面が暗くなった原因がいまだわからん!
299デフォルトの名無しさん:2007/04/24(火) 18:10:06
>>298
どの段階で暗くなったかを言わないと誰もわからないと思う
5つ目を入力中だったとか14個目を入力中だったとか
まぁ考えられるのは11個以上入力したときのデータ破壊だけど
このプログラムもまともに動いたかもしれないがte[]が入力個数のチェックしてないのは危ない
せめてdo{}while(); のwhile(te[i-1]!=-1); を while(i<10&&te[i-1]!=-1); にしたほうがいいよ
300デフォルトの名無しさん: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:起きる
301デフォルトの名無しさん:2007/04/24(火) 20:19:14
#include<stdio.h>

#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;
}
302デフォルトの名無しさん:2007/04/24(火) 20:22:13
#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;
}
303300:2007/04/24(火) 20:29:03
>>301->>302
サンクスです!!

>>301
この文法はまだ、教本で習っていないのですが
>>printf("%d\n", i+1);*/
puts("1:叫ぶ");
puts("2:寝る");
puts("3:起きる");

*/ の解説を宜しくお願いします、教本にも載っていません・・・・。

>>302
char *msg[]={"叫ぶ","寝る","起きる"};  は
どうして、char msg[]={"叫ぶ","寝る","起きる"}; では
いけないのでしょうか?
教本の説明でもダメ、これは入れられなく
ポインタを使い先頭のアドレス云々と解説してありますが
いまいち、どうしていけないのかわかりません。
304デフォルトの名無しさん:2007/04/24(火) 20:30:52
>>303
/* */ はコメントだろ・・・
305デフォルトの名無しさん:2007/04/24(火) 20:32:26
>>303
文字列リテラルの型は char* (charへのポインタ)であるから、
それの配列なら char *[] (charへのポインタの配列)だろう。
306デフォルトの名無しさん:2007/04/24(火) 20:32:52
>>303
"叫ぶ","寝る","起きる"ってのは文字列なので、要はアドレス。
だから、char型ではダメ。
307デフォルトの名無しさん:2007/04/24(火) 20:38:32
ポインタを使わない方法として
char msg[][10]={"叫ぶ","寝る","起きる"};
これならいけるんじゃないか
308300: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へアドレスを入れていく感じででしょうか?
309デフォルトの名無しさん:2007/04/24(火) 20:50:33
>>306
それでは初心者への答えとしても知ってる人への説明としても間違ってる

>>303
"叫ぶ""寝る""起きる"はどれも文字配列
変数msgが1つの配列なら、"叫ぶ""寝る""起きる"の3つの配列がいれられないってのはわかるだろ
そこで二次元配列という配列を入れる配列を使うが、ややこしいのでポインタとあわせてじっくり理解汁
310デフォルトの名無しさん:2007/04/24(火) 20:50:58
>>308
いけないと思うのなら、試しにそれでコンパイル・実行してみろ。
311300:2007/04/24(火) 21:02:06
>>309
難しいですね・・・・

>>310
Borlandがコンパイラるエラーを起こしてしまいます。

312デフォルトの名無しさん:2007/04/24(火) 21:02:37
>>308
printf("%d\n", i+1); これも実行される
求めている出力結果と違ってくるジャン
313300: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;
}

とグローバル関数として定義しなくてもいいのでしょか?
314300:2007/04/24(火) 21:11:04
ちょっと、混乱してきたので出直してきます。
サンクスですた。
315デフォルトの名無しさん:2007/04/24(火) 21:11:21
>>313
おk
316デフォルトの名無しさん:2007/04/24(火) 21:59:08
マージソートでは、ソートしたい配列を2つに分けますが、
2つに分ける際に、片方は順番に、もう片方は逆順にして分けていくソースが見られます
逆順にする利点に関して教えてください
よろしくお願いします
317デフォルトの名無しさん:2007/04/24(火) 23:09:31
#include<stdio.h>

int main (void)
{
   int a;

   printf("%p\n",a);     /*その1*/
   printf("%p\n", &a);    /*その2*/

   return 0;
}

その1とその2で
なんで違うんだろう。
誰か教えてくれ
318デフォルトの名無しさん:2007/04/24(火) 23:10:20
逆順ってなに?
319デフォルトの名無しさん:2007/04/24(火) 23:12:14
>>317
%pはアドレスを表示する。
だからその2の使い方があってる。
その1は使い方自体が誤り。
320デフォルトの名無しさん:2007/04/24(火) 23:15:18
なんか宿題っぽい質問が続くな。
321デフォルトの名無しさん:2007/04/24(火) 23:20:10
>>319
サンクス

>>320
ダイテル親子の本を買ったんだが
答えがついてないんだ。すまん
322デフォルトの名無しさん:2007/04/24(火) 23:53:29
答えがわからない度にいちいち聞くつもりか。
っていうかこういうのは言わば確認問題なのであって、
問題の前に書いてあることをちゃんと読んでいればわかるはずなんだが。
323デフォルトの名無しさん:2007/04/25(水) 00:07:29
>>320
「宿題っぽい質問」つーよりは、「人に訊く以前のレベルの質問」だろう。
324デフォルトの名無しさん:2007/04/25(水) 00:54:06
>>318
ttp://www1.cts.ne.jp/~clab/hsample/Sort/Sort6.html
ここでもそうなんですが、
半分に分割して、後半は逆にして入れてます
どうしてなのでしょうか?
325デフォルトの名無しさん:2007/04/25(水) 05:13:29
自分で考えたのかよ
326デフォルトの名無しさん:2007/04/25(水) 07:44:33
ループけちってるだけだろ
327デフォルトの名無しさん:2007/04/25(水) 12:13:21
%pとかなんて
「C言語 %p」でググればいくらでも出てくるでしょ
328デフォルトの名無しさん:2007/04/25(水) 22:17:24
unsigned long int と unsigned long の違いを教えて欲しい
intを省略しているところが結構あるんだが。
329デフォルトの名無しさん:2007/04/25(水) 22:19:43
同じ。違いは字面だけ。
330デフォルトの名無しさん:2007/04/25(水) 22:22:14
なんだと!    ありがと
331デフォルトの名無しさん:2007/04/25(水) 23:33:04
配列とポインタの関係についてなんですが、
char a[]="abc";
において'b'を表す方法として、a[1]はわかるんですが、何故*(a+1)としてもいいのかわかりません。
*(a+1)のaが先頭アドレスで、そこから1つ先の中身を指さすという意味合いはわかるのですが、
ポインタ変数を宣言してないのに、配列を*で表せるという事がわかりません
332デフォルトの名無しさん:2007/04/25(水) 23:34:07
>>331
意味合いが分かっているなら、
そう定義してあるから、としか答えようがないな
333デフォルトの名無しさん:2007/04/25(水) 23:35:08
式のp[i]は*(p + (i))と等価
添え字演算子はそうなるように定義されている
334デフォルトの名無しさん:2007/04/25(水) 23:41:50
>>332-333
ポインタはchar *pのような宣言をしないと使えないと思っていたので、
頭がこんがらがってるだけかもしれないんですが、
配列を宣言するとポインタを宣言しなくても*で表せるという決まりということなんでしょうか・・。
上の例だと、適当なアドレスに'a','b','c'が連続で割り当てられ、
a[0],a[1],a[2]がそれぞれを表していますが、
この時同時に、*(a+1),*(a+2)のようなポインタが適当な場所に作られるということでいいんでしょうか?
335デフォルトの名無しさん:2007/04/25(水) 23:44:43
>>334
式の中において、配列は、その配列の先頭要素を指すポインタに変換されるという規則がある。
概念的には配列aは式の中だと&a[0]として扱われるという感じ。
336デフォルトの名無しさん:2007/04/25(水) 23:54:30
>>335
わかるようなわからない感じなんですが、
配列a[]が宣言された時点でaがポインタに変換されるという事で、
>>334に書いたようにポインタが別の領域につくられるという事ではないんでしょうか・・
337デフォルトの名無しさん:2007/04/25(水) 23:59:28
つーかポインタ宣言の*と参照の*は別物と考えればノープロブレム
338デフォルトの名無しさん:2007/04/26(木) 00:03:54
そういうときには、ここを紹介すればいいのかな
http://kmaebashi.com/programmer/pointer.html
339デフォルトの名無しさん:2007/04/26(木) 01:02:46
>>336
「ポインタ」と「ポインタ変数」の区別がついてない気がする。
340デフォルトの名無しさん:2007/04/26(木) 01:57:16
>>339
それを言うならアドレスとポインタじゃないのか?
341デフォルトの名無しさん:2007/04/26(木) 02:09:00
>>340
「アドレス」の話など、誰もしていません。
342デフォルトの名無しさん:2007/04/26(木) 10:16:30
>>336
コンパイラが同じと解釈するので
出てくるコードが同じになる、と思えばいいかと
343デフォルトの名無しさん:2007/04/26(木) 10:24:55
>>342
ポインタわかってないならコンパイラなんか意識してないだろうから
余計分かりづらいんじゃないか。
344デフォルトの名無しさん:2007/04/26(木) 10:51:29
link reverse(link x){
link 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がどうなってるの?リストを反転させるためのメソッドらしい
345デフォルトの名無しさん:2007/04/26(木) 11:04:06
>>344
自分で答え書いているよ。文字通り、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
...
346デフォルトの名無しさん:2007/04/26(木) 12:50:15
xが
NULL→4→6→3→8→2とリンクしていたら
return rのrは
2→8→3→6→4→NULLとなっているのですか?
347デフォルトの名無しさん:2007/04/26(木) 13:00:22
どっちかと言うと、
x

4→6→3→8→2→NULL

              r
             ↓
NULL←4←6←3←8←2
にしてrを返しているイメージだな。

つまり、ターミネータつき可変長配列ではターミネータの検索と入れ替えの2フェーズ掛かる処理が
リストだと繋ぎ替えの1フェーズでできるって好例だね。
348デフォルトの名無しさん: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回目の実行ではファイルの中身が表示されません。
349デフォルトの名無しさん:2007/04/26(木) 13:23:46
>>348
if文の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);
にして味噌。
350デフォルトの名無しさん:2007/04/26(木) 13:26:25
>>349
できました、お早い返答、ありがとうございました。
351デフォルトの名無しさん:2007/04/26(木) 13:28:57
ついでに言えば、printf("%c",ch)もputchar(ch)で充分だな。
352デフォルトの名無しさん:2007/04/26(木) 13:31:29
速度的にputcharの方が早いってどっかで聞いたんだけど、ほんと?
353デフォルトの名無しさん:2007/04/26(木) 13:32:35
>>352
大丈夫、賢いコンパイラならprintf("%c",ch)をputchar(ch)同等に最適化してしまうから。
354662:2007/04/26(木) 13:33:30
#include <stdio.h>
#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;
}
355デフォルトの名無しさん:2007/04/26(木) 13:35:04
main()の中でreverse()を宣言なしで使用したため、暗黙のプロトタイプ宣言が為されたと見なされてしまったため。
356デフォルトの名無しさん:2007/04/26(木) 13:36:44
>>351
目的次第ではないでしょうか?あまり余計なことを言うとボロが出て逆に突っ込まれますよ?w
書式指定で表示する必要があればputcharで充分にはなりませんので、あしからず。
>>349
> if文のtrue節で脱出しているのにelse節で処理を書くのはよくない
なんで?
> fp=fopen(fname,"r");
別にifの外に書かなくても問題ないよ。知ったか乙
357デフォルトの名無しさん:2007/04/26(木) 13:37:25
>>353 はい、知ったか乙w 脳内妄想じゃなくて証拠を提示してくれよ
358デフォルトの名無しさん:2007/04/26(木) 13:42:51
>>356
突っ込みご苦労。一応フォロー。

>書式指定で表示する必要があればputcharで充分にはなりませんので、あしからず。
コンパイラと同じ最適化をしただけ。勿論、「この場合は充分だ」と言う意味だ。

>> if文のtrue節で脱出しているのにelse節で処理を書くのはよくない
>なんで?
単純に見通しが悪くなる。どうせやるなら、その後のfclose()まで全て含めるべき。

>> fp=fopen(fname,"r");
>別にifの外に書かなくても問題ないよ。知ったか乙
別に問題ないね。それについては私の趣味だ。ついでに言えば、それについて何も言及していないので知ったかも何も無い。

突っ込みすることだけを目的にスレを曲解した(或いはそのようにしか読めない)のだろうけれど、見苦しいよ。
359デフォルトの名無しさん:2007/04/26(木) 13:46:09
>>358
> 単純に見通しが悪くなる。どうせやるなら、その後のfclose()まで全て含めるべき。
ほら、でた、お前の「主観」。様々なソースを見てみればわかるが、ifの中に入れても問題はないよ。
ありもしない問題を自分の主観で問題視しないように。ここはソースの記述内容を
お前の主観で評価するところじゃない。質問の要点に答えるだけにしないと、関係ないことでトラブルになるぞ。
それから、putcharについては完全にお前の主観だから黙ってろ。
360デフォルトの名無しさん:2007/04/26(木) 13:47:54
>>357 はいよ。ちなみにこれは、foo.cとgcc -S -O3 foo.cした結果ね。
--
#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
--
以下も省略
361デフォルトの名無しさん:2007/04/26(木) 13:49:25
>>359
puthchar()についてはコンパイラの最適化でさえ主観と申されるかw
主観だから黙ってろと言うことなので以下割愛。

362デフォルトの名無しさん:2007/04/26(木) 13:50:05
はいはい、ピーコの辛口ソースチェックは良いから、問題の「要点」に答えるように。
そのソースは自分スタイルじゃないって評価はいらねーってw
363デフォルトの名無しさん:2007/04/26(木) 13:51:21
rewind だけをこそっと教えるより、fseek の存在を教えたほうがためになる希ガス
364360: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
365デフォルトの名無しさん:2007/04/26(木) 13:55:28
知ったかは>>357ということですか?
366デフォルトの名無しさん:2007/04/26(木) 13:57:13
>356
"書式指定してない"んだからputchar()でいいじゃん。
何が気に入らないの?
367デフォルトの名無しさん:2007/04/26(木) 13:57:45
>>365
知ったかなんて言ったら失礼だよ。>357は偶偶知らなかっただけでしょ。
368デフォルトの名無しさん:2007/04/26(木) 14:00:23
>>366=>>367
しつこい、ここはお前スタイルでソースを評価するスレじゃないんだよ。
どこを見てもif()の中にfp=fopenを書いてはいけないという制約はないよw
369デフォルトの名無しさん:2007/04/26(木) 14:02:45
ほらほら、熱くなって読解力が落ちていますよ。
>366と>367は同一人物じゃありませんからね。
370デフォルトの名無しさん:2007/04/26(木) 14:03:13
>>358
> 別に問題ないね。
> それについて何も言及していないので
とか言っているが>>349
> 一行に二文突っ込むのもよくない。
自分で良くないと言及しているのに問題ないと?w
所詮お前の主観、問題のない部分に対する突っ込みはトラブルになるんでご注意を。
ちうかこいつなんだ?プロ気取りか?w
371デフォルトの名無しさん:2007/04/26(木) 14:05:10
>>370
思いっきり勘違いしていないか?
> 一行に二文突っ込むのもよくない。
は、
>else { fd(fp); fd(fp); }
のことだぞ。
372デフォルトの名無しさん:2007/04/26(木) 14:06:46
俺のポリシーだと 「一行に二文突っ込むのもよくない。」
だっておーーー(バンバン)(巨大VIPPERのAA略)
373348:2007/04/26(木) 14:21:42
>>348ですが、printf("%c",ch); の書式を%dにして文字コードを表示する当てがありましたので
printfを使って書いていました。いずれこれを、ファイルのダンプと文字コードを16進数で表示させる
プログラムに発展させるつもりでしたので・・・
374デフォルトの名無しさん:2007/04/26(木) 14:21:53
>368
俺は366なんだが367じゃないし、そもそも349でも351でもないんだが。
っていうかputchar()についてしか言ってないのにifの中がどうとか言われても…・・・
375348:2007/04/26(木) 14:23:34
>>371
それについてはここに書き込む際に行数を減らすために書き直しただけです。
手元にあるソースにはそのようには書いてないです。
376デフォルトの名無しさん:2007/04/26(木) 14:54:08
黙っちゃったな。やっと自分の主張も主観に過ぎないと気づいたか。
377デフォルトの名無しさん:2007/04/26(木) 16:11:12
実数を入力し小数点以下第1位で四捨五入し整数部を表示しなさい
実行画面
実数入力==>10.4
四捨五入:10

実数入力==>10.5
四捨五入後: 11
になるプログラムを作成しなさい
この問題わかる方がいましたら教えてください(T_T)
378round():2007/04/26(木) 16:12:07
>>377
宿題スレへどうぞ。
379デフォルトの名無しさん:2007/04/26(木) 16:16:36
>>377
四捨五入したい値に0.5をどうにかして整数部だけ表示すればいいと思うよ
ちゃんとした回答が欲しかったら宿題スレにどうぞ
380デフォルトの名無しさん:2007/04/26(木) 16:23:01
>>377 ただし、1.4999999999とかやると2進数の小数点以下の精度の問題上、正確に結果がでませんのであしからず。
#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; }
381デフォルトの名無しさん:2007/04/26(木) 16:24:52
俺んとこの環境じゃ1.4999999999999999でやったら2になってもうた
382デフォルトの名無しさん:2007/04/26(木) 16:28:50
>>381
printf("%d", (int) (x + .5))だとどうなる?
383デフォルトの名無しさん:2007/04/26(木) 16:35:53
どうもscanf()では、精度的に1.499999999999999(9が14個)が限界のようだ。
しかしこれを"%.20g"で出力すると1.499999999999998になる。
実際に内部形式から逆算すると1.4999999999999998が限界だ。
384デフォルトの名無しさん:2007/04/26(木) 16:38:15
まぁ、>>377は小数点第1位で四捨五入って書いてあるから
その範囲内でなら問題ないんだけどね。
要するに、1.4999999・・・限りなく1.5に近い値ではなくそれを1.4で換算すればね。
385デフォルトの名無しさん:2007/04/26(木) 17:56:18
現在日本電子専門学校の情報処理科に通ってる者ですがC言語の授業の進み具合が遅いため独学でC言語を勉強したいのですがオススメの参考書ってありませんか?
なにぶん始めたばっかしなので解りやすいやつでお願いします
386デフォルトの名無しさん:2007/04/26(木) 18:05:49
専門学校の教科書で独習すれば?
387デフォルトの名無しさん:2007/04/26(木) 18:16:18
自己課題として、52枚のトランプ(ジョーカー含まず)を使って
ブラックジャックを遊ぶプログラムをつくってたのですが
分からない点がでてきてしまいました。

52枚のカードの作成方法は(私が思うに)
文字型のポインタ char *card[];  を定義して
for文の二重ループの方法でマークと数字を書き込むんじゃないか……
と検討は付いたのですが
char型のポインタに"マーク"(文字列)と"数字"(整数値)の二つを
書き込む方法が見当たりません。。。

いったんは、書き込む数字を整数値から文字列に変えて再試行しましたが
for文の式(各マークに数字書き込む段階)で整数値を使っている以上
文字列への変更はできないように思われて・・・

どなたか
文字列のポインタに 文字列と整数値の相違種を書き込むをする方法を教えてくださいm(_ _)m
388デフォルトの名無しさん:2007/04/26(木) 18:26:23
>>387
取り敢えず、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)かな。
389デフォルトの名無しさん:2007/04/26(木) 18:45:51
数字の配列でいいじゃん。
card / 13 でスートが出るし card % 13 + 1で数字が出る
390388:2007/04/26(木) 18:48:17
表示用じゃないの? てっきりそうとばかりw
391デフォルトの名無しさん:2007/04/26(木) 19:11:39
質問が意味不明
392デフォルトの名無しさん:2007/04/26(木) 19:27:46
>>388
これなら自由だべ。
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);
}
}
393デフォルトの名無しさん:2007/04/26(木) 19:28:37
2次元配列を使う上で
配列名sのs[2][2]に2つの文字列を表示させたい時は
どうすることが考えられますかね?
1つの文字列

japan korea eng
NULL eng/fra bra
NULL NULL arg

このeng/fraみたいな表示したいんだけど。
394393:2007/04/26(木) 19:29:27
ですけど2行目は無しで考えてください。
395デフォルトの名無しさん:2007/04/26(木) 19:30:31
>>393
ちっとは人に伝わるように努力しろよ
396393:2007/04/26(木) 19:30:49
engは最初からはいってるとします。
その次に/fraをいれたい
397デフォルトの名無しさん:2007/04/26(木) 19:32:50
strcat
398デフォルトの名無しさん:2007/04/26(木) 19:34:10
まだわからん
データ構造がどうなってて、どうしたいのか
399デフォルトの名無しさん:2007/04/26(木) 19:34:41
8桁の数字がタブで区切られながら書いてあるデータから、8桁の数字ごとに配列に入れていきたいのですが、どのようにすればよいでしょうか。なにぶんC言語に不慣れなため分かりません。
誰か教えていただけるとありがたいです・・・。
400デフォルトの名無しさん:2007/04/26(木) 19:36:29
破壊していいなら strtok で切り出す。
sscanf で抜き出してもいいし、固定桁ならstrncpyしてもいいし
1文字ずつ読んで1つ1つコピーしてもいいし
401デフォルトの名無しさん:2007/04/26(木) 19:41:04
>>400
ありがとうございます!
がんばってみます。
402393:2007/04/26(木) 19:42:16
今おもうと
表示するときだけ2つ表示させて
プログラム内ではその場所に2つめが入ってるようにしたいんですけど。
japan korea eng
NULL eng/fra bra
NULL NULL arg
でいうとeng/fraと表示させたいけど
s[1][1]の中にはfraがはいってる感じに。

403デフォルトの名無しさん:2007/04/26(木) 19:44:14
日本語でおk
404デフォルトの名無しさん:2007/04/26(木) 19:46:34
>>399
#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;
}
405393:2007/04/26(木) 19:48:23
リストつかわないとだめかなあ
やっぱり。

s[1][1]に文字列engがはいってるとする。
この文字列を違う領域にコピーして
次の文字列fraをs[1][1]にいれ
fraをその違う領域にstrcatでつなげてその違う領域を表示
がベストかな?
406デフォルトの名無しさん:2007/04/26(木) 19:50:18
>>405
独り言ならよそでやって欲しい。
そうでないなら他人にも理解できる文章を書いてくれ。
407393:2007/04/26(木) 19:57:49
まあありがとうございます。
大体できそうだ
プログラムが。
2次元配列2つ使わないといけないのかめんどくさ
408デフォルトの名無しさん:2007/04/26(木) 20:01:45
>>405
何をしたいのかさっぱり分からない
409デフォルトの名無しさん:2007/04/26(木) 20:04:52
>>408
きみには理解できなくて結構
410デフォルトの名無しさん:2007/04/26(木) 20:10:06
struct a{
 unsigned 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文が使いにくいです。
どうすればいいでしょうか。
411デフォルトの名無しさん:2007/04/26(木) 20:13:12
ビットフラグならシフトすればいいだけだろ
412デフォルトの名無しさん:2007/04/26(木) 21:15:12
>>388,389,392

ありがとうございます!
ポインタではなく、二次元配列だったんですね
引き続き頑張ってみます、ありがとうございました
413デフォルトの名無しさん:2007/04/26(木) 21:41:07
>>409
お前は理解できたのか?
414デフォルトの名無しさん:2007/04/26(木) 21:46:21
>>413
コラ!409=393なんだから触っちゃいけません!!
415デフォルトの名無しさん:2007/04/26(木) 21:53:13
>>387
もう見てないかも知れないが、俺は>>389の方法が良いと思うんだがなあ。
表示するときだけ文字列に変換すればいいだけなんだし。内部では 0 〜 51
の数値で扱えば良いじゃん。で、表示の時に printf("%c%d", "SCHD"[n / 4], n % 13);
みたいにする(AJQKも変換したければする)。というか、数値から文字列に
計算して変換する関数を一つ作れば良い。

0〜51で扱うと数値から種類や値を出すのに面倒な計算が必要でデバッグの
時に楽じゃないと思うなら 4 ビットづつに分ければ良い。それなら16進
出力させれば桁で分かれるから分かり易い。
416デフォルトの名無しさん:2007/04/27(金) 02:02:39
いまどきの環境なら絵柄と数字で構造体にするほうがわかりやすいんじゃね?
417デフォルトの名無しさん:2007/04/27(金) 06:43:29
>>347
rは毎回書き換えられていてr->nextが作られていないようですが、どこでr->nextを作っていますか?
418デフォルトの名無しさん:2007/04/27(金) 07:51:58
>>417
作っていない作っていない。リンクの繋ぎ替えだけで中身を作り直しているわけじゃないよ。
419デフォルトの名無しさん:2007/04/27(金) 09:08:05
>>411
シフトして論理積をそのままつかうと表記が長くて汚いので
マクロを使いますがこのように書けば良いでしょうか
#define x(s,t) (((s)>>(t))&1)
420デフォルトの名無しさん:2007/04/27(金) 09:52:53
意味わからん
for (int n = 0; n < 16; ++n)
 printf("%c", a & (1<<n) ? 'o':'x');
でいいじゃん。

コンパイラによっては警告が出て嫌なら
(a & (1<<n)) != 0 でいいし、
nの代わりにenumなりの定数にして特定のフラグにすることも出来るし。
421デフォルトの名無しさん:2007/04/27(金) 10:41:53
macro使うくらいなら関数にしちゃえばいいのに。
422デフォルトの名無しさん:2007/04/27(金) 11:19:27
柴田望洋の本(たのしいC)に載ってるプログラムが、うまく動きません。

3つランダムに選ばれた3つの整数a,b,cの和を、人間に求めさせて、計算にかかった時間(秒)を表示するプログラムなんですが、
実行すると、どれだけ計算に時間を使っても「0.0秒」と表示されちゃいます。

以下のようなソースなんですが、どこかおかしいところがあるでしょうか?
ちなみに、Mac OS Xのターミナル & CotEditor を使っています。

教えてエロい人...。
423422:2007/04/27(金) 11:21:15
#include <time.h>
#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);
}
424デフォルトの名無しさん:2007/04/27(金) 11:24:11
void sample(){
exit(0)
}

int main(){
char *c;
c=(char *)calloc(10,sizeof(char));
sample();

free(c);
return 0;
}

上記のように、mainで確保した領域を開放するには、mainの最後にfreeを行うだけでいいのでしょうか?
それとも、exitがある関数にも、引数を参照渡しにして、exitの直前にfreeを行わなければならないのでしょうか?
425デフォルトの名無しさん:2007/04/27(金) 11:29:21
>>424
教条主義的に必ず解放したいのならexit()する関数でもfree()するべき

……というよりは、exit()を使わないようにするべき。
426デフォルトの名無しさん:2007/04/27(金) 11:31:32
>>423
clock()は環境依存な関数なので、OS Xの該当関数のマニュアルページを見て味噌。
或いは、CLOCK_PER_SECの値も確認して味噌。

それよりは、time()を使って秒単位の計測で済ませる方が入門者にはいいと思うが。
#つーか、某洋は何考えてclock()なんか使ってるんだ?
427デフォルトの名無しさん:2007/04/27(金) 11:42:35
>>423
それ、本のままなのか?
典型的なscanf()の使い方の悪い例だぜ・・・
ためしに実行したがWindowsでは経過時間みたいでちゃんと出たが
SolarisでgccだとCPU時間だから0.0しかでないな。
428422:2007/04/27(金) 12:01:31
>>426
なるほど。clock()は環境依存な関数なんですね。
Windowsではうまく動作しても、OS Xじゃダメと...。

>>427
本のままのソースでつ。
この本、分かりやすいんだけど、
MacやUnix使用者のことあんまり考えてないのかな...。
429419:2007/04/27(金) 12:24:39
1行だけの場合でもマクロより関数にしたほうが良いのですか?
あと、代入式の左辺にしたり、関数にポインタを渡したり
できないのはどうにかできないでしょうか
430デフォルトの名無しさん:2007/04/27(金) 12:41:08
ハイビジョンの画像を取り込みたいんですが、配列よりポインタを使った方がいいんでしょうか?
どうか知恵をください。
431デフォルトの名無しさん:2007/04/27(金) 12:45:08
>>430
日本語で頼む。
配列とポインタの間にパフォーマンスの違いは無い。
432デフォルトの名無しさん:2007/04/27(金) 13:06:09
>>431 日本語理解力おk?
433デフォルトの名無しさん:2007/04/27(金) 13:09:06
>>432
配列かポインタか以前に何をしたくて何を聞きたいのか不明だな。

>>429
凝ったマクロを作るよりも、関数にしておけばデバッグの助けになるし型チェックはコンパイラがやってくれる。
ついでに、代入関数も作ってしまえばいい。

>>428
>MacやUnix使用者のことあんまり考えてないのかな...。
つーか、発想が古いんでしょ。
434430:2007/04/27(金) 13:28:11
言葉足らずでどうもすいません!
ハイビジョンの画像を処理するために、一度読み込んで、回転かけたりしたいんです。
どういう風に読み込んで、どんな形式に納めればいいか教えて欲しいです。
435デフォルトの名無しさん:2007/04/27(金) 13:35:29
>>434
・ハイビジョンの画像とはなにか
・何から読むのか
・どう処理したいのか
・処理した結果をどうしたいのか
436デフォルトの名無しさん:2007/04/27(金) 13:38:04
>>434
bmpなら構造単純だから直で読み込めるけど
jpgとかpngなら自分でローダ作るよりライブラリ使ったほうが良い。
フォーマットの事書いてないからわからないけど何から読み込むの?
というか前準備として画像処理よりCの勉強した方が…
誤解なら申し訳ないけど文面から察するにポインタを十分に理解してると思えない。
437デフォルトの名無しさん:2007/04/27(金) 13:39:49
>>435
たびたびすいません。
画像は1920×1080画素のビットマップです。
これを読み込んで、回転行列をかけたりしたいです。
計算後はビットマップとして書き出したいです。
よろしくお願いします。
438デフォルトの名無しさん:2007/04/27(金) 13:45:39
単純にやるなら、ただ普通にw*h*dのメモリ確保すりゃいいだけだろ。
何も難しいことはない
439デフォルトの名無しさん:2007/04/27(金) 13:57:05
>>437
「ビットマップ」のフォーマットを読む適当なライブラリを拾ってきて、その形式にあわせればいいよ。
440デフォルトの名無しさん:2007/04/27(金) 15:27:29
>>437
そんなもん自作せんでも ImageMagick とか色々なのが・・・宿題か?
441デフォルトの名無しさん:2007/04/27(金) 15:54:26
char buf[256];
read(socket_fp,buf,256*sizeof(char))
ソケットから読み出した文字列はbufに格納されるのですが、
この時、\0文字の扱いはどうなるのでしょうか?
socketの内容をそのままコピーしてくれるのでしょうか?
それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
442デフォルトの名無しさん:2007/04/27(金) 15:55:49
>>441
>それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
そんな余計なことはしません。
443デフォルトの名無しさん:2007/04/27(金) 15:59:54
>>441
>ソケットから読み出した文字列はbufに格納されるのですが、
>この時、\0文字の扱いはどうなるのでしょうか?
バイト列に文字列なんて概念も無ければ特殊な文字もありません。
>socketの内容をそのままコピーしてくれるのでしょうか?
読み取ったものを読み取ったまま格納します。
>それとも格納した文字列の最後に\0文字を付けてくれるのでしょうか?
上2点から容易に導けるように、なんら余計なことはしません。
そもそも256バイト読めと言われても読める分しか読みません。
従って戻り値は必ず確認して、不足があるようなら再度呼び出してください。
444441:2007/04/27(金) 16:06:57
ありがとうございます
ついでにもう2つ質問があるのですが、
ソケットから読み取ったバイト列が256個未満だった場合、
のこりの空きはどうなるのでしょうか?
0で埋められるのでしょうか?

またこのようなシステムコールについて、
OSが異なれば副作用の完了点等の挙動は異なるモノなのでしょうか?
445デフォルトの名無しさん:2007/04/27(金) 16:27:00
>>444
>のこりの空きはどうなるのでしょうか?
どうもならない。
>0で埋められるのでしょうか?
だから余計なことはしないんだってば。しつこいな。

>またこのようなシステムコールについて、
>OSが異なれば副作用の完了点等の挙動は異なるモノなのでしょうか?
システムコールに副作用完了点はありません。
呼び出し時の問題なら、コンパイラ依存です。
446デフォルトの名無しさん:2007/04/27(金) 18:11:46
ttp://www.ncad.co.jp/~komata/c-kouza19.htm
このページの
sigpause(SIGALRM);
は、設定されたタイマーが0秒になるまで全ての処理を停止するってことですか?
また上の方のタイマーの時間を比較するところで
else{
val.it_value=oval.it_value;
oval.it_value.tv_sec=1;
oval.it_value.tv_usec=0;
}
としてるのは再設定されたタイマーの時間が元から設定されていたタイマーの時間より短い場合
元のタイマー設定時間をそのまま流用して、0秒になったら前のタイマーは1秒だけ待つってことですよね
447デフォルトの名無しさん:2007/04/27(金) 18:39:21
>>446
勉強するのは勝手なんで止めないけれど、現在のUnixでは押し並べてsigpause()は使用禁止になっているから要注意で。
また、秒単位より細かい精度のsleepをしたいだけなのなら、nanosleep()がある筈だからそれを使うこと。
#nanosleep()がない場合はusleep()で。
448446:2007/04/27(金) 18:50:42
>>447
いえ、signal関数の使い方を調べていました
Manpage見てもsigpause使用するなとなっていて詳しい解説なくて
自分の環境では試せないので両方ともいまいちどういうことをしているのか掴めなかったんです
449デフォルトの名無しさん:2007/04/28(土) 11:12:27
data[]={1,2,3,4,5,6,7}

と置いたときに、data内にいくつ数値が記憶されてるかカウントする関数ない?
450デフォルトの名無しさん:2007/04/28(土) 11:16:53
sizeof(data) / sizeof(dataの型)
451デフォルトの名無しさん:2007/04/28(土) 11:59:44
>>449
sizeof(data) / sizeof(* data)
452デフォルトの名無しさん:2007/04/28(土) 14:03:09
#define lengthof(a) (sizeof(a) / sizeof*(a))
とかよくやるが
453446:2007/04/28(土) 15:48:32
あ、oval.it_value.tv_sec=1としているのは丁度0秒だと先に元のタイマーが切れてしまうからで
処理が先に進まないようにwhileを使って、ついでにsigpauseを使うと
引数にしたシグナルが割り込むまでnopのような処理をするってことですかね
454デフォルトの名無しさん :2007/04/28(土) 17:42:31
C言語でphoebeというのを使ってるのですが、
#include <stdio.h>
int main(void)
{
printf("Hello world\n");
}
エラー E2209 借金大王.c 1: インクルードファイル 'stdio.h' を
オープンできない

というメッセージが出て困ってます。
455デフォルトの名無しさん:2007/04/28(土) 17:44:37
そうですか。
456デフォルトの名無しさん:2007/04/28(土) 18:39:09
>>454
困っているのですか。
457デフォルトの名無しさん:2007/04/28(土) 18:46:35
つ眼鏡
458デフォルトの名無しさん:2007/04/29(日) 00:03:02
>454
それコンパイラの設定やってないでしょ。
ヘルプみてちゃんと設定して再チャレンジ。
コンパイラをインストールしていない悪寒がするが、、、、。
459デフォルトの名無しさん:2007/04/29(日) 00:19:21
さすがにコンパイラ入れてなかったエラーメッセージもでないんでは
phoebeなんて使ったことないから知らないけれど
460デフォルトの名無しさん:2007/04/29(日) 00:20:06
char c;
c=fgetc(stdin);
c=fgetc(stdin);
c=fgetc(stdin);

と記述し、実行時に"a"と入力した場合、最後のcに格納されるのは何なのでしょうか?
fgetcをするごとにprintfをしてみると、改行(?)が表示されたのですが、その様に定義されているのでしょうか?
461デフォルトの名無しさん:2007/04/29(日) 00:24:44
printf("%d", c); とでもしてみればわかると思うが…

ところで、fgetcの戻り値はcharではなくintだよ。
462460:2007/04/29(日) 00:40:16
>>461
考えてみたら、2回目のcに'\n'が格納された後は入力待ちになりますよね。
意味不明なことを質問していました。すみません。

>fgetcの戻り値はcharではなくint
今までずっとcharだと思ってました…
463デフォルトの名無しさん:2007/04/29(日) 02:48:44
今C言語を勉強しているのですが、.hや.cppがどのような構造で動いてるのか
さっぱりわかりません・・・
教えていたたけませんでしょうか?
464デフォルトの名無しさん:2007/04/29(日) 03:04:54
>>463
多分、それC言語じゃないよ。
465デフォルトの名無しさん:2007/04/29(日) 03:08:38
あ・・・C++でした。
プラプラ入れ忘れです( ´・ω・)
466デフォルトの名無しさん:2007/04/29(日) 03:17:32
ダブルクォーテーションを早く入力する方法ないでしょうか?
467デフォルトの名無しさん:2007/04/29(日) 03:31:31
今はどうやって入力してるの?
468デフォルトの名無しさん:2007/04/29(日) 03:42:26
>>465
ここ、C++のスレじゃないよ。
469デフォルトの名無しさん:2007/04/29(日) 04:54:20
int num = load_ini;
char http_send_text[][] = {if(num && 1){"GET "},if(num && 2){"/ "}};
という感じで、char配列の宣言時に内部で条件分岐使った初期化をさせたいんですけど、
無理っぽいのでしょうか?
ポインタ使って動的にメモリ確保して文字列を格納する方法が一番最初に思い浮かぶのですが、
他に上のような単文で実現できるような上手い方法はありませんか?
コンパイラの機能特有のものでも構いませんので、詳細をおねがいします。
470デフォルトの名無しさん:2007/04/29(日) 08:25:36
>>468
あ・・・すいませんでした。
471デフォルトの名無しさん:2007/04/29(日) 08:25:45
素直に条件分岐でstrcpyじゃ駄目なの?
なんでも単文にすればいいってもんでもないだろうに。
472デフォルトの名無しさん:2007/04/29(日) 10:20:35
c言語でジョンソン法を使って、2工程のフローショップ問題を解くという課題が出されました。
誰かわかる人いたら、教えてください。
473デフォルトの名無しさん:2007/04/29(日) 10:30:31
何を聞きたいのか要点を絞れ

cの質問なのか?
ジョンソン法の質問なのか?
474デフォルトの名無しさん:2007/04/29(日) 11:18:04
すいません。
ジョンソン法をCではどのように作ればいいのか、ってことなんですけど。。。
475デフォルトの名無しさん: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)
476デフォルトの名無しさん:2007/04/29(日) 14:15:54
UWSCのような、自動でキーボード入力してくれる
プログラムをC言語で作りたいのですが、
参考になるサイトとかあれば教えてください。

具体的には、制御したいアプリケーションに対して、
・Alt+Kのようなショートカット入力
・ファイル名を自動でyymmdd形式で入力
を自動で行わせたいです。
477デフォルトの名無しさん:2007/04/29(日) 14:19:40
>>474
いくらなんでも漠然としすぎ
何が聞きたいかを整理してから来てくれんか
478デフォルトの名無しさん:2007/04/29(日) 15:00:44
Visual C++ 6.0でプロジェクト内の違うソースコード内に、違う型の同じ名前のグローバル変数がある場合に、
コンパイル時にエラーとする方法はないでしょうか?
ソースコードa.cppにSHORT i;
ソースコードb.cppにINT i;
と宣言した場合、コンパイル時にエラーを出力といった具合です。
479デフォルトの名無しさん:2007/04/29(日) 15:13:11
a.h と b.h にそれぞれ extern SHORT i; と extern INT i; があれば、
それを同時にインクルードするソースがあればエラーになる。

そうでなければ、リンク時にしかエラーは出ない。
480デフォルトの名無しさん:2007/04/29(日) 15:14:14
C++ ならグローバル変数使わずに
シングルトンパターン使おうぜ。
481デフォルトの名無しさん:2007/04/29(日) 15:31:04
>>477
>>474はそのプログラムを作って欲しいんじゃないの?w
482デフォルトの名無しさん:2007/04/29(日) 16:29:29
Cなんだがどうもエラーが出るんだ
elseが悪いらしいんでけどさっぱり
教えてください。

#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);

}
483デフォルトの名無しさん:2007/04/29(日) 16:33:19
多分そうだね。
誰か、ジョンソン法作ってあげなよw
484デフォルトの名無しさん:2007/04/29(日) 16:50:55
>>482
elseが悪いらしいので
elseを直してください
485デフォルトの名無しさん:2007/04/29(日) 17:15:05
>>482
は現状こうなってる。


...
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);
}
...
486482:2007/04/29(日) 17:20:06
>>485
そんな事はわかっています。エラーを出なくしたいのです。
487デフォルトの名無しさん:2007/04/29(日) 17:30:23
>>485
なんとなく分かったような
分からないような。。
488デフォルトの名無しさん:2007/04/29(日) 17:44:05
プリントエフカンマで区切り忘れてるよ
489デフォルトの名無しさん:2007/04/29(日) 17:47:36
パソコンから書き込めないので携帯からですが
単純なミスだったようです
ありがとうございました。
490デフォルトの名無しさん:2007/04/29(日) 21:04:45
今、独学の勉強のため簡易インターネットブラウザを組んでいるのですが、
接続先のホストネームしか知らない場合、
どのように相手先のIPアドレスを得れば良いのでしょうか?
具体的にはどのような関数を使えばいいのでしょうか?
491デフォルトの名無しさん:2007/04/29(日) 21:10:55
>>490
gethostbyname
492デフォルトの名無しさん:2007/04/29(日) 21:31:24
getaddrinfoは何に使うのでしょうか?
493デフォルトの名無しさん:2007/04/29(日) 21:37:28
getmankosmell
494デフォルトの名無しさん:2007/04/29(日) 23:39:20
getaddrinfoはIPv6でもイケル次世代版。
495デフォルトの名無しさん:2007/04/30(月) 02:14:08
IPv6なんて必要ない
鯖のIPアドレス覚えられん
496デフォルトの名無しさん:2007/04/30(月) 02:16:28
>>495
あんたにとって必要か不必要かで、全世界レベルの規格や規定を覆すことは出来ないのさ・・・
497デフォルトの名無しさん:2007/04/30(月) 02:22:53
>>496
でも実際にぜんぜん普及してないじゃん
Sunあたりがすべてのマシンをネットに繋げと叫ばない限りあと30年くらいIPv4でもおk
498デフォルトの名無しさん:2007/04/30(月) 02:25:16
いや、IPアドレスが不足するギリギリになってからじゃ遅いってw
徐々に移行しないと、俺らも困る羽目になるぞ。
499デフォルトの名無しさん:2007/04/30(月) 02:43:58
実際に不足するとしてだ。不足して困る前に以降が始まると思う?
不足して大混乱になったあげくに「こんなこともあろうかと」と
いいつつIPv6が出てきて段々と混乱が収束ってパターンじゃないのかなあ。
500デフォルトの名無しさん:2007/04/30(月) 02:48:27
> 不足して困る前に以降が始まると思う
当たり前じゃん。っつーかお前無知だな。知ったかぶったり自分都合で考えない方が良いぞ。
不足すると分かっているから32bitから増やしてんだがw
そもそも32bitで約43億通りだろ?実際にはそれだけ固有のものは出来ないが
地球上の人口とユーザを考えたら絶対に今世紀中に不足するよ。
http://ja.wikipedia.org/wiki/IPv6
501デフォルトの名無しさん:2007/04/30(月) 02:58:58
>>497
vistaって、v6対応でしょ?
ISPの機材の変更に金がかかるらしいけど、あと10年かからんで移行しそうな気が。
502デフォルトの名無しさん:2007/04/30(月) 03:11:12
対応というならXPで既に対応してた。デフォルトがOFFだったが。
503デフォルトの名無しさん:2007/04/30(月) 03:29:22
動的に確保したメモリの開放作業を一括して管理したのですが、
どうしたらいいでしょうか?

どこかにリストを作っておいて開放作業が必要なリソースを登録しておき、
最後になったらリストを参照して開放させるで良いでしょうか?
この他にみなさんおオススメの方法はありませんか?
504デフォルトの名無しさん:2007/04/30(月) 06:40:12
>>503
それでいいと思うよ
その一括開放作業をさせたいメモリを確保する関数に登録作業も行わせればok
505デフォルトの名無しさん:2007/04/30(月) 11:59:29
ldコマンド使って連結処理する際にファイル名の順番が違うと
実行ファイルは生成されるのにコアダンプすることがあるんですが
なぜなのでしょうか?
結構調べたんですがよくわかりませんでした--;
↓だと動くんですが
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
506デフォルトの名無しさん:2007/04/30(月) 12:52:41
sscanf使って
[test]
って文字列から
testだけ抜き出したいんですけどどうすればいいんでしょうか?

sscanf( "[test]" , "[%s]" , str );
と書いても test] が抜き出されるんです。
507デフォルトの名無しさん:2007/04/30(月) 12:55:43
事故解決島っ差多々
sscanf( "[test]" , "[%[^]\n]]" , str );
うーんマンダム
508デフォルトの名無しさん:2007/04/30(月) 13:05:43
\nいらんな
[test\n
までひろっちまう
509デフォルトの名無しさん:2007/04/30(月) 13:06:23
sscanfすげえ
510デフォルトの名無しさん:2007/04/30(月) 16:18:49
>>505
関数名が同じものがどこかに含まれてない?
リンクの順番を変えると有効になる関数が交換して、
結果として変なことになるよ。

たとえばパラメータにポインタを期待している関数に
整数を渡したら惨事が起こるでしょ。それと同じことがおきているんじゃないの。
511デフォルトの名無しさん:2007/04/30(月) 18:47:57
>>505
同じ名前の関数が複数箇所に入ってるんじゃね?
512デフォルトの名無しさん:2007/04/30(月) 19:17:17
>>500
お前も無知だな
513デフォルトの名無しさん:2007/04/30(月) 20:36:35
プログラムの途中でメモリ(ヒープ領域)の断片化を解消したいのですが、
C言語で可能でしょうか?
また、可能な場合に具体的にはどのような処理を行うのでしょうか?
514デフォルトの名無しさん:2007/04/30(月) 20:43:19
自分ででかいブロック取ってきて切り分けて使え。
再配置は不可能だから。
515505:2007/04/30(月) 21:19:16
>>510
>>511
そんな気がしてきました。
↓見てるんですが、言われてみれば確かに同じ関数っぽいのが複数ファイルにありますね

ttp://www.globe.to/~oka326/archive/elf_doc_sgml_ja/elf_doc-3.html
516デフォルトの名無しさん:2007/04/30(月) 21:26:24
>>513
再配置型GCでも実装すれば
517デフォルトの名無しさん:2007/04/30(月) 22:41:53
>>515
自分でいじれる部分なら、バッティングしている関数をstaticに
して回避できるけど、いじれなかったり、他のファイルから呼ん
でたら無理だな。
518513:2007/04/30(月) 23:27:09
マツリプロセスかマルチスレッドのメモリ管理を実現したいのですが、
格納する対象がどのくらいの大きさになるか、
またどのくらいの数量の処理になるのか予測できない状態なので、
各処理単位に動的にメモリを確保させて使わせるように考えています。

この場合は元になるプロセスでメモリのリロケーションとか
行わなければならないのでしょうか?
一番簡単にメモリ管理を行う方法は他にありませんか?
519デフォルトの名無しさん:2007/04/30(月) 23:28:38
マツリプロセスって?お祭り騒ぎ?
520デフォルトの名無しさん:2007/04/30(月) 23:31:40
今日のNHKラジオみたいなもんか
521デフォルトの名無しさん:2007/05/01(火) 00:54:50
#include <stdio.h>
#define MAX 1000000
int main(void)
{
int a[MAX],i;
printf("実行されました\n");
return 0;
}
上記のプログラムについてですが、MAXの0を1つ消して10万にすると実行されますが
100万にすると自分の環境では実行されませんでした。使用しているのはBCCで
OSはWinXPです。配列の要素に上限ってありますか?
522デフォルトの名無しさん:2007/05/01(火) 00:57:08
使用可能なスタック領域には限度がある
523デフォルトの名無しさん:2007/05/01(火) 00:58:34
>>521
static int a[MAX];
にするか、コンパイラのオプションでスタックサイズを大きくするか。
524デフォルトの名無しさん:2007/05/01(火) 01:00:01
>>522 >>523
ご意見、ありがとうございます。それについて調べてきます。
525デフォルトの名無しさん:2007/05/01(火) 01:05:20
intが1つで4バイト、これが1,000,000個で4,000,000バイト(約4MB)。a[]が自動変数で
あるためにこの領域はスタック上に確保されることになる。ということでリンカオプションで
これ以上の値をスタックサイズに指定していれば実行可能になる。しかしこのように
大きい領域を必要とする場合はmallocでヒープから取得して使用するのがフツー。
526デフォルトの名無しさん:2007/05/01(火) 01:06:55
でかいサイズだとmalloc()が普通なのか?
527デフォルトの名無しさん:2007/05/01(火) 01:08:19
>>526
それを防ぐには、イメージそのものをなることはできないのだ。
少なくとも今の技術では無理だ。
528デフォルトの名無しさん:2007/05/01(火) 01:11:54
サイズ固定なら配列でいいだろ。
529デフォルトの名無しさん:2007/05/01(火) 01:17:19
>>528
抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。

仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
530デフォルトの名無しさん:2007/05/01(火) 01:36:58
>>529
> 小振りながら彼女の肢体はしなやかに、

まで読んだ。
531デフォルトの名無しさん:2007/05/01(火) 01:49:02
そういや高校の頃SF研で馬鹿みたいな小説書いたら
部長からラブコメ禁止令くらって後半2割くらい検閲削除されたことがある。
532デフォルトの名無しさん:2007/05/01(火) 01:53:49
>>531
ラブコメってどうせ男同士だったりすんじゃねぇのか?
検閲削除で、正解だ。部長、GJ!
533デフォルトの名無しさん:2007/05/01(火) 01:58:30
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。

抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
534デフォルトの名無しさん:2007/05/01(火) 02:58:54
GET /b/src/1177951924420.png HTTP/1.1
Accept: */*
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
535デフォルトの名無しさん:2007/05/01(火) 04:00:07
wavファイルを連結するプログラムってのを見て
そんなんできんの?と実行したら本当にできた
600行ぐらいだったが感動した
どれぐらい勉強すればこんなの作れるようになるの
536デフォルトの名無しさん:2007/05/01(火) 04:12:13
wav ファイルの構造を知れば
それなりの初心者にも簡単に作れるかと。
537534:2007/05/01(火) 04:56:01
途中で送信してしまいましたすみません。
TCPソケットで簡易ブラウザを作ってる者ですが、
jpegをhttpプロトコルでダウンロードし、ヘッダとボディ部に分ける所まで出来ました。
ここで質問があるのですが、httpプロトコルのボディ部はそのままjpegフォーマットになっているのでしょうか?
手を加えなくても表示させたり、ディスクに保存できるのでしょうか?
転送コーデックが設定されていた場合、C言語でつかえるライブラリなどはありませんか?
538デフォルトの名無しさん:2007/05/01(火) 05:13:20
RFC2616嫁
539デフォルトの名無しさん:2007/05/01(火) 05:27:26
>>537
基本的には >>538 です。
簡単に言うと、ボディ部がそのまま JPEG にできることもあるし、gzip
で圧縮されていることもあるし、chunked encoding になってて途中に
何かが挟まってることもある。そういうのをヘッダで判断する。

540gost :2007/05/01(火) 13:47:01
符号なし整数型の変数 n が、4の倍数であれば、"n is ROUND(4)"、
>> 4の倍数で無ければ、"n is not ROUND(4)" を出力するプログラムを教えてください
541デフォルトの名無しさん:2007/05/01(火) 13:50:53
#include <stdio.h>
void 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 )

542デフォルトの名無しさん:2007/05/01(火) 13:52:57
× if(hantei=Y){
○ if(hantei='Y'){

シングルクォートでかこまにゃ
543デフォルトの名無しさん:2007/05/01(火) 13:54:53
>>540
まるちうざい
544デフォルトの名無しさん:2007/05/01(火) 13:54:56
代入してどうすんだよ
545デフォルトの名無しさん:2007/05/01(火) 13:56:42
代入とシングルなおしたら一応動いた。
しかし、判定の前に結果が出てしまう
546デフォルトの名無しさん:2007/05/01(火) 14:07:30
>>545
scanf()が%dで数字を変換したあとに食い残した改行文字を、
次のscanf()が食っちまうから。
547デフォルトの名無しさん:2007/05/01(火) 14:09:08
そこで%cの前にスペースを一個入れる
だっけ?
548デフォルトの名無しさん:2007/05/01(火) 14:26:25
>>541

printf("計算結果:%d");


いったい何を出力させるつもりだ?
549デフォルトの名無しさん:2007/05/01(火) 14:36:29
>>541
scanf("%d",&kaz);
fflush(stdin);
550デフォルトの名無しさん:2007/05/01(火) 14:38:43
標準入力のフラッシュは・・・
551デフォルトの名無しさん:2007/05/01(火) 14:39:17
>>550
言いたいことがあるならはっきり言え
552デフォルトの名無しさん:2007/05/01(火) 14:39:20
rewind(stdin);
553デフォルトの名無しさん:2007/05/01(火) 14:42:38
>>550
何か問題でも?これといって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
554デフォルトの名無しさん:2007/05/01(火) 14:44:09
>>553
問題はないよ。何の足しにもならない環境があるだけで。
555デフォルトの名無しさん:2007/05/01(火) 14:45:03
>>554
だったらその  環境  をあげてみたら?古いものだったら却下な。
逐一古い発展途上のものを使ってたらやってられない業界だから
556デフォルトの名無しさん:2007/05/01(火) 14:45:06
>>553
環境依存だってことだろ。
557デフォルトの名無しさん:2007/05/01(火) 14:46:17
んじゃfflushを使わないやり方を提案したらぁ?w
ごちゃごちゃうるせーんだよ、実例を挙げないバカほどうぜぇ役立たずなクズはいねーもんだなぁをいっw
558デフォルトの名無しさん:2007/05/01(火) 14:46:32
>>555
Cygwinはフラッシュきかなかったよ。
559デフォルトの名無しさん:2007/05/01(火) 14:46:34
>>553
fflushは出力ストリーム用だ
560こいつら無知のくせしてだめなことしか覚えないバカwwww:2007/05/01(火) 14:47:03
550 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:38:43
標準入力のフラッシュは・・・

554 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:44:09
>>553
問題はないよ。何の足しにもならない環境があるだけで。

556 名前:デフォルトの名無しさん 投稿日:2007/05/01(火) 14:45:06
>>553
環境依存だってことだろ。

こ  と  だ  ろ  ?  その証拠を提示してくれ。勝手にそういうことにしないでくれよw
561デフォルトの名無しさん:2007/05/01(火) 14:47:42
>>549
だいたい、どういう意図で、その位置にfflush()入れてるのか分からない。
562デフォルトの名無しさん:2007/05/01(火) 14:47:51
何キレてんだ?
入力バッファをクリアする標準的な手段は無いよ
563デフォルトの名無しさん:2007/05/01(火) 14:50:13
環境依存しないでクリアするコードも簡単だし、あえて依存するコードを書く必要ないよな。
scanf()使ってると、クリアもいろいろ面倒な部分があるけど。
564デフォルトの名無しさん:2007/05/01(火) 14:52:53
scanfなんて最初の勉強のときくらいしか使わないからなあ
565デフォルトの名無しさん: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'){
566デフォルトの名無しさん:2007/05/01(火) 15:05:20
>>565のchはmain関数の中に int ch; を宣言して、char hantei は使用していない
567デフォルトの名無しさん:2007/05/01(火) 15:09:20
for(cnt=0;cnt<5;cnt++)
kaz=kaz*kaz;
っつーか、この計算って、2を入力してcnt<4にしたら値は表示されたけど
それ以上になると2^32を超えてダメなんじゃね?
568デフォルトの名無しさん:2007/05/01(火) 15:21:49
あと>>565は最初の数字の入力の後に余計な文字(空白とか)入れずに
数字[改行]した場合有効だが、余計なことをするとやはり使えないから。
要するにscanf("%d",&kaz);のところも変えるべきだな
569デフォルトの名無しさん:2007/05/01(火) 15:26:02
でも結局>>567の指摘の通り、入力する数字は1しかまともに動かない罠w
570デフォルトの名無しさん:2007/05/01(火) 16:05:29
古い環境を扱い続けなきゃいけない場合もあるのになあ。
571デフォルトの名無しさん:2007/05/01(火) 16:15:16
環境?処理系依存だべ
572デフォルトの名無しさん:2007/05/01(火) 16:36:02
>>570
そういう場合はその環境では出来ないことは出来ないで通すハメになるんだが?
そんなもののために詰まらん手間や時間のロスがあって済むならやれば良い
573デフォルトの名無しさん:2007/05/01(火) 16:46:20
要件による。
以上。
574デフォルトの名無しさん:2007/05/01(火) 16:47:01
古い新しいの問題じゃないだろ。
575デフォルトの名無しさん:2007/05/01(火) 17:08:25
USBが実装されていない環境じゃUSB接続のデバイスは使えない
だったら実装されているもので使えるものを使って対処する、そんなもんだろ?
出来ないなら出来ないなりに頭を使えYO!
>>565みたく実装されている範囲内で自分で作って実装とかな
576デフォルトの名無しさん:2007/05/01(火) 17:19:46
問題は、fflush(stdin); が当然と思ってたら、
そうでないところで動かす必要性が出た場合に混乱するということ。
その知識を持っておくに越したことは無い。
577デフォルトの名無しさん:2007/05/01(火) 17:24:11
いや、話の論点はfflushだけでなく、使えないものは使えない、それじゃ使えるものを
実装されている範囲内で用意しようってことなんだが?出来ないものは出来ない
たとえそれが新しくても。だから幅広く共通するものを使う、そうだろ?
578デフォルトの名無しさん:2007/05/01(火) 17:25:11
scanf()なんて使わないで、行単位で処理すればいいじゃん。
579デフォルトの名無しさん:2007/05/01(火) 17:34:51
>>577
限られた範囲内でしか使わない事が確定してる場合は
処理速度とか確実性とかの高いものを採用するのは悪い事ではない。
580デフォルトの名無しさん:2007/05/01(火) 17:43:12
いくら危ないコードでも十分に分かって使う分には問題ないわけだから、
初心者に注意書きなしで変なことを教えなければ大丈夫だろ。
581デフォルトの名無しさん:2007/05/01(火) 17:48:00
入力を読み飛ばすコードを書けばいいじゃん。
fflush(stdin)とかrewind(stdin)とか、ちょっとコードが短くなるけどさ。
582デフォルトの名無しさん:2007/05/01(火) 17:50:02
fflush(stdin)とかrewind(stdin)とか、リダイレクトされたときの動作がわからん。
583デフォルトの名無しさん:2007/05/01(火) 18:07:40
stdinが端末につながっているときにrewind(stdin)とかされたら、
画面に「もう一度最初から打ち直してください」って出るようにしたらいいんじゃね?
584デフォルトの名無しさん:2007/05/01(火) 18:10:48
リダイレクトされた時としない時とで動作の違うコマンドとかよくある話だし。
585デフォルトの名無しさん:2007/05/01(火) 18:11:17
紙テープにつながってたら巻き戻すだけでいいしな
586デフォルトの名無しさん:2007/05/01(火) 18:33:48
scanf("%*[^\n]%*c");

これじゃダメかい?
587デフォルトの名無しさん:2007/05/01(火) 19:05:20
while(getchar() != '\n');
とかやっちゃう俺チキン
588デフォルトの名無しさん:2007/05/01(火) 19:10:23
getchar じゃなくて fgets したい場合は
最初の一文字だけ getchar して、
それが改行かどうか注意しつつ fgets していくことになるのか?
589デフォルトの名無しさん:2007/05/01(火) 20:10:18
>>587
EOFもみないと。
590デフォルトの名無しさん:2007/05/01(火) 21:28:03
うはw
入門篇なのにぜんぜんついていけないorz
マジで入門なんですかね?
591デフォルトの名無しさん:2007/05/01(火) 21:32:16
>>590
http://pc11.2ch.net/test/read.cgi/tech/1175137007/
こっちへくれば、きっとナイスガイな 33 が手と足取り教えてくれるぞw
592デフォルトの名無しさん:2007/05/01(火) 21:44:57
stdinの掃除の決定版っていまだに見たことがないな。
fflush(stdin);
はダメって話はよくきくんだが。
593デフォルトの名無しさん:2007/05/01(火) 21:59:56
某MLのfor novicesよりは入門らしいと思う
594デフォルトの名無しさん:2007/05/01(火) 22:26:46
foo.cとbar.cがあります。
foo.cにはfunc1()とfunc2()が含まれていて、
#include "foo.c"
とすることで、bar.cのmainからfunc1()を呼び出したい。

void func1()
{

func2(); ・・・・(a)

}

のような中身だとして、
func2の挙動だけ変更したい。
ただし、foo.c自体は改変してはいけないとします。
595594:2007/05/01(火) 22:27:22
(続き)
bar.cの中で、
#define func1 func1_org
#include "foo.c"
#undef func1

void func2()
{

}

void main()
{
func1();
}

のようにしたんだけども、
(a)のところもfunc2_org()に置き換わってしまうので、
元と同じ挙動になってしまう。
foo.cを書き換えずにfunc2()の中身だけ変更することは可能ですか?
596デフォルトの名無しさん:2007/05/01(火) 22:28:04
ソースファイルを#includeするのってよくあることですか?
597デフォルトの名無しさん:2007/05/01(火) 22:28:54
>>593
本家よりはマシなんじゃないのか?
598デフォルトの名無しさん:2007/05/01(火) 22:29:58
>>596
微妙。
599デフォルトの名無しさん:2007/05/01(火) 22:31:34
>>595
#define func2() func2_org()
#include "foo.c"
#undef func2

void func2_org() { ... }

でいけると思う。
func2() という関数とマクロが両方ある場合は、
func2() はマクロの (func2)() が関数の呼び出しになる。
600594:2007/05/01(火) 22:33:20
>>596, 598
いや、こんなことするの自分でも初めてなんですが、
foo.cのほうは変なライセンスなので弄ってはいけない。
だけど、そこにある関数を部分的に使用したいんです。
601デフォルトの名無しさん:2007/05/01(火) 22:37:52
>>589
あれ、入力吐き捨てるだけでも必要?
どうでもいいけど^Zの後に入力を続けちゃうと入力待ちのままになるのね…
602594:2007/05/01(火) 22:42:30
>>599
これって、func2が
void func2(int i)
とか、引数があってもOK?
603デフォルトの名無しさん:2007/05/01(火) 22:46:27
func2の引数の数にあわせてdefineを書き換えるべし
604594:2007/05/01(火) 22:46:41
>>595
>#define func1 func1_org
>#include "foo.c"
>#undef func1

ここ書き間違いでした。
#define func2 func2_org
#include "foo.c"
#undef func2
605594:2007/05/01(火) 22:52:46
bar.c:507: error: redefinition of 'func2_org'
foo.c:2292: error: previous definition of 'func2_org' was here
のようになってしまいます。
606デフォルトの名無しさん:2007/05/01(火) 23:04:46
>>592
決定版って、普通に読み捨てればいいだけじゃん。
607デフォルトの名無しさん:2007/05/02(水) 00:08:37
>>592
scanf("%*[^\n]%*c");
これでいいだろ
608デフォルトの名無しさん:2007/05/02(水) 00:40:38
>>605
bar.c で foo.c をインクルードしてるのに
何で foo.c をまた単独でコンパイルしてるんだぜ?
609デフォルトの名無しさん:2007/05/02(水) 00:51:42
『1から入力した数値までの合計を算出する』、ってプログラムなんですけど、
どうしても「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);

}

610デフォルトの名無しさん:2007/05/02(水) 00:53:17
まず、何を質問したいのか言うべきではないのかね?
611デフォルトの名無しさん:2007/05/02(水) 00:54:31
while(n > 0)
が偽になった時点でどう考えてもnは0以下
612デフォルトの名無しさん:2007/05/02(水) 00:54:40
どこまでの知識があるのかが分からないと
どこまでの事を使っていいのか分からない
613609:2007/05/02(水) 00:55:56
すいません、テキストの次ページに解決方法が載ってました。
お騒がせしました。
614デフォルトの名無しさん:2007/05/02(水) 00:58:32
ゴールデンウィークだなあ・・・
615デフォルトの名無しさん:2007/05/02(水) 00:59:32
>>613
氏んでいいぞ
616デフォルトの名無しさん:2007/05/02(水) 01:57:32
>>615
もちつけw
なんてたってゴールデンウィークだからな
まあそんなオレは新入社員がぶっ壊した鯖2つを復旧中で休みなし
なんで新入社員に鯖管やらせるんだよ
617デフォルトの名無しさん:2007/05/02(水) 01:58:32
新鮮な方がいいんだよ、鯖だけに
618デフォルトの名無しさん:2007/05/02(水) 02:03:22
おいおまいら
人の宿題をやってあげるときは
ソースを全角で書け
619デフォルトの名無しさん:2007/05/02(水) 02:50:08
全角を半角にするくらい、どうってことないよな・・・選択して>変換キーでもイケるし
620デフォルトの名無しさん:2007/05/02(水) 03:43:27
どこぞのスレよろしく2進数に変換するとか
621デフォルトの名無しさん:2007/05/02(水) 03:53:44
そんな意地悪しても文句言われたりしてうざいだけだから、やんないほうがいいよ。
622デフォルトの名無しさん:2007/05/02(水) 04:02:01
そうかバイナリーを貼りつければいいのか
623デフォルトの名無しさん:2007/05/02(水) 04:12:53
そんなやつはバカナリ(コロスケ風に)
624デフォルトの名無しさん:2007/05/02(水) 09:06:05
勉三さんがつんつるてん!
勉三さんがつんつるてん!(壊れたコロスケ風に)
625デフォルトの名無しさん:2007/05/02(水) 10:26:43
だれかうまい棒
626デフォルトの名無しさん:2007/05/02(水) 10:57:33
#include <stdio.h>

int 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にしたいんですけどうまくいかないです。
だれかたすけてください。
627デフォルトの名無しさん:2007/05/02(水) 11:04:27
char *gyaku(char *a)
{
  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
}
628デフォルトの名無しさん:2007/05/02(水) 11:06:39
>>626
文字列リテラルは初期化の時しか使っちゃらめぇ…
プロトタイプ宣言をmainに入れちゃらめぇ…
629デフォルトの名無しさん:2007/05/02(水) 11:06:46
>>627
ありがとうございます。
ポインタを戻り値にはできないのでしょうか??
630デフォルトの名無しさん:2007/05/02(水) 11:07:43
>626
つっこみどころはいろいろあるが根本的にまずいのは
ローカルの自動変数のポインタを返すのがまずい。
渡された配列の内容が変わってもいいのならaを直接
いじればいいのでは?
631デフォルトの名無しさん:2007/05/02(水) 11:07:49
>>629
関数gyakuの戻り値の型はchar*で、間違いなくポインタだが。
632デフォルトの名無しさん:2007/05/02(水) 11:15:21
>ローカルの自動変数のポインタを返すのがまずい。
ここだけ的外れ。
633デフォルトの名無しさん:2007/05/02(水) 11:16:44
>>630
>ローカルの自動変数のポインタを返すのがまずい。
これは別にいいのよ。Cは値渡しだから。
634デフォルトの名無しさん:2007/05/02(水) 11:18:43
#include <stdio.h>
#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;
}
635449:2007/05/02(水) 11:19:40
相当な遅レスすまん。

>>450,451,452
回答dクス。
助かりました。
636デフォルトの名無しさん:2007/05/02(水) 11:28:26
>>634
文字列なんだから、strlen使えばいいだろと思う。
637デフォルトの名無しさん:2007/05/02(水) 11:30:58
626です。
みなさんありがとうございます。
勉強続けてみます。
638デフォルトの名無しさん:2007/05/02(水) 11:31:01
( ゚Д゚)ハッ!
639デフォルトの名無しさん:2007/05/02(水) 11:34:53
>633
ああ、ごめ。配列と勘違いしてた。

話は変わってプロトタイプ宣言をmainの中でしてもいいでしょ。ふつうはしないけどね。



640デフォルトの名無しさん: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 ;
}
641デフォルトの名無しさん:2007/05/02(水) 11:36:58
>>639
プロトタイプ宣言が有効となるスコープが main() 内のみ ってやつか
あんまり見ないねー
642デフォルトの名無しさん:2007/05/02(水) 11:43:31
でも実際のところ、スコープお構いなしに宣言した場所から下、
翻訳単位の残りの部分ずっとその宣言が有効になる独自拡張を施した処理系は結構ある。
643デフォルトの名無しさん:2007/05/02(水) 12:31:06
共用体はどういうときに使われますか?
入門書に出てきたんですが、利用する状況をイメージできませんでした。
644デフォルトの名無しさん:2007/05/02(水) 12:36:17
enum Type {Integer, Real};

struct Data
{
  enum Type type;
  union {
    int integer;
    double real;
  } d;
};

例えばこうして時と場合に応じて整数と実数のどちらの形でも保持できるデータ構造とか
645デフォルトの名無しさん:2007/05/02(水) 13:14:09
>>639
プロトタイプ宣言を関数ブロックの先頭に書いておいたソースが、新しい
gcc でコンパイルエラーになってびっくりしたのを思い出した。
(外に出したら出来たけど、うーむ・・・)
646デフォルトの名無しさん:2007/05/02(水) 13:16:22
>>641
main() だとまずないけど、2つの関数を呼び合って再帰させる
ようなのだと書くこともある。
647デフォルトの名無しさん:2007/05/02(水) 14:30:27
>>626
*(b+1)って書いてるけど
その分のメモリーを確保してないでしょ
char * b;でchar型のメモリーアドレスを保持するメモリーを1つ確保しただけだから
648デフォルトの名無しさん:2007/05/02(水) 14:33:20
>>646
で、>>642,645 のような処理系で跳ねられることもありうると…

プロトタイプ宣言の有効範囲をスコープで制御するのはマイナーな部類なんかな
649デフォルトの名無しさん:2007/05/02(水) 14:46:30
関数自体がグローバルスコープだから、ローカルスコープで宣言しても意味がないからね。
650デフォルトの名無しさん:2007/05/02(水) 14:47:20
>>643
普通はライブラリに丸投げすりゃ良いことだけど
例えば自分でTCPプロトコル叩きたいとかって場合に
共用体使うことでTCPヘッダのパースを行うなんてやり方もある
651デフォルトの名無しさん:2007/05/02(水) 15:02:35
ttp://homepage3.nifty.com/mmgames/c_guide/17-03.htmlを参考にして

#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生成となります。
652デフォルトの名無しさん: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;}
653デフォルトの名無しさん:2007/05/02(水) 15:16:21
>>652
そのサイトには「できない」と書いてあるようだが。
654デフォルトの名無しさん:2007/05/02(水) 15:24:05
>>652
デバッグしてください。
デバッガで変数の値を見ながらステップ実行するとか、要所要所でprintfするとかで、
どこまで思った通りに動いているのか確認しましょう。

そのwhileは\を\\に変換してるようだけど、そんなことしなくていいよ。
655デフォルトの名無しさん:2007/05/02(水) 15:25:26
>>652
Win32APIじゃないんだからわざわざ\を\\にしなくていい
656デフォルトの名無しさん:2007/05/02(水) 15:27:41
>651の紹介しているサイトも酷い内容だなぁ。

>>651
問題があるようなら、その生成したファイル名(inp)を出力してみましょう。
657652:2007/05/02(水) 15:41:33
レスどうもありがとうございます
できない、ことをやっているのか、それも問題ですね。
拾い読みのみでなんとかしようとしてるど素人なので時間はかかりますが
アドバイス試していこうと思います。
コマンドプロンプトとかかなり無縁そうな人に多少の需要があるようなので、なるべく簡単なUIにしたいんですよね。
658652:2007/05/02(水) 15:53:52
>>656
printf("%s\n",inp);
fflush(stdin);
getchar();
(やめたほうがいいんでしょうか)だと

C:\\Documents and Settings\\All Users\\デスクトップ\\Norton AntiVirus 2003.lnk

と意図した結果にはなりました
659デフォルトの名無しさん:2007/05/02(水) 16:02:45
getchar()の前にstdinフラッシュって意味ないだろ。
660デフォルトの名無しさん:2007/05/02(水) 16:15:14
>>659
既にstdinに何かあった場合用じゃね?
まぁそもそも入力ストリームに対するfflushの動作は未定義なんだが
661デフォルトの名無しさん:2007/05/02(水) 16:15:39
>>549 あたりにまたループか?
662デフォルトの名無しさん:2007/05/02(水) 16:17:55
>>660
もとのページ見たら、なんの意味も無く入れてあるぞ。
663デフォルトの名無しさん:2007/05/02(水) 16:21:31
ロックマン2のフラッシュマンにお仕置きしてもらうべ〜〜〜
664デフォルトの名無しさん:2007/05/02(水) 16:30:27
>>658
要求されているわけでもないのにディレクトリ区切り文字が\\になっているわけで、
>654や>655が指摘している通りその余計な処理が原因だと言うことがよく判るね。

結論:fopen()に渡す文字列はバックスラッシュをダブらせる必要は無い。
665デフォルトの名無しさん:2007/05/02(水) 16:59:28
>>664
それ直してもexeにファイルをドラッグしたら出来ない。
コマンドからだとおk。

試しにfcloseでtest.txtへの書き込みを終えてから、
test.txtをfopenして中身を取り出してみたら出来た。
しかしプログラムが終わったあとtest.txtはどこにもなかった。
何故だろう・・・
666デフォルトの名無しさん:2007/05/02(水) 17:05:02
D&Dで駆動した時、アプリケーションから見たカレントディレクトリは何処でしょうね
667デフォルトの名無しさん:2007/05/02(水) 17:05:03
>>665
その実行モジュールのワークディレクトリを指定していないから、デフォルトのワークディレクトリに書かれているんじゃね?
#もしかして、My Documentsとかか?w
668デフォルトの名無しさん:2007/05/02(水) 17:07:37
>>667
それを考えて今ローカルディスク全体に検索かけてます。
669652:2007/05/02(水) 17:25:41
はじめは単純にこのようにしていました
FILE *file1;
file1 = fopen(argv[1], "rb");
ファイルにドラッグした挙動は×、プロンプト窓にドラッグは○、でした
printf("%s\n",argv[1]);
ファイルにドラッグした挙動は○、プロンプト窓にドラッグは○
なのでなぜかなと思っていたところ次のサイトを教わったので置換をしてみたんです。
ttp://www.ipa.go.jp/security/awareness/vendor/programming/b08_01_main.html
670デフォルトの名無しさん:2007/05/02(水) 17:34:09
>>669
"%s\n"では末尾に空白(や改行などの制御文字)がついていても見えないから、"[%s]\n"などとしてみるといいよ。
#この場合がそれかどうかは知らんが。
671:2007/05/02(水) 18:42:10
1000個までの整数あるいは小数を打ち込んで,その平均と標準偏差を表示することのできるプログラムを作成せよ.
っていう内容の課題がでてるんですけど
まだ初心者レベルなんでわかりません;
教えてください!!
672デフォルトの名無しさん:2007/05/02(水) 18:46:42
>>671
float n[1000],heikin=0,hensa;
int i;

for(i=0;i<1000;i++){
scanf("%f",n[i]);
heikin+=n[i];
}
heikin/=1000;//←heikinに平均が入る

偏差ってどうやって出すんだっけ?
平均との差の二乗を、どうのこうのってやるんだよな、確か。
673668:2007/05/02(水) 19:00:11
#include <stdio.h>
#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のディレクトリを取り出して出力してみた。
変数とかファイル出力は適当。一応これでドラッグ&ドロップでファイル作れた。
674:2007/05/02(水) 19:06:43
こんな難しいんですか!?
まだ基本的なことしかしてないのにこんな難しいやり方の課題を出されてたんですね↓
びっくりです;
675デフォルトの名無しさん:2007/05/02(水) 19:13:05
1000個入力するのが一番大変だけどなw

問題の方は1000個固定じゃなくて、最大1000個なんだろうけど。
676デフォルトの名無しさん:2007/05/02(水) 19:13:10
人のソースは難しそうに見えるんだよ。何十回も読んで少しずつ解釈していけばいいよ。
677デフォルトの名無しさん:2007/05/02(水) 19:13:38
この問題って前にも見た気がするんだが
678デフォルトの名無しさん:2007/05/02(水) 19:14:23
>>674
あと、>>673 は別の話題だからな
679デフォルトの名無しさん:2007/05/02(水) 19:16:57
あー宿題スレだ
[2] 問題文(含コード&リンク):
1000個までの、整数あるいは少数を打ち込んで、
その平均と標準偏差を表示することのできるプログラムを作成せよ。

http://pc11.2ch.net/test/read.cgi/tech/1176996941/247

>>671
解答ついてるから見てみ
まさか同一人物じゃないよな?
680:2007/05/02(水) 19:21:29

はいっありがとうございます!!
>>677
そうなんですか!?
きっとみんなできないのかも;
>>678
ええ!?
別のですか?
すみません;
>>679
ありがとうございます!!!!
同一人物ではないです;
まじ助かりました☆
681デフォルトの名無しさん:2007/05/02(水) 19:53:02
このスレとかでいろいろと勉強したら
雑なソースがかなりすっきりしました
文字列のポインタ配列って便利ですね
682:2007/05/02(水) 20:08:29
>>679
↑の読み込んでくれなくて実行できません;
なんででしょうか???泣
683デフォルトの名無しさん:2007/05/02(水) 20:15:23
#include <stdio.h>
int main(void) { int i, j = 0; printf("i: %d, j: %d", i, j); return (0); }
これをコンパイルして実行すると
# i: 134513638, j: 0
と表示されるのですか、なぜiの値が0ではなく134513638のような値になるのでしょうか。
この134513638というのは何に由来しているのですか。
教えてください。
684デフォルトの名無しさん:2007/05/02(水) 20:18:20
>>683
i を初期化してないじゃん
685デフォルトの名無しさん:2007/05/02(水) 20:18:50
>>683
初期化しないと適当な値が入ってるよ。
686デフォルトの名無しさん:2007/05/02(水) 20:19:02
>>683
i が何か適当な数値で初期化されていないから
ちなみに、表示された数値は、iが割り当てられたメモリのアドレスの番地を
10進数で表示したものになっているらしい。検証してみたら俺の環境ではそうだった。
687デフォルトの名無しさん:2007/05/02(水) 20:20:01
まあそんな検証に大した意味はないけどな
688デフォルトの名無しさん:2007/05/02(水) 20:20:04
>>683
int i = 0, j = 0;
だな。
その数字はたまたまそこにあったゴミ
689デフォルトの名無しさん:2007/05/02(水) 20:21:16
int i = j = 0;
でもいいや
690デフォルトの名無しさん:2007/05/02(水) 20:22:42
>>687
それはお前の浅はかな考え。低レベルな低学歴バカは貧弱な知識や考えしかもっていないと
バレないように黙っていた方が身のためだぞw 以外にお前が起こしているトラブルは
おまえ自身のおろかさにあるようだな。まぁ、バカには何を言ってもダメだから馬鹿にされるんだよねw
お前の価値観で大した意味とか決められるわけねーだろw
ちゃんと検証してみろ。どういう値が入ったのかってな。自分が予期しなかったことを言われると
そんなことはとか言い出す奴ほど、路上では予期しなかったトラブルを他人のせいにして逃げようとするんだよなw
お前みたいなクズは路上に出てくるなよ、迷惑だ
691本日の低学歴低脳バカザル:2007/05/02(水) 20:24:15
687 名前:デフォルトの名無しさん 投稿日:2007/05/02(水) 20:20:01
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな
まあそんな検証に大した意味はないけどな

自分基準にもほどがある大ボケw そんなこといったら世の中お前にとって意味の無い検証なんて
いくらでもあるわ。それが重要になることも知らずにな、クーーーックックック(ケロロ軍曹のクルル曹長風に)
692デフォルトの名無しさん:2007/05/02(水) 20:25:48
#include <stdio.h>
int 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
693デフォルトの名無しさん:2007/05/02(水) 20:30:01
>>689
それはダメだw
694デフォルトの名無しさん:2007/05/02(水) 20:32:00
>>692
&i
695デフォルトの名無しさん:2007/05/02(水) 20:32:38
>>693
ヒント: =の評価は右から
696デフォルトの名無しさん:2007/05/02(水) 20:32:41
               .|   |  | |   |    |  | |   |   |   || | |
               .|   |  | レ  |    |  | |   |  J   || | |
    ∩___∩    |   |  |     J    |  | |  し     || | |
    | ノ\   ,_ ヽ  .|   レ |      |  レ|       || J |
   /  ●゛  ● |   .J      し         |     |       ||   J
   | ∪  ( _●_) ミ             .|    し         J|
  彡、   |∪|   |              .J                レ
 /     ∩ノ ⊃  ヽ            >>692
 (  \ / _ノ |  |
  \  "  /  | |
   \ / ̄ ̄ ̄ /
      ̄ ̄ ̄ ̄
697デフォルトの名無しさん:2007/05/02(水) 20:32:47
未初期化だと、その変数のアドレス入れる処理系なんてあるんだ。
どういう意図でやってるんだろうな。
デバッグだと「フフフフ・・・」が入ってたりするけど。
698デフォルトの名無しさん:2007/05/02(水) 20:33:16
>>695
ヒント: j が定義されてない
699デフォルトの名無しさん:2007/05/02(水) 20:40:36
>>697
明示的に初期化されないメモリが確保されたとき
自動で0x00を入れるより0xCCみたいな適当な値で埋めといたほうが
バグが見つかりやすいからそうしてる処理系もあるみたいよ。
700デフォルトの名無しさん:2007/05/02(水) 20:41:49
134513638 == 0x080483E6 は値の感じからしてアドレスではあるようだが、
>>692 みたいな笑えるコードが検証コードのつもりだったのなら、
多分変数自身のアドレスではないだろうな。

たまたま昔の処理でアドレスを入れる為に使われた領域に
たまたま i が確保されただけだろう。
701デフォルトの名無しさん:2007/05/02(水) 20:45:22
さすがに692は釣りだよな?
702デフォルトの名無しさん:2007/05/02(水) 20:45:36
>>682
読み込んだくれないとは?
コンパイルできないってこと?
703デフォルトの名無しさん:2007/05/02(水) 20:48:48
>>690
ならば、Cを学ぶにあたってどんな意味があるのか、低脳な俺にわかるように教えてください。
704:2007/05/02(水) 20:51:58
コンパイルはできるようになったんですが、
打った数字も結果も表示されないのですが・・・
なぜですかぁ????
705デフォルトの名無しさん:2007/05/02(水) 20:54:56
なぜでしょうね????
706デフォルトの名無しさん:2007/05/02(水) 20:58:18
>>692はあうあう。
初期化されていないから値は不定。&付けろ初心者
707デフォルトの名無しさん:2007/05/02(水) 20:59:53
>>692
>アドレスの番地を調べてみて気づくこともある
このソースのどこで調べているの?
708:2007/05/02(水) 21:00:37
やっぱりわかんないですよね↓
すみません
709デフォルトの名無しさん:2007/05/02(水) 21:01:23
>>704
ソースうp
長いようならあぷろだ使ってね
710652:2007/05/02(水) 21:15:12
>>668
ありがとうございました
file1 = fopen(argv[1], "rb");でこけてるとばかり思ってましたがちがうようですね
file2 = fopen("test.txt", "w");との兼ね合いですかね。アイデアがあれば打開できるものですね
711:2007/05/02(水) 21:15:24
改行が多くてupできませんでした↓
http://pc11.2ch.net/test/read.cgi/tech/1176996941/247
の250のソースを使ったんですが・・・
わかりますか???
712デフォルトの名無しさん:2007/05/02(水) 21:15:34
>>704
こっちからうp
1000個も入力するの嫌だから負数で入力ストップ
http://sa-wiki.com/upload/src/up0121.txt
713デフォルトの名無しさん:2007/05/02(水) 21:17:39
>>711
リロードするの忘れた
ソースを変更した?してないならこの人は1000分のデータを乱数から取得している

とりあえず>>712に作ったので見てみて
714713:2007/05/02(水) 21:18:51
あっソースは250の人の流用だからね
俺が作ったわけじゃないよ
715:2007/05/02(水) 21:24:33
ありがとうございます!!
やっと解決しました☆
でも数字を打ったあと結果がでなくて
ソース名を打ったら表示されました・・
なんでですか???
こういうもんなのですか?
716デフォルトの名無しさん:2007/05/02(水) 21:31:32
>>715
>でも数字を打ったあと結果がでなくて
>ソース名を打ったら表示されました・・
数字って何?ソース名って何?実行中の話だよね?
717:2007/05/02(水) 21:34:21
実行中です
1000個の数字を入力してみたんです
ソース名はファイルの名前です
わかりにくくてすみません;
718:2007/05/02(水) 21:37:10
あと結果に
#QNANOe+0000ってでるのですがこれは何を意味するのですか?
719デフォルトの名無しさん:2007/05/02(水) 21:38:46
>>718
非数。
結果が未定義の計算をしたらそうなるはず。
720:2007/05/02(水) 21:40:56
あ〜なるほどっ
なにからなにまですみません;
ありがとうございます
721デフォルトの名無しさん:2007/05/02(水) 21:41:15
>>669は俺も不思議に思ってやってみた。
fopenと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])渡されるっぽい。
722デフォルトの名無しさん:2007/05/02(水) 21:41:24
NAN = Not A Number な。
723683:2007/05/02(水) 21:58:33
情報提供ありがとうございます。
宣言さえすれば、明示的に初期化しなくても0で初期化されるのかと思い込んで
いましたが、そうではないんですね。

お礼が遅くなってすみません。レスをくれた方、どうもありがとうございました。
724デフォルトの名無しさん:2007/05/02(水) 22:00:40
>>721
> 立ち上がり時の引数にDOSプロ自体のみ(argv[0])渡されるっぽい。
ドロップ起動時とコマンドライン引数明示の差?

ドロップ起動時って (Win32)GetCommandLine のみ生きてて
CRT は argc/argv を埋めないのかな
725デフォルトの名無しさん:2007/05/02(水) 22:16:15
>>721
どう違うの?俺の環境で試しても違いは現れなかったが
726デフォルトの名無しさん:2007/05/02(水) 22:30:36
構造体とポインタを使って複素数の除算を求める的なプログラムを作ったんですが、
2通り作ってみたところ片方が動いてくれません。
Cdivって関数はちゃんとできてるみたいなんですが、Ctesで「rが定義されてない」とかいわれてしまいます。
どこがおかしいんでしょうか?
727デフォルトの名無しさん:2007/05/02(水) 22:31:27
お前はその質問の仕方でまともな答えが得られるとでも思ってるのか
728726のソース:2007/05/02(水) 22:31:34
#include <stdio.h>
#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);
}
729デフォルトの名無しさん:2007/05/02(水) 22:33:13
>>726
いや、どこがって言われても
君さ、見もしないもののどこがおかしいかなって言われて分かる?
せめてソースを...
730726:2007/05/02(水) 22:34:49
失礼しました、>>728>>726のソースです。
よろしくお願いします。
731729: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);
}                                   ↑
                                   ここ
732729:2007/05/02(水) 22:36:59
ずれた

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);
}                                  ↑
                                   ここ
右から2つ目
r->i になってる
733726:2007/05/02(水) 22:39:04
>>731-732
即答ありがとうございます!
こんなもん自分で気付けって話ですよね・・・
お騒がせしました&ありがとうございました。
734デフォルトの名無しさん:2007/05/02(水) 22:57:07
よくこんなんすぐ分かるな・・・
735デフォルトの名無しさん:2007/05/02(水) 23:15:43
>Ctesで「rが定義されてない」とかいわれてしまいます
これを見てすぐわからないようじゃヤバいだろ。
736デフォルトの名無しさん:2007/05/03(木) 01:09:08
ソケットディスクリプタから一度読み込んだデータを
もう一度読み込むことはできませんか?
TCPプロトコルで受信したデータはプログラムから読み込まれると消去されるのでしょうか?
737デフォルトの名無しさん:2007/05/03(木) 01:17:08
>>736
一旦readした時点でバッファから消されるはずだから、普通に考えれば無理だろう
738デフォルトの名無しさん:2007/05/03(木) 02:20:05
バッファから「消される」訳じゃないけど再利用は不可と言うことで一つ。
739デフォルトの名無しさん:2007/05/03(木) 02:21:09
そもそも、ソケットから読み込んだらバイト数確認して再読み込みしたりするんだから
読み込んだものは自分で管理するしかないだろ。
740デフォルトの名無しさん:2007/05/03(木) 02:21:28
プロトコルスタックを直接触ればいいじゃない
741デフォルトの名無しさん:2007/05/03(木) 06:59:58
>>647
ありがとうございました。
イメージがわきました。
742デフォルトの名無しさん:2007/05/03(木) 12:02:55
Windowsにgccコンパイラ入れたいんだけどどこからダウンロードすればどいいか分からないです
どなたか教えてください
743デフォルトの名無しさん:2007/05/03(木) 12:18:53
>>742
「windows gcc インストール」でググって、最初のページを見てみるとか。
744デフォルトの名無しさん:2007/05/03(木) 12:26:10
>>742
Cygwin + MinGW + GCC 相談室 Part 3
http://pc11.2ch.net/test/read.cgi/tech/1177944767/
745デフォルトの名無しさん:2007/05/03(木) 12:28:32
cの練習みたいなんするソフト?ってどこにあるかわからない
からおしえてください!!
746デフォルトの名無しさん:2007/05/03(木) 12:44:07
日本語がわからない。
サンプル集が欲しいのか
手軽に試せる実行環境が欲しいのか
入門用のテキストなり学習ソフトが欲しいのか。
747デフォルトの名無しさん:2007/05/03(木) 12:45:22
>>500
世の中のRFIDが全部ネットに繋がる世の中を想像してみ?
IPv6でも足りない可能性があるよ
748デフォルトの名無しさん:2007/05/03(木) 12:46:46
>>745
たしかゲーム風に進めていく学習ソフトがあったはず
749デフォルトの名無しさん:2007/05/03(木) 12:57:14
>>747
IPv6は79228162500000000000000000000通り

7,9228,1625,0000,0000,0000,0000,0000
7穣9228予1625垓通り

使いきれるかなぁー
750デフォルトの名無しさん:2007/05/03(木) 12:57:51
>>749
じゃ、じゃあ砂粒一つ一つが繋がったらどうかしらっ
751デフォルトの名無しさん:2007/05/03(木) 13:26:14
じきに攻殻機動隊の世界がやってくるのさ
752デフォルトの名無しさん:2007/05/03(木) 13:30:36
>>751
もう来てるょ
753デフォルトの名無しさん:2007/05/03(木) 17:10:37
配列の要素数(添字)を取得するのってどうやるんですか?
いろいろ調べたけどわからなくて。
754デフォルトの名無しさん:2007/05/03(木) 17:13:12
>>753
配列と同じスコープ内なら、sizeof(配列) / sizeof(配列[0])
755デフォルトの名無しさん:2007/05/03(木) 17:13:46
>>753
ローカルで確保してるなら
sizeof(array)/sizeof(array[0])
で取得できる。関数引数として受け取った配列のという事なら仕様上不可能
別の引数として要素数渡せ
756デフォルトの名無しさん:2007/05/03(木) 17:20:17
ネットは広大だわ
757デフォルトの名無しさん:2007/05/03(木) 17:56:23
>>754>>755
どもっす
>同じスコープ内
>ローカルで確保
>関数引数
からしてわかってませんがヒントになりますた。ありがとう。
758デフォルトの名無しさん:2007/05/03(木) 18:06:47
グローバル変数でもサイズは取れるから、>754で正解。
尤も、配列は関数の引き数にできないから(ポインタになってしまう)同じことだけど。
759デフォルトの名無しさん:2007/05/03(木) 19:01:31
unsigned char XXX [] ={1,2,3,4,…
の時はsizeof(array)/sizeof(array[0]) 使えないんですかね…。
要素数を宣言してないからこそ使いたいのに…。
760デフォルトの名無しさん:2007/05/03(木) 19:04:08
>>759
>758
761デフォルトの名無しさん:2007/05/03(木) 19:06:09
何でやってみようとしないのか理解できない。
762デフォルトの名無しさん:2007/05/03(木) 19:22:11
いやすんまそん、C初めて4日目なんで、いろいろ理解するのに手一杯。
用語がわかってないから意味が通じてないみたいです。精進します。
763デフォルトの名無しさん:2007/05/03(木) 19:27:45
>>762
>unsigned char XXX [] ={1,2,3,4,…
>の時はsizeof(array)/sizeof(array[0]) 使えないんですかね…。
>要素数を宣言してないからこそ使いたいのに…。

できるかできないかは、やってみれば分かる事。
ということだ。
764デフォルトの名無しさん:2007/05/03(木) 19:33:09
>>743-744
亀レスで申し訳ありません
無事インストールできました
ありがとうございました
765デフォルトの名無しさん:2007/05/03(木) 20:29:22
携帯電話でCのコンパイルってできるんですか?
766デフォルトの名無しさん:2007/05/03(木) 20:44:12
ほかの言語はあった気が。アプリゲットで探してみましたが。
767デフォルトの名無しさん:2007/05/03(木) 20:46:36
Cコンパイラがあれば、そりゃコンパイルは出来る。
それがその携帯で動くかどうかは別問題。
768デフォルトの名無しさん:2007/05/03(木) 20:47:44
とりあえず俺はJavaバイトコードを出力するCコンパイラというのは見たこと無い。
探せばあるかもしれんが。
769デフォルトの名無しさん:2007/05/03(木) 21:02:26
BREWじゃねぇの
770デフォルトの名無しさん:2007/05/03(木) 21:11:01
最近の大学生は携帯電話でレポート書くという話を聞くし、
携帯でプログラムの実習やアプリの開発が出来きるようにしたら
結構受けそうだな。と考えていた矢先、>>765の書き込みを発見、
これは、携帯で動く開発環境を作れと言う神の思召しか?
771デフォルトの名無しさん:2007/05/03(木) 21:12:20
携帯で書く気にはならないな。
772デフォルトの名無しさん:2007/05/03(木) 21:16:05
BASICくらい動けば便利かも
773デフォルトの名無しさん:2007/05/03(木) 21:17:28
確かに。。イーモバイルとかなら既存のケータイより打ちやすそうですし、それならわかりますが、、
774デフォルトの名無しさん:2007/05/03(木) 21:20:26
そこでWZEROですよwillcomですよ
775デフォルトの名無しさん:2007/05/03(木) 21:26:26
776デフォルトの名無しさん:2007/05/03(木) 21:29:39
最近の若者ってのは親指が発達してるのか?
777デフォルトの名無しさん:2007/05/03(木) 21:39:34
>>776
若いやつの携帯にメールを送ったら返信が異常に早くて、メールを打つところを実際にみてたら、
電光石火の親指だった。
778デフォルトの名無しさん:2007/05/03(木) 21:41:12
>>777
そうか・・・。
キーボードに慣れていると何が哀しくて親指打ちしなけりゃならないんだと思ってしまうけど、
訓練次第でなんとでもなるんだな。
人間てすごいわ。
779デフォルトの名無しさん:2007/05/03(木) 23:09:34
aa = strlen(buff); 
aa はint 型で、buffはchar型配列で、適当な文字列が入っています。

これをコンパイルすると、VCコンパイラだとうまく行きますが、
GCCコンパイラでコンパイルすると、↓以下の警告がでます。
incompatable implicit declaration of bilt-in function 'strlen'

何がいけないのでしょうか。 もちろん、stdlib.hはインクルード宣言をしています。
780デフォルトの名無しさん:2007/05/03(木) 23:11:34
strlenの戻り値の型はintじゃないよ
781デフォルトの名無しさん:2007/05/03(木) 23:12:00
>>779
strlenがstdlib.hで宣言されてるなんて初耳だな
782デフォルトの名無しさん:2007/05/03(木) 23:28:32
そうか、<string.h>だったのか・・・・orz
783デフォルトの名無しさん:2007/05/04(金) 00:07:44
最近Cを勉強し始めた者です。

scanfを使うとコンパイラが"scanfではなくscanf_sを使え"と警告を出してきます。
同様の警告はgetsを使ったときにも出ます。

警告なので実行しても特に問題はないみたいなんですが、
scanfとscanf_sにはどのような違いがあるのでしょうか?

コンパイラはVsualC++2005ExpressEditionです。
784デフォルトの名無しさん:2007/05/04(金) 00:11:29
>>783
scanfだけじゃないが、VC++2005で○○_sというセキュアなバージョンが追加されてる関数がある
違いはバッファとして指定した引数のサイズが指定できるようになってる事
gccとかへの移植性を考えると使わない方がいい
VC++2005でしか使わないならどっちでもいい
785デフォルトの名無しさん:2007/05/04(金) 00:15:30
>>783
scanfは入力するデータのサイズを制限出来ない為にデータが溢れたりしてえらい事になる可能性がある。
786デフォルトの名無しさん:2007/05/04(金) 00:35:21
>>780
size_t型はなのは知ってるけど、>>779みたいに、
int型にそのままぶち込んでは何か問題でも生じるのですか?
787デフォルトの名無しさん:2007/05/04(金) 00:39:56
>>786
size_tの最大値が、intの最大値より大きかったら、問題が起きる場合が。
気にしなくていいかな?
788デフォルトの名無しさん:2007/05/04(金) 01:15:35
ほとんどの処理系においてtypedef unsigned size_tとされてるはずだから
特に気にする必要は無いと思うが、typedef unsigned long size_tとなってるような
処理系が無いとは言えないから出来ることならsize_tを使った方がいいだろうな
789デフォルトの名無しさん:2007/05/04(金) 01:54:54
最近の VC++ は size_t が 8 ビットだった気がするよ。
790デフォルトの名無しさん:2007/05/04(金) 01:58:43
strlenは本当はptrdiff_tと同サイズを返さなければいけないしな。

まあ、可能性としてあるだけで
実際に64bit環境だからといって2G/4G以上の文字列長を
必要とすることはまず無いだろうが。
それ以前にファイルサイズ等でコーディング上の無理が出て
どこか修正する必要が出てくるだろうし。
791デフォルトの名無しさん:2007/05/04(金) 02:02:02
手元のVC++2005のライブラリだとこうなってるな

#ifdef _WIN64
typedef unsigned __int64 size_t;
#else
typedef _W64 unsigned int size_t;
#endif
792デフォルトの名無しさん:2007/05/04(金) 02:02:59
2002 あたりどうだっけ?
793デフォルトの名無しさん:2007/05/04(金) 02:20:59
VC++.netも一緒だた
794デフォルトの名無しさん:2007/05/04(金) 07:40:25
>>789
有り得なさ過ぎw
795ニュースナビゲーター:2007/05/04(金) 12:03:58
人気の高いニュースをすぐ見よう。
「祭」に、のりおくれるな。

2ちゃんねるニュース速報+ナビ
http://newsnavi.2ch.net/

WWWブラウザの「お気に入り」や「ブックマーク」に登録しよう。
796デフォルトの名無しさん:2007/05/04(金) 12:06:00
>>788
>ほとんどの処理系においてtypedef unsigned size_tとされてるはずだから

longじゃなくても、その時点で、intより最大値が大きいじゃん。
797デフォルトの名無しさん:2007/05/04(金) 13:45:07
最近になって、close()関数がintを返すことを知ったのだが
close()がもし失敗したら〜、hoge hoge〜 なんて処理を、
丁寧に書いているプログラムなんて、今まで見た事がない件。
いい例とか、どっかにありますか?
798デフォルトの名無しさん:2007/05/04(金) 14:17:02
2000*2000*2000のボクセルを持つ3次元の立体を表すために、
2000*2000*2000*3の配列を作って、そこに色情報を入れようとしたのですが
データ量が多過ぎてプログラムが動きません。
ポインタを使うのがいいのか、他にもっといい方法があるのか、是非教えてください!
お願いします!
799デフォルトの名無しさん:2007/05/04(金) 14:27:23
>>798
メモリをたくさん積んだマシンを使う。
800デフォルトの名無しさん:2007/05/04(金) 14:27:50
>>797
closeの失敗なんて意識したことないなぁ。
やってもログを出力させるだけとか・・・
801デフォルトの名無しさん:2007/05/04(金) 14:30:24
そもそもcloseに失敗したからといって何かできる訳でもないしな
802デフォルトの名無しさん:2007/05/04(金) 14:47:02
>>798
てきとーなハッシュ関数を定義するとか。

803デフォルトの名無しさん:2007/05/04(金) 15:22:03
>>801
バッファをフラッシュしてファイルを閉じてるから、close()失敗したら、write()のエラー処理と同じことをすればいいよ。

小さいファイルの読み書きだと、write,readではエラーがでなくて、close()ではじめてエラーがでるとか、すごいありそう。
804デフォルトの名無しさん:2007/05/04(金) 16:30:14
あーそうか。フラッシュに失敗することがあるんだな。
805デフォルトの名無しさん:2007/05/04(金) 16:42:25
>>798
オンメモリで処理するのはあきらめてファイルにしたら。
それでもとてつもなくでかいファイルになってしまうが。

あとはデータの性質に合わせて省メモリ化するように工夫する。
例えば配列の全要素に必ずしもデータが詰まっていないなら「疎な配列」を使ってみる。
806デフォルトの名無しさん:2007/05/04(金) 21:33:19
>>803-804
ヒント:低レベル出力関数はバッファリングしない
807デフォルトの名無しさん:2007/05/04(金) 21:34:16
そもそも、バッファがあったとしても読み込み後のクローズで失敗することは有り得ないわけだが。
808デフォルトの名無しさん:2007/05/04(金) 21:59:07
相互リンクリストについて教えていただきたいのですが、
struct man{
struct man *prev;
char name[20];
int score;
struct man *next;
};
が相互リンクリストでつながっていて、これをスコア順に並べなおしたいのです。
直接選択法を使ってやりたいのですが、ポインタのつなぎかえが分からずできません。
どうすればよいかどなたか教えてください。お願いします。
809デフォルトの名無しさん:2007/05/04(金) 22:09:36
>>808
直接選択法のソート自体は出来る?int配列とかで。
810デフォルトの名無しさん:2007/05/04(金) 22:24:13
aとbを交換する場合は、

swap(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;

}
じゃね?

加えて実際には、端にあるノードの場合の処理が必要だが。
811デフォルトの名無しさん:2007/05/04(金) 22:47:26
>>809
できます。数列の最初の項を最小と仮定してほかの項と比べていって
より小さいときは交換するってやつですよね。
>>810
ありがとうございます。やってみます。
812デフォルトの名無しさん:2007/05/04(金) 23:01:34
>>806
する場合もあるし、しない場合もある。
813デフォルトの名無しさん: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);

でビルドするとほとんどエラーになるので自分なりに試して

814デフォルトの名無しさん:2007/05/04(金) 23:21:34
#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);

でビルドすると上手くいくのですが
デバックなしで開始すると

三つの整数を入力してください。
整数1;n1
続行するには何かキーを押して下さいとなり
この先にいけないのですが何がいけないのでしょうか?

完成型は
三つの整数を入力してください。
整数1;n1
整数2;n2
整数3;n3
最大値はn3です
という形にしたいのです
815デフォルトの名無しさん:2007/05/04(金) 23:25:00
「n1」は整数じゃないだろ
816デフォルトの名無しさん:2007/05/04(金) 23:27:50
数字を入れても>>814になります
817デフォルトの名無しさん:2007/05/04(金) 23:30:47
>814がまともに動くはずはないんだが
818デフォルトの名無しさん:2007/05/04(金) 23:36:15
>>814
{→{
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);
}→}


修正点はこんなところか?
819デフォルトの名無しさん:2007/05/04(金) 23:36:48
IT関連の専門に通ってる者ですが
自宅でC言語の勉強をしたいのですがLINUXじゃないとC言語ってできないんですか?
ウィンドウズ上でできるソフトウェアなんか知ってるよって方が居ましたら教えてください
820デフォルトの名無しさん:2007/05/04(金) 23:38:32
>>819
VisualStudioっていう非常に有名なソフトがあるよ
821デフォルトの名無しさん:2007/05/04(金) 23:45:01
820>情報あり!さっそくダウンロードして試してみます(´д`)
822デフォルトの名無しさん:2007/05/04(金) 23:46:42
>>814
#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);


823岡本 ◆9dWns3XgdE :2007/05/05(土) 00:49:04
C言語で、数字以外弾くのはどないしたらいいんですか?
aとかで無限ループしてしまってうざいんですけど。
824デフォルトの名無しさん:2007/05/05(土) 00:51:03
scanf使うのをやめろ
825デフォルトの名無しさん:2007/05/05(土) 01:01:38
ん?

> if(n2>max) max==n2;
> if(n3>max) max==n3;

`='が1個多くないか?
まあ文字判定できないのはそれが原因じゃないけど つ>>824
あるいはis系の関数を使うか
826岡本 ◆9dWns3XgdE :2007/05/05(土) 01:02:13
そりゃぁそうですけどね。
うぃ〜気合入れてスキルアップします。
827825:2007/05/05(土) 01:04:10
あれ?
>>822>>823は同一人物?
違ったらごめん
>>822>>823へのレスがごっちゃまぜw
828デフォルトの名無しさん:2007/05/05(土) 01:04:26
つatoi
つatof
829デフォルトの名無しさん:2007/05/05(土) 01:15:42
>>825
>>827
いや、別人
>>814のソースをコピペしてちょっといじっただけでそこまで見てなかったんだ
max=n3;
if(n2>max) max=n2;
if(n3>max) max=n3;
が正解だね
830829:2007/05/05(土) 01:16:30
って違う
max=n1;
if(n2>max) max=n2;
if(n3>max) max=n3;
だな
831デフォルトの名無しさん:2007/05/05(土) 01:29:00
832デフォルトの名無しさん:2007/05/05(土) 01:29:02
scanfが危険でsscanfが安全っていうのは
sscanfをfgetsと組み合わせて使っている限りは
毎回fgetsで入力を受けるchar配列の中身が更新されるからだよね?
833デフォルトの名無しさん:2007/05/05(土) 01:34:21
>>828
atoiとかは文字列"100"をint型の100に変換するだけ
文字'a'を数字に変換することはできないでしょ
>>823は数字かどうかを判別したいんじゃないの?
834デフォルトの名無しさん:2007/05/05(土) 01:46:18
>>832
scanf()を単にfgets()+sscanf()にしただけでは万事解決とはいかない。
scanf()が数字以外の文字を喰い残すという悪癖を回避できるだけだ。
835デフォルトの名無しさん:2007/05/05(土) 02:05:39
>>500番台あたりをみてて思ったのですが、
fgetc(stdin)と
getchar()は、入力バッファに何も無かった場合、どちらも入力待ちになるのでしょうか?
836デフォルトの名無しさん:2007/05/05(土) 02:09:28
>>834
よくその悪癖があるからfgets+sscanfにしろって言われるけど
それくらいならそのことを考慮してscanf呼び出した後は
入力を吐き捨てるようにすればいいんじゃないかなと思うんですが、どうなんでしょ?
837デフォルトの名無しさん:2007/05/05(土) 02:24:48
キーバッファはなかなか思い通りに弄れない
838デフォルトの名無しさん:2007/05/05(土) 02:30:14
>>835
そうよ
入力がないんだから次には進まないでしょ
そんなことよりもおまいは>>500を読んでそんなことを思いついたのか
その発想力に嫉妬だわw
839デフォルトの名無しさん:2007/05/05(土) 02:32:45
>>837
そういうもんなんですね、どうもでした
840デフォルトの名無しさん:2007/05/05(土) 02:34:27
>838
500番台と500の区別もつかないの?
841デフォルトの名無しさん:2007/05/05(土) 02:50:23
>>838
ありがとうございます。

正確には550のあたりです。すみません
842デフォルトの名無しさん:2007/05/05(土) 03:19:05
scanfを使っても、ちゃんと戻り値を確認したり読み捨て処理を入れたりすれば
普通に問題なく動作させることは出来る。
ただ、そこまでしてscanfを使う必要があるのかというのが疑問。

「fgets+sscanfを使えばいい」とだけ聞いて
sscanfの戻り値を確認しない奴も結構居る(もちろん必要ない場合もある)。
843デフォルトの名無しさん:2007/05/05(土) 06:30:48
>>
ややこしいならいったん変数に格納して、
文字コードで条件判断させればインじゃないか?
844デフォルトの名無しさん:2007/05/05(土) 10:49:35
おいらは、fgets+strtoul使うことが多いかな
複雑な構文解析が必要なときは、yacc+lexとか
845デフォルトの名無しさん:2007/05/05(土) 11:18:11
Cって入力が100バイトでも10000バイトでもきっちり破綻なく動くようにすると
途端に糞めんどくさくなるから嫌なんだよ。
846デフォルトの名無しさん:2007/05/05(土) 11:26:36
それは頭が悪いだけ
847デフォルトの名無しさん:2007/05/05(土) 11:28:03
>>814ですが

int 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 定義されていない職別子です
とエラーになります
848デフォルトの名無しさん:2007/05/05(土) 11:29:16
>>847
max()がマクロもしくは関数として既に定義されていてコンパイルが
思うようにいかないのだろう。

maxnとか名前を適当に変えてやってみれ。
849デフォルトの名無しさん:2007/05/05(土) 11:38:24
max()がマクロでもぶつからないと思うがなあ・・・

>int n1,n2,n3,max;
>→;が型の前にありません
この、int の前はどうなってんのさ
850デフォルトの名無しさん:2007/05/05(土) 12:19:52
>>849
本には

int n1,n2,n3 max;

と書いてあります
851デフォルトの名無しさん:2007/05/05(土) 12:23:56
#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);
}
852デフォルトの名無しさん:2007/05/05(土) 13:51:21
>>850
それは誤植だw
853デフォルトの名無しさん:2007/05/05(土) 15:35:42
windowsでC言語でmakefile使いたいんだけど
どうやってつくるんですか?
全部txtがはいってしまうんだけど
854デフォルトの名無しさん:2007/05/05(土) 15:36:23
拡張子くらい変えればいいじゃん
855デフォルトの名無しさん:2007/05/05(土) 15:37:50
メモ帳じゃなくてちゃんとしたエディタ使えよ
856デフォルトの名無しさん:2007/05/05(土) 15:39:13
"makefile"
と""で囲む
857デフォルトの名無しさん:2007/05/05(土) 15:41:32
>>856
ありがとうございます。
858デフォルトの名無しさん:2007/05/05(土) 15:46:06
Winの場合はprojectname.mak
とか拡張子つけておくと何かと便利だけどな。
makeするときはmake -fprojectname.mak
859デフォルトの名無しさん:2007/05/05(土) 15:55:54
保存するときに「ファイルの種類」っていうプルダウンメニューがあるだろ。
そこがおそらくデフォルトで「テキスト文書」となっているんじゃないかな。
だから後ろに .txt の拡張子がつく。そこを「すべてのファイル」に変えて、
拡張子を自分でファイル名の最後に付けて保存すればいい。
860デフォルトの名無しさん:2007/05/05(土) 16:02:11
>>853にはこれをすすめとくよ
ttp://sourceforge.net/projects/notepad-plus/

個人的にはViラブだけどw
861デフォルトの名無しさん:2007/05/05(土) 17:12:23
>>858
Borland C++のmakeだとmakefileとmakefile.makの両方を受け付けてくれるのが便利だった
862デフォルトの名無しさん: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;
}
これが違う値になるのは普通に理解できるのですが。。
863デフォルトの名無しさん:2007/05/05(土) 18:58:47
このプログラムをコンパイルすると*aと&bの値が全く違うのはなぜでしょうか?

このプログラムをコンパイルすると*bと&aの値が全く違うのはなぜでしょうか?

の間違いでした、
864デフォルトの名無しさん:2007/05/05(土) 19:00:41
a==5
&a==0x12345678 // aのアドレス
b==0x12345678 // aのアドレス
*b==5 // ポインタのデリファレンス(ポインタbから参照先の値を得る)

*bと&aの値が異なるのは当たり前
865デフォルトの名無しさん:2007/05/05(土) 19:30:41
こういう場合は

int* b=&a;

と書いた方が分かりやすいかもね。
どっちでも動作は一緒なんだが。
866デフォルトの名無しさん:2007/05/05(土) 20:07:51
int*b;
b=&a;
に分解するとわかるぞ。
つまり b==&a
867デフォルトの名無しさん:2007/05/05(土) 20:08:50
んなことしたら
int* a, b;
でドツボにはまるだけだから素直に
int *a, b;
とかくのがお約束。このレベルのわかりやすさが必要な人間はそもそもCなんて使えない。
868デフォルトの名無しさん:2007/05/05(土) 20:11:38
一度に2つの変数を宣言しなければいい。
869デフォルトの名無しさん:2007/05/05(土) 20:15:36
>>464-465 回答ありがとうございます。
つまりint *b=&a; では*b(bが指しているアドレスにあるint型のデータ)に&a(aのアドレス)を代入するわけでなく
int型を指し示すポインタbにaのアドレスを代入する
つまり僕が示した前者と後者ではコンパイラさんにとって全く一緒のものとして扱うということですか?

とりあえずこういうことで理解しましたが問題ないでしょうか?
870デフォルトの名無しさん:2007/05/05(土) 20:19:53
問題ない。
871デフォルトの名無しさん:2007/05/05(土) 20:21:17
代入と初期化は厳密には文法的に違うものだが、
b に a のアドレスが入るという点においては一応問題はない。
872デフォルトの名無しさん:2007/05/05(土) 20:23:21
定義と初期化をわけて考えるべし。
873デフォルトの名無しさん:2007/05/05(土) 20:26:56
定義に注目すれば int *b = &a; のイメージで
初期化に注目すれば int* b = &a; のイメージと言いたいわけか?
874デフォルトの名無しさん:2007/05/05(土) 20:36:09
C言語はそういう言語仕様に設計にされただけだって
丸暗記してしまっていいよ。理屈で考えても不満が出てくるだけだ。
875デフォルトの名無しさん:2007/05/05(土) 20:37:49
間を取って int * b = &a; にしようぜ。
876デフォルトの名無しさん:2007/05/05(土) 20:42:08
このブラウザ、&a;が、&だけになっとる・・
何の話かよくわからなかったぜ・・・
877デフォルトの名無しさん:2007/05/05(土) 20:50:10
実体参照にバグのあるブラウザ(藁
878デフォルトの名無しさん:2007/05/05(土) 20:53:12
ソースで &amp;a; になってる以上、ブラウザのバグだな。
879デフォルトの名無しさん:2007/05/05(土) 20:58:16
>>876
ブラウザは何?
880デフォルトの名無しさん:2007/05/05(土) 21:12:30
sage
881デフォルトの名無しさん:2007/05/05(土) 21:17:47
htc(WindowsMobile)で2ちゃんブラウザの2++です
今はauの携帯から書いてます、ここソフトバンク入りにくい
882デフォルトの名無しさん:2007/05/05(土) 21:27:43
携帯ブラウザか
883デフォルトの名無しさん:2007/05/06(日) 13:55:16
1から、2の30乗までの数値を全て2進法で表示するプログラムを作りたいんだけど、
これをなるべく早く実行したいんだ。実際の表示は行わなくていいらしい。
884デフォルトの名無しさん:2007/05/06(日) 13:57:07
ビットシフトを使うんだ!
885883:2007/05/06(日) 13:59:12
>>884
具体的にどう書けばいいですか?
886デフォルトの名無しさん:2007/05/06(日) 14:00:15
でけました
main(){}
887デフォルトの名無しさん:2007/05/06(日) 14:22:58
「表示するプログラム」で「表示しなくて良い」とはこれいかに?
まあ要するに、2^30までのどんな数字でも2進表示できるプログラム、だろうけど。

宿題スレに行ってね。&
888883:2007/05/06(日) 15:11:04
>>887
人づてに投稿した問題文なので、乱文になってしまいました。
スレ汚し申し訳ないです。宿題スレ行ってきます。
889デフォルトの名無しさん:2007/05/06(日) 15:15:03
分かっちゃいたがインラインアセンブラより素直にコーディングした方が速かった、かなしーねー
しっかし2^30まで表示するのは難儀だな
890デフォルトの名無しさん:2007/05/06(日) 15:28:17
スレ違いかもしれませんがですが、C++で組みました
どれぐらい遅いか比べてくださいお願いします

#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;
}
891デフォルトの名無しさん:2007/05/06(日) 15:59:46
>>890
ありがとうございます。
bcc32にてコンパイル致しましたがエラーが出てしまいます。
コンパイラは何を使われていますか?
892883:2007/05/06(日) 16:19:45
宿題スレにて、要求を満たすプログラムを頂きました。
お騒がせ致しました。
893デフォルトの名無しさん:2007/05/06(日) 16:25:55
1〜999であれば(゚-゚)を表示
それ以外ならば(゚听)を表示
って言うのを組みたいんですが、こんな感じですかね?

#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;
    }
894デフォルトの名無しさん:2007/05/06(日) 16:32:41
>>893
if (ran < 999) {
printf ("(゚-゚)");
}



if (ran <= 999) {
printf ("(゚-゚)");
}
895デフォルトの名無しさん:2007/05/06(日) 16:33:08
999の時どうなるのか見直せ。
896デフォルトの名無しさん:2007/05/06(日) 16:34:10
>>893
いやまて
ran = rand () % 1000 + 1;
1〜999 なら (゚-゚)
1000 なら (゚听)
でいいんだな?
(゚听)が出る確率1/1000だけどいいんだな?
897デフォルトの名無しさん:2007/05/06(日) 16:37:06
>>894
そういえば<は未満でしたね・・・
以下は<=ですか

>>896
問題ないです
898デフォルトの名無しさん: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;
    }
899デフォルトの名無しさん:2007/05/06(日) 16:40:56
>>898
おk
900デフォルトの名無しさん:2007/05/06(日) 16:42:57
>>899
ありがとでした^^
901デフォルトの名無しさん:2007/05/06(日) 16:43:01
time.hは取り込まなくても動くの?
うちのVC.NET2003はtimeが見つからないって言ってるんだけど
902デフォルトの名無しさん:2007/05/06(日) 16:49:52
>>901
BCC55だと問題なく動きますよ
まぁ一応、チェックしてて気付いたんで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;
    }
903デフォルトの名無しさん:2007/05/06(日) 17:14:09
Cだとプロトタイプなくても呼べるからね。
904デフォルトの名無しさん:2007/05/06(日) 17:30:31
VC++は、プロジェクトを作ると何でもC++でコンパイルするコンパイラオプションを付けてくるからね
905デフォルトの名無しさん:2007/05/06(日) 17:32:54
プリコンパイルヘッダーを使うからだ
906デフォルトの名無しさん:2007/05/06(日) 17:47:56
>>903
Cでもプロトタイプ宣言は要るでしょう…

>>904
cl.exeでCでコンパイルするようにするオプションってありますか?

>>905
プリコンパイルヘッダなんて使ってません
907デフォルトの名無しさん:2007/05/06(日) 18:09:03
>>906
無くても呼べるってのと、あったほうがいいってのは別の話。
無くてもエラーにならずに呼べる。
908デフォルトの名無しさん:2007/05/06(日) 18:10:06
>>906
/TC
つかcl.exe 使ってんなら -?でわかるだろ
909デフォルトの名無しさん:2007/05/06(日) 18:11:59
>>906は典型的な頭が固いくせに自分は頭がいいと思ってる近づきたくないやつだな
910デフォルトの名無しさん:2007/05/06(日) 18:24:30
>>907
無くても呼べるんですか
コンパイラの型チェックができないと、宣言のときの型の意味無いじゃんとか思って
Cでも必須って思ってました

>>908
dクス
/TCオプション付けたら難なく通りました

>>909
おっしゃるとおり頭が悪い上に固くさらに怠け者の駄目人間です
911デフォルトの名無しさん:2007/05/06(日) 19:11:29
最近いまいち何がしたいのかよくわからん質問が多いなあ
まあ入門書に載ってるソースがクソだからだけど
912デフォルトの名無しさん:2007/05/06(日) 19:23:06
エスパー能力を磨くんだ。
913デフォルトの名無しさん:2007/05/06(日) 19:48:59
>>910
プロトタイプや関数の定義がファイルスコープに無いときは、引数は呼び出し側にあわせて、戻り値はintが仮定される。
実際の呼び出し時には、intまたはdoubleへの格上げがあるけど。
ただ、この話は歴史の話になるので・・・
914デフォルトの名無しさん:2007/05/07(月) 14:20:35
はじめまして C言語を学ぼうと思っている初心者です
せっかくなので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

本当に理解に苦しむほどの訳なのでしょうか?
よければレビューなど聞かせていただければと思います
スレ違いや既出でしたらすいません
915デフォルトの名無しさん:2007/05/07(月) 14:25:31
>>914
まず入門サイトをはしごしてからでもいいと思うよ。金かけるのは。
916デフォルトの名無しさん:2007/05/07(月) 14:28:08
職場で原書持ち歩いてる奴なんて見たことないな。
アメリカから来た日本人グラマもいたけど訳書持ってた。
特に意味不明な訳はないし
英語の勉強も同時にやりたいんでもないなら日本語版買っとけ。
917デフォルトの名無しさん:2007/05/07(月) 14:30:12
>>914
原書をそのまま読めるなら翻訳を読む必要は無い。
しかしそれ以前に、K&Rはプログラミング従事者で最近の言語に縁が無い人向けの本だ。
918デフォルトの名無しさん:2007/05/07(月) 14:58:01
>>914
猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/
ここでも読んで見るといい
919デフォルトの名無しさん:2007/05/07(月) 15:01:18
すべてを無料かつオンラインで済まそうとする奴にろくな奴はいないとだけ言っておく。
特にFAQ&Tips、リファレンスの検索ではなく網羅的な知識が必要とされる入門書においては。
920デフォルトの名無しさん:2007/05/07(月) 15:07:37
でもK&Rから始めるというのもな。
本は目的の言語で記述してあるアルゴリズムの本から入るのがいいと思うなあ
921デフォルトの名無しさん:2007/05/07(月) 15:40:04
出来る限りgetcharでやってこうってスタイルは好き
922914:2007/05/07(月) 16:46:59
皆様いろいろとレスありがとうございます^^
普段は原書(英語しか読めませんがorz)か訳書の選択は
価格が同じで内容が同じ(追加や大きな訂正が無かったり)
なら原書を選ぶことにしています
が 買うとするとK&Rはちょっと値段差が大きいので・・・
あとプログラミング関係で英書はあまり読んだことがなく専門用語がちと不安です

>猫でもわかるプログラミング
これは良いですね ありがとうございます ぬこかわいいよぬこ
マクローリン展開を高校で教えられたというのはいいなぁ・・・
けどマクローリン展開と呼ぶ人はいまやほとんどいない
(たぶん)はずなのでテイラー展開と書いてほしかったような気もw
あとぱらぱらと眺めてみましたがこの説明だと
ポインタの理解が僕には辛いような気もします
配列とポインタの違いがよくわかりませんorz

>すべてを無料かつオンラインで済まそうとする奴にろくな奴はいない
アドバイスありがとうございます
入門書は大事だと思いますし良いものにお金を払うという
スタンスは大事だと思います とはいえお金が無くて
学習ができない人や国もいたりあったりするわけでそういう意味では
良い入門書ほどオンラインで無料公開されるべきなのかなとも思ったり

>アルゴリズムの本から入るのがいいと思うなあ
どちらかというとアルゴリズムの本は辞書的に使いたいと
思っていたのですがやっぱそれじゃ駄目ですか?w
923デフォルトの名無しさん:2007/05/07(月) 16:51:23
>>922
しるかボケさっさと勉強しる!
924デフォルトの名無しさん:2007/05/07(月) 16:55:03
マクローリン展開は普通に使ってるが。
925デフォルトの名無しさん:2007/05/07(月) 17:00:48
こいつやる前からウダウダ言って時間つぶして
こんなんじゃ結局身に付かなそうだな。
926デフォルトの名無しさん:2007/05/07(月) 17:09:03
口を動かす前に手を動かせってやつだな。
927デフォルトの名無しさん:2007/05/07(月) 17:09:33
K&Rは下手に装飾してないおかげで内容の割りに小ぶりで軽いし紙も柔らかいから
物理的に読みやすくて出かけの暇つぶしで勉強するには丁度いい
928デフォルトの名無しさん:2007/05/07(月) 17:28:49
>>922
>917にも書いてあるけど、K&Rはプログラミング初心者向けではないよ。
929デフォルトの名無しさん:2007/05/07(月) 18:14:30
プログラマー目指して今日からC言語を独学で学ぼうと思うんですが
テキストエディタは何がお勧めですか?
930デフォルトの名無しさん:2007/05/07(月) 18:22:57
>>929
メモち(ry
931デフォルトの名無しさん:2007/05/07(月) 18:34:07
>>929
NotePad
932デフォルトの名無しさん:2007/05/07(月) 18:35:08
>>929
環境による。大抵の環境で使えるvi(及びその派生品)はお勧め。
933デフォルトの名無しさん:2007/05/07(月) 18:35:49
>>929
VisualC++ 2005 Express Edition
934デフォルトの名無しさん:2007/05/07(月) 18:43:51
本についての質問の次は
エディタについての質問かよ。
935デフォルトの名無しさん:2007/05/07(月) 19:26:41
>>929
Winならサクラエディタ

しかし、初っ端からK&Rとは>>914は大物になる予感。
初心者が最初にやるなら0から始めるC言語学習帳(ttp://effy.ldw.jp/)が良さげ、
本気でCを勉強する気になったら独習Cに進んでもらえば良いでないかな。
936デフォルトの名無しさん:2007/05/07(月) 21:58:02
サクラエディタはないだろ。さすがに
937914:2007/05/07(月) 21:59:34
おk とりあえず買って目を通してみます

>マクローリン展開は普通に使ってるが
それは失礼しました けれど用語を使い分けるメリットが
それほどあるとは思えなかったりもします
マクローリンさんの世に広めた功績は大きいとは思いますが・・・
そんなこと言い出すとローラン展開と呼べなんて話になるかw

ご紹介いただいた学習帳や独習Cも見てみます

皆様レスありがとうございましたノシ
938デフォルトの名無しさん:2007/05/07(月) 22:42:57
マクローリン展開 = 0 の周りのテイラー展開

「マクローリン」の方が「0 の周りのテイラー」より短いからメリットはある。
939デフォルトの名無しさん:2007/05/07(月) 22:52:02
Viiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
940デフォルトの名無しさん:2007/05/07(月) 23:42:26
vi、および、viクローンに1票
どんな言語でも、スクラッチで書くときや、機械的な整形するときとかはviかな。
コメントは英文で・・

そのあとは、いまどきの各種IDEのエディタでマウスつかってデバッグかなぁ
941 ◆GA6i1P9DC2 :2007/05/08(火) 00:55:52
Cを勉強すべく、”LSI C-86 v3.30c 試食版”を
ttp://www9.plala.or.jp/sgwr-t/detail/lsic/install.html”のページを参考にして、
インスコしてみたのですが、最後のページ”ttp://www9.plala.or.jp/sgwr-t/detail/lsic/confirmation.html”の部分がうまくいきません。
うまくいかない理由にお心当たりのある方がおられましたら、ご教示して下さると、ありがたいです。
942デフォルトの名無しさん:2007/05/08(火) 01:00:54
うまくいかないってのは何をしたらどうなる予定がどうなったんだ?
PATHが通ってないだけな気がするが
943デフォルトの名無しさん:2007/05/08(火) 01:09:17
LSICはやめとけ。
古いとか16bitとかってことだけじゃなく
NT系のOS(XPとか)と相性がイマイチで、不具合が出る可能性がある。
まあ、マニュアルは手元に置いて参照するのに便利だけど。
944941 ◆GA6i1P9DC2 :2007/05/08(火) 01:15:24
>>942
"3.下図のように、著作権などの文字列が出力されればインストール完了です。"
がうまくいきません。文字列が何も出てきません。
何度かインスコしなおしてみたりもしましたが、改善されませんでした。

>>943
他にお勧めのコンパイラを紹介していただけないでしょうか?
945デフォルトの名無しさん:2007/05/08(火) 01:40:36
>>944
他にも、LSICはC89の規格にさえ準拠していない点が多々あるので、
今となっては歴史的な価値しかない。入門で使わない方がいい。混乱する。

他にお薦めというと、Cygwinでgccか、Borlandがタダで配ってるやつか、
MSがタダで配ってるやつになるかな。
946デフォルトの名無しさん:2007/05/08(火) 01:49:53
VC++ が一番楽じゃね?
947デフォルトの名無しさん:2007/05/08(火) 02:04:41
'lcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

も出ないのか?そりゃ変だな
まあWin使ってんならVC++入れてみ
948デフォルトの名無しさん:2007/05/08(火) 06:02:05
つーか、今時LSI-Cなんかを使わせるそのページ自体が糞以下なんだがな。
949デフォルトの名無しさん:2007/05/08(火) 06:17:59
性能最強
gcc
使いやすい
VC++
950デフォルトの名無しさん:2007/05/08(火) 06:26:41
gcc 性能最強って、昔はそうだったかもしれんが、最近はあり得ないな。
Intel > VC++ > gcc じゃね?
951デフォルトの名無しさん:2007/05/08(火) 06:59:28
VTuneが最強なのかね、やっぱり。
ところで、実際VC++の性能ってどうなのよ
952デフォルトの名無しさん:2007/05/08(火) 08:00:03
>>951
初心者はまだ速度なんて気にしなくていいから。
953デフォルトの名無しさん:2007/05/08(火) 09:18:39
LSICのエラー文が日本語にできると知った時にはすでにさよならしてました
954デフォルトの名無しさん:2007/05/08(火) 09:30:02
それはキミがおかしい
955デフォルトの名無しさん:2007/05/08(火) 10:26:36
>>952
と、万年初心者が申しております。
956デフォルトの名無しさん:2007/05/08(火) 12:24:06
てか>>941はまずパーソナルコンピュータの基礎から勉強したほうがいいよ
今まで生きてきてhrefから貼ってるやつ見たのはじめてだよ
957デフォルトの名無しさん:2007/05/08(火) 12:25:06
>>955
みんな恋愛の初心者のボクにアドバイスください> <
958957:2007/05/08(火) 12:26:31
orz
X みんな恋愛の初心者のボクにアドバイスください> <
O 恋愛の初心者のボクにアドバイスください> <
いみわかんねー
959941 ◆GA6i1P9DC2 :2007/05/08(火) 12:51:42
>>945
仰るとおり、とりあえず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ですよね?
960デフォルトの名無しさん:2007/05/08(火) 12:54:56
自己主張の激しい無能ほど始末におえないものはないな。
961デフォルトの名無しさん:2007/05/08(火) 13:14:13
>>959
>"ttp://ja.wikipedia.org/wiki/VC%2B%2B"に"最適化度があまりに高いので、
>開発に熟知していないと使用は危ない"と
gccを選んだことについては何も言わないが、
この記述はページの構成を見るとわかるが
聞きかじった最適化ネタと無料版にしか興味のないド素人の記述なんで
鵜呑みにする必要はない。
962デフォルトの名無しさん:2007/05/08(火) 13:46:35
PATHの設定もできないのにgccか
まあいいけど、まずはコードを書いて動かしてみるってとこから
始めるならIDEがいいけどね。コマンドラインは別に覚えればよし
963941 ◆GA6i1P9DC2 :2007/05/08(火) 13:47:16
>>961
ド素人と見抜けるなんて凄いですね。
964941 ◆GA6i1P9DC2 :2007/05/08(火) 13:53:25
>>962
巨大で複雑なソフトの作成に有効とのことなので、そこまでできる技術を身につけたら使ってみようと思います。
965デフォルトの名無しさん:2007/05/08(火) 13:57:30
逆だろ。最初のうちはあの親切すぎるくらいのデバッガ使って勉強したほうがいい。
つっても初心者質問見てるとまともにデバッガ使ってないようなのばかりだけどな。
966941 ◆GA6i1P9DC2 :2007/05/08(火) 14:19:09
>>965
IDE=統合開発環境ですよね?
もしよろしければ、お勧めを教えていただいてよろしいでしょうか?
967デフォルトの名無しさん:2007/05/08(火) 14:36:05
ヒント:VC++はIDEか否か?
968デフォルトの名無しさん:2007/05/08(火) 14:44:13
VS2003入れてるけど使ってないなー
.NET以降から内部エディタをVimにできなくなって使うのやめた
969デフォルトの名無しさん:2007/05/08(火) 16:19:42
とりあえず今はフリーでいくつも試せるんだから
LSI-Cを入れたくらいなんだし片っ端から入れてみては
この板でもVC++とbcc++はスレもあるくらいだし
970デフォルトの名無しさん:2007/05/08(火) 16:45:35
ifでループ処理をしてみたいのですが、可能でしょうか?
// ソース

#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);
}
971デフォルトの名無しさん:2007/05/08(火) 16:47:30
>>970
13行目のコメントは無視してください
while練習につかったソースの使いまわしなんですorz
972デフォルトの名無しさん:2007/05/08(火) 16:49:06
っ goto
973デフォルトの名無しさん:2007/05/08(火) 16:49:15
よく考えたら
kai = kai + 1;
に戻って来れないので無理ですね・・・

お目汚し失礼しました。。。
974デフォルトの名無しさん: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;
}
975デフォルトの名無しさん:2007/05/08(火) 17:42:47
gotoが上手く動かないのですが・・・
何処が問題なのでしょうか?

#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: // ラベル名
976デフォルトの名無しさん:2007/05/08(火) 17:43:27
    kai = 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;
    }
977デフォルトの名無しさん:2007/05/08(火) 17:51:55
>>974
珍妙な事は大好きです
因みに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;
}
978デフォルトの名無しさん:2007/05/08(火) 18:06:23
ラベルの位置がおかしくね?
loop:はran = rand() %300 + 1;の前じゃないと。
979デフォルトの名無しさん:2007/05/08(火) 18:06:31
>>975
そのコードは書いてある通りに動く。
きっとloop:の位置があなたの想定と違うのだろうけど。

要所要所にprintf()を置く(動きがわからないならもう1行毎でも置く)とか、
デバッガでステップ実行するとかで、自分の思っている通りに動作しているのか確認しましょう。
これを「デバッグ」と言います。
980デフォルトの名無しさん:2007/05/08(火) 18:24:51
>>978
ran = rand () %300 + 1;の前にloop:を配置してみましたが、動作は何一つ変わりません
srand (time(0));の前にも置いてみましたが、やはり変わりませんでした
意表をついてint ran;の前に置いたら、予想通りコンパイルエラーが出ました

(´・ω・`)・・・

>>979
確かに書いてある通りに動くのは解かるんです
(というか、書いていない通りに動くプログラムなんてないでしょうし・・・)

Windows Vistaなので、デバッガなんてありませんです
そもそも、このOS、プログラミングをまともに出来ませんから・・・
(学校の指定なので、仕方がないんです
将来的にはVistaが蔓延するよ、何て先生たちは言ってますけど、ありえないですよね
アメリカやEUの事情をきっと知らないんですよ)

取り敢えずprintfで色々やってみようと思います
981デフォルトの名無しさん:2007/05/08(火) 18:41:53
>980
動作が何一つ変わらないってことはありえないんだけど。
982デフォルトの名無しさん:2007/05/08(火) 18:42:47
Visual Studio が Vista でまともに動くようになれば変わってくるよ。
983デフォルトの名無しさん:2007/05/08(火) 18:43:35
コンパイルし忘れてるだけだろう
984デフォルトの名無しさん:2007/05/08(火) 18:49:39
>>981
こうですよね?

#include <stdio.h>
#include <stdlib.h> // srandやrandが含まれる
#include <time.h>

main () {
    int ran; // 乱数変数ranを定義
    int kai = 0; // 回数変数kaiを初期化
    
    srand (time(0));

loop: // ラベル名

985デフォルトの名無しさん:2007/05/08(火) 18:49:42
あたらしい名前でファイルを作ってコンパイルした→実行したのは古いほう→動作変わんねー
とかじゃね?
986デフォルトの名無しさん:2007/05/08(火) 18:50:52
    ran = rand () %300 + 1; // 1〜300の間の擬似乱数を出力
    
    kai = 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
コンパイルはしてあります
ファイルも保存できてます
その辺りに抜かりはないです
987デフォルトの名無しさん:2007/05/08(火) 18:52:32
>>985
ファイル名を確認してみましたが、特にそういうことはなかったです
ファイルパスも同じですし間違いないです

なんでだろ・・・
988デフォルトの名無しさん:2007/05/08(火) 18:52:44
要するに、まだ for 習ってないのか。
流れを掴むのに if-goto で書いてみるのは悪い事ではないけど、
とりあえず先に進んだんでもいいと思うぞ。
989デフォルトの名無しさん:2007/05/08(火) 18:55:43
>clにPATH通らないし

つvcvars32.bat
990デフォルトの名無しさん:2007/05/08(火) 19:06:02
>>988
forやってもいいんですけど
その前にifを、もう少しやりたいんですよね

学校では
printf → int → float → char → if → whileの流れなんですけどね
仰るとおりforは、まだです

因みに、どれも中途半端に習わされているので、色々微妙です
(charがポインタだなんて教えてくれなかったし・・・
int main (void)すら教えてくれなかったから、int main(void)の意味すら解からない
つか、printfよりputsの方がよさそうな気もするし・・・
ifだって&&や||等の符号は教えてくれませんでした)

>>989
まさか、それをPATHに通すんですか?
991デフォルトの名無しさん:2007/05/08(火) 19:07:09
char は整数でポインタじゃねーぞw
992デフォルトの名無しさん:2007/05/08(火) 19:07:24
そんなラベルでgotoなんて・・・
993デフォルトの名無しさん:2007/05/08(火) 19:07:57
もとへ、レベル
994デフォルトの名無しさん:2007/05/08(火) 19:16:04
>>990
vcvars32.batはPATHを通すコマンドも含まれてるから、それをパスの通ったとこに置いて
コマンドプロンプト起動時に実行すればよし。
995デフォルトの名無しさん:2007/05/08(火) 19:17:38
もしかしてexeをダブルクリックしてるとか?
996デフォルトの名無しさん:2007/05/08(火) 19:23:27
>>991
そうなんですか?
なんか手元の入門書にはcharはポインタとか書いてるんですが・・・

>>992
どの辺りが駄目なんでしょうか?

>>994
ちょっと見てみます

>>995
流石にそれはないです・・・
997デフォルトの名無しさん:2007/05/08(火) 19:23:31
>>995
それじゃ cl.exe 呼んで終了だから、コンパイルすらできない予感

>>990
コマンドプロンプト開く →
vcvars32.bat をコマンドプロンプト窓へドラッグ&ドロップ →
コマンドプロンプトで [Enter]

あとは コマンドたたけ
998デフォルトの名無しさん:2007/05/08(火) 19:31:33
>>996
そんな本があるはずない。いや、あって欲しくない

おまえさんの誤読じゃねえのか?
999デフォルトの名無しさん:2007/05/08(火) 19:32:31
もっと俺様の役に立つレスをしろや
1000デフォルトの名無しさん:2007/05/08(火) 19:32:33
>>997
因みに>>986にも書きましたが、コンパイラはBCCをつかっているので
問題なくコンパイルは出来ていますし
CL.EXEを直に動かしたり、ソースファイルをクリックしたり
コンパイルされたexeファイルをクリックしたりはしていません

全部cmdからbcc32 ソース名でコンパイルし
コンパイルされたプログラム名で実行しています
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。