トップページ⇒tech
1001コメント273KB

C言語なら俺に聞け! Part 112

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/08(月) 01:32:01
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺に聞け! Part 111
http://pc8.2ch.net/test/read.cgi/tech/1121657911/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
04604582005/08/19(金) 08:41:12
>>459
defineの文法までここで教える必要はないと思うが。
0461デフォルトの名無しさん2005/08/19(金) 09:54:30
二つの構造体の宣言が別々のインクルードファイルに書かれてて、
それぞれの構造体がもう一方の構造体を要素として持ちたい時、
どうやればいいんでしょう?下のだとニワトリと卵になってしまうし・・。

----- aaa.h -----
#include "bbb.h"
typedef struct {
BBB *b;
}AAA;

---- bbb.h ----
#include "aaa.h"
typedef struct {
AAA *a;
}BBB;
0462デフォルトの名無しさん2005/08/19(金) 10:00:40
typedef struct A A;
typedef struct B B;

struct A { B* b; };
struct B { A* a; };
0463デフォルトの名無しさん2005/08/19(金) 10:06:07
>>462
別々のファイルで宣言すること自体がおかしいってこと?
0464デフォルトの名無しさん2005/08/19(金) 10:53:56
>>461
-----t0.h
#ifndef t0_h
#define t0_h
#include "t1.h"
struct a {
struct b *b;
};
typedef struct a a;
#endif
-----t1.h
#ifndef t1_h
#define t1_h
#include "t0.h"
struct b {
struct a *a;
};
typedef struct b b;
#endif
0465デフォルトの名無しさん2005/08/19(金) 12:28:37
scanf関数を使用し、コマンドラインからの数字を10回入力し、
入力の中でもっとも大きな数字を表示しなさい。
※入力桁数のエラーについて対処する事

という課題が出されたのですが、入力桁数のエラーがよく分かりません。
誰か教えていただけないでしょうか?
0466デフォルトの名無しさん2005/08/19(金) 12:46:52
>>465
どういうエラーなのかが分からないとなんとも。
0467デフォルトの名無しさん2005/08/19(金) 12:53:11
>>464
ありがとん。できました。
04684652005/08/19(金) 12:55:12
>>466
先ほどのが課題文の全文なので私にもよく分かっていないのですが、
おそらくは型が扱う数字を超えて入力した場合、
たとえば、int型なら32,767より大きい数字を入力した場合に認識されないことについて対処する
ということだと思います。
0469デフォルトの名無しさん2005/08/19(金) 13:26:10
>>468
そう考えた、ということでコード組めばいいんじゃない?

あと、intの場合は環境によってサイズが違うので注意。
 ・sizeofでバイト数をチェックして上限を計算
 ・今の環境に合わせて、とりあえず決め打ち
など、方法はいろいろあるので試してみ。

(独り言)
学校の課題ってのは結果をただ提出するだけじゃないんだよ。
不明点、疑問点があったら提出前に質問しに行ってもいいんだし。
全く分からない、何がわからないのかわからない」ってのは論外だけど。

04704652005/08/19(金) 13:37:53
>>469
助かりました。ありがとうございます
0471デフォルトの名無しさん2005/08/19(金) 13:40:16
つーか、宿題スレがあるんだからそっちでやれよ。
0472デフォルトの名無しさん2005/08/19(金) 13:57:42
>>472
まあ、宿題○投げじゃないから
いいんでないの?
04734652005/08/19(金) 14:00:55
えっと、これ学校の宿題とは違うのですよ。
ですから、宿題スレで質問するのも気が引けてしまいまして(苦笑)
0474デフォルトの名無しさん2005/08/19(金) 14:15:39
int a,b;
double c;
a = 10;
b = 1000;
c = a / b ;
printf("c = %f",c);

結果 c = 0.000000となってしまうのはなぜでしょうか?

0475デフォルトの名無しさん2005/08/19(金) 14:18:49
c = (double)a / (double)b ;
0476デフォルトの名無しさん2005/08/19(金) 14:30:09
>>475
ありがとうございました。

もうひとつすみません。
int a,b,d;
double c;
a = 5
b = 5;
d = 1000;
c = (a + b) /d ;
printf("c = %f",c);
この結果がc = 0.000000となりますが
int a,b,d;
double c;
a = 5
b = 5;
d = 1000;
c = a + b ;
c = c / d;
printf("c = %f",c);
この結果がc = 0.01となるのはどうしてでしょうか?
すみませんが教えてください。
0477デフォルトの名無しさんNGNG
>>469
> ・sizeofでバイト数をチェックして上限を計算

これってintの最大値のことを言ってるの?
だったらINT_MAXを使うのが定跡だと思うけど。
0478デフォルトの名無しさん2005/08/19(金) 14:31:05
質問です。

Cでファイルからデータを読み出すとき、「1行(次の\nまで)を読み込む」ってどうしてます?
fgetc で1文字ずつ読み込んで \n かどうか判定して・・・ってやるしかないでしょうか。
まさか fscanf とか使うのもあれだし。
スクリプトファイルを読み込むときなどに使います。
0479デフォルトの名無しさん2005/08/19(金) 14:33:58
>>478
fgets関数っていうのがありますよ。
0480デフォルトの名無しさん2005/08/19(金) 14:35:18
>>478
fgets()
0481デフォルトの名無しさん2005/08/19(金) 14:36:18
>>479
fgets 調べてみました
・・・今までの苦労は・・・orz ありがとございました。
0482デフォルトの名無しさんNGNG
>>478
一行はかならず*Kバイト以下とか、そういう仕様で割り切れば、fgets()で簡単に書けると思う。
0483デフォルトの名無しさん2005/08/19(金) 14:37:28
>>476
>c = (a+b)/d;
(a+b)もdもint型だから、int型の(a+b)/dがdouble型に型変換されてcに代入される。

>c = c / d;
cがdouble型だからdがdouble型に暗黙的に型変換されてdouble型のc/dが計算される。
その結果がcに代入される。

もう少し型について勉強しとけ。
0484デフォルトの名無しさん2005/08/19(金) 14:38:18
>>483
ありがとうございました。
0485デフォルトの名無しさん2005/08/19(金) 14:38:26
>476
前者の場合、
c = (a + b) /d の右辺はすべて整数値

後者の場合、
c = a + b ;
の時点だと右辺は整数値だが
c = c / d;
ではcがdoubleのため実数値となる

前者の場合でも、aかbをdoubleでキャストすれば
後者と同じ結果になる
0486デフォルトの名無しさん2005/08/19(金) 14:40:44
>>485
本当にすいません。ありがとうございました。
0487デフォルトの名無しさん2005/08/19(金) 20:08:24
FILE型の変数(ポインタ)からint型の整数(ファイルデスクリプタ?)
を得るのってどうすればいいのですか?
0488デフォルトの名無しさん2005/08/19(金) 20:13:49
>>487
VC なら _fileno 関数が。非標準ね。
stdio.h を読んで構造体メンバから引張ってくるとか。
互換性に問題あるけど。
0489デフォルトの名無しさん2005/08/19(金) 20:39:40
>>487
Unix 系なら int fileno(FILE *stream) てなものが...
0490デフォルトの名無しさん2005/08/19(金) 22:14:49
strcpy、sprintfとか使って、char型にしてから、
atoiとかstrgetvalue()とか使えないもんかな
0491デフォルトの名無しさん2005/08/19(金) 23:04:42
>>490
一体全体何を言っているのやら。
0492デフォルトの名無しさん2005/08/19(金) 23:24:55
UNIX系C言語のコンパイルで汎用で使えるMAKEFILEを作りたいんだけど、
何か良い参考書とか
サンプル(オプションなどのコメントアウト付)とかないですかね?
0493デフォルトの名無しさん2005/08/19(金) 23:28:27
>>492
ttp://www.ecoop.net/coop/translated/GNUMake3.77/make_toc.jp.html
ttp://www-or.amp.i.kyoto-u.ac.jp/algo-eng/db/makefile.html
俺はこの二つでなんとなかった。あくまで俺の場合な。
0494デフォルトの名無しさん2005/08/19(金) 23:28:58
>>492
スレ違い。
Unixプログラミングスレ、makeスレ、書籍スレなどへどうぞ。
04954642005/08/20(土) 01:40:36
>>461==467
あんたに宿題
>>464 のコードから #include 行を削除しても問題がない事を確認し,
なぜ #include 行がなくても問題ないのか述べよ.
0496デフォルトの名無しさん2005/08/20(土) 03:05:41
----- aaa.h -----
typedef struct AAA_{
struct BBB_ *b;
}AAA;

---- bbb.h ----
typedef struct BBB_{
struct AAA_ *a;
}BBB


ってかんじ?
ちなみにstructはtypedefしない方がぱっと見分かりやすいぞ
0497デフォルトの名無しさん2005/08/20(土) 10:58:01
>491
(w)sprintfてのは、int→char変換の為に、て意味でも存在してるぞ
char a;
int b;
(w)sprintf(&a,"%d",b);
0498デフォルトの名無しさん2005/08/20(土) 11:01:14
>>497
'\0'の分を用意していないからだめだろ。snprintf/swprintf
0499デフォルトの名無しさん2005/08/20(土) 15:41:34
/* 約数があるかどうか調べる */
is_prime = 1
for(i=2; i<=num/2; i=i+1)
if((num%i)==0) is_prime = 0;

これはどうゆう計算が行われてますか?
教えて下さい。。。
0500デフォルトの名無しさん2005/08/20(土) 15:56:24
>>499
約数があるかどうか調べてる
0501デフォルトの名無しさん2005/08/20(土) 16:18:12
>>499
誰が書いたんだ?
i=i+1じゃなくてi++でいいのに
0502デフォルトの名無しさん2005/08/20(土) 16:32:49
>>499
is_primeがフラグになってる。('0'なら非素数、'1'なら素数)

2<=i<=num/2の範囲でiをインクリメントして、逐次numをiで割り切れるか調べる。
ちなみに、
 ・iの初期値が2なのは、1で割るのを避けるため。
 ・ループ継続条件がi<=num/2なのは、余計なループをさせないため
まあ一回でも割り切れたらis_primeに'1'が入るから、
約数を調べたいだけなら
 if((num%i)==0) {
   is_prime = 0;
   break;
 }
の方がいいと思う
0503デフォルトの名無しさん2005/08/20(土) 17:28:33
今どきのコンパイラは for の条件に i<=num/2 とか書いても速いのかな・・・。
昔々 for (i = 0; i < strlen(s); i++) というのを書いたやつが居て衝撃を受けたことのある俺だが。
0504デフォルトの名無しさん2005/08/20(土) 17:35:42
>>503
独り言なら公園の便所の中でやってくれ
0505デフォルトの名無しさん2005/08/20(土) 18:25:23
公園の便所には阿部さんがいて危険だから自宅のトイレでいいじゃん
0506デフォルトの名無しさんNGNG
>>503
VS2003のVC++で確認したら、ループの外で num / 2の処理をしてるみたい。
05074992005/08/20(土) 18:54:22
>>502
ありがとう!なかなか理解できなくて困ってた。
0508デフォルトの名無しさん2005/08/21(日) 00:23:54
すみません。教えてください。
本当に基本的なことなのですが。

staticで関数外に構造体などの領域を宣言しても
いきなりその構造体が使える(=メモリが割り当てられる)
わけではないのでしょうか?

そこにアクセスしようとすると、
アクセスバイオレーションが発生します。。。。
0509デフォルトの名無しさん2005/08/21(日) 00:30:37
>>508
いいえ、使えます
0510デフォルトの名無しさん2005/08/21(日) 00:42:51
>>508
正しいコードなら>>509のとおりなのであなたのコードに問題があるとしか考えられません。
というわけでソースコードを晒してみて下さい。
05115082005/08/21(日) 00:44:02
すみません。言葉不足でした。

例えば、staticで構造体を宣言します。

typedef struct aa
{
int i;
char *p;
}AA;

static宣言された領域は0初期化されてしまいますので、
pももちろん0になっています。

pはアドレスしか保存されませんよね。
ということは、
どこかにpの実体用メモリ領域が必要になってくるってことなんでしょうか?
05125082005/08/21(日) 00:53:23
すみません。ソース晒した方がよさそうですね。
typedef struct a{
unsigned long aa;
int bb;
}addr;

typedef struct info{
int id;
a *addr;
char *host;
}table_info;

#define MAX_SIZE 2
static table_info table[MAX_SIZE];

int main(int argc, char* argv[])
{int i;
for(i=0;i<MAX_SIZE;i++)
{
table[i].id=-1;
table[i].addr->aa=0;←ここでエラー
table[i].host=NULL;
}
return 0;
}
staticで0クリアされてるので、0番地にアクセスしようとして
エラーになってるのはわかったのですが
これを回避する方法がわかりません。。。。
よろしくおねがいいたします!
0513デフォルトの名無しさん2005/08/21(日) 00:55:52
回避する方法というか、addrは何のための変数?
05145082005/08/21(日) 00:59:52
あ。変な宣言になってますね。
上の構造体のtypedefしたaddrは必要ありません。

2番目の構造体で、構造体のアドレスを使いたいのです。
0515デフォルトの名無しさん2005/08/21(日) 00:59:57
typedef struct info{
int id;
a addr;
char *host;
}table_info;
0516デフォルトの名無しさん2005/08/21(日) 01:01:43
>>514
その構造体は何の構造体? struct infoとライフサイクルに違いはある?
何対何の関係?
05175082005/08/21(日) 01:11:19
>>516

上の構造体は、本来なら既に別ファイルで定義されているものなのです。
それを呼び出す形で、2番目の構造体で使いたいとおもっています。
0518デフォルトの名無しさん2005/08/21(日) 01:12:04
そんなことは聞いてない。
0519デフォルトの名無しさん2005/08/21(日) 01:13:35
>>515
でいいじゃん。何が不満よ。
0520デフォルトの名無しさん2005/08/21(日) 01:14:47
ポインタを理解していない模様
0521デフォルトの名無しさん2005/08/21(日) 01:20:11
構造体以前の問題だな
05225082005/08/21(日) 01:20:34
>>515の宣言で、呼び出しができるのですか?

そうですね。ポインタを理解してないのが敗因のようです。
勉強してきます。
大変ありがとうございました!
05235152005/08/21(日) 01:21:19
typedef struct info{
int id;
addr a;
char *host;
}table_info;

こうだな。
0524デフォルトの名無しさん2005/08/21(日) 01:25:49
終わったところで恐縮だけど、「呼び出す形」とか「呼び出しができる」とか
どういう意味なんだろ???
0525デフォルトの名無しさん2005/08/21(日) 01:29:42
ほかで定義しているものを使うってだけだろな。
ただこいつの理解レベルじゃ、定義と宣言のつかいわけも怪しいから、よくわからん。
0526デフォルトの名無しさん2005/08/21(日) 01:57:51
下記のようにバイナリモードで開いたファイルのサイズ(Byte)を得ようとしたのですが、うまくいきません。
fp++がマズいのでしょうか?

for(i=0;feof(fp)==0;i++){
  fp++;
}
0527デフォルトの名無しさん2005/08/21(日) 01:58:34
>>526
そうです。FILE*をインクリメントしてどうする。
0528デフォルトの名無しさん2005/08/21(日) 02:00:02
>>527
あ、考えてみるとポインタだったんですね。
つまり*fp++とすればいいのですか?
0529デフォルトの名無しさん2005/08/21(日) 02:01:43
>>528
そうです。
0530デフォルトの名無しさん2005/08/21(日) 02:02:26
fp はファイル内の位置そのものではない。
ファイル内の位置は、FILE構造体のメンバに隠されている。

移動させたかったら、FILE*を引数に取る、目的に見合ったを関数を使え
0531デフォルトの名無しさん2005/08/21(日) 02:05:17
>>530
さらに構造体だったんですね。。。勉強になりました。
こんな感じですか?
fseek(fp,1,SEEK_CUR)
05325312005/08/21(日) 02:13:37
第二引数がlong型ということで1Lに修正してみましたが、正常に動作しませんでしたorz
0533デフォルトの名無しさん2005/08/21(日) 02:14:03
おしいな・・・
0534デフォルトの名無しさん2005/08/21(日) 02:14:29
>>532
それ以前にファイルサイズの取得は標準の範囲内では出来ない。
環境依存の方法を使うしかない。
0535デフォルトの名無しさん2005/08/21(日) 02:15:11
ケツに移動させてみい
05365312005/08/21(日) 02:20:54
>>535さんの言うようにしても正常に動作しなかったので、
ループ内にprintf("%d ",i);と入れて確認しましたが、無限ループになってるようです。

環境依存だったんですね。。スレ違いすいませんでした。。。
代替策とかないですかね?
0537デフォルトの名無しさん2005/08/21(日) 02:24:39
こんな感じでどうよ。

#include <stdio.h>
int filelen(const char *filename, const char *mode)
{
  int len = 0;
  FILE *fp = fopen(filename, mode);
  if( fp == NULL ) return -1;
  while(fgetc(fp) != EOF ) ++len;
  return len;
}

ちなみに>>531が思い通りにうごかないのは環境依存云々ではなく、fseekの意味を取り違えている。
0538デフォルトの名無しさん2005/08/21(日) 02:30:32
>>537
ありがとうございます。
ですが上手く動作せず、デタラメな数字がでてしまいます。
バイナリモードだからでしょうか?
それとも私の組み込み方が悪いのかもしれませんが。。。

>fseekの意味を取り違えている。
教えていただけませんか?
0539デフォルトの名無しさん2005/08/21(日) 02:34:19
ほんとにケツに移動したのか?
feek(fp, 0L, SEEK_END);
size=ftell(fp);
いや、おれはいつもstatで取得するけど
05405312005/08/21(日) 02:48:52
>>539
おお、こんな方法があるんですね。
ありがとうございます。
0541デフォルトの名無しさん2005/08/21(日) 07:31:13
今まで一つのファイルでプログラミングを行って来たのですが
複数のファイルにコードを書く場合はどのようなことをするのですか?

また、リンクとはどういったいみなのでしょうか?
0542デフォルトの名無しさん2005/08/21(日) 07:32:56
>>541
まず本嫁
0543デフォルトの名無しさん2005/08/21(日) 07:38:11
普通の入門書には書いてないだろ
0544デフォルトの名無しさん2005/08/21(日) 07:40:41
ぜんぜん読んでないけどタイトル的にここ(藁)
ってかくぐれよそんぐらいorz
ttp://okuyama.mt.tama.hosei.ac.jp/unix/C/slide79-1.html
0545デフォルトの名無しさん2005/08/21(日) 07:43:38
main.cに
#include "sub1.c"
#include "sub2.c"
とか書けばOK
0546デフォルトの名無しさん2005/08/21(日) 08:30:17
>>543
俺は普通の入門書読んだが、一通りは書いてあったぞ
まぁ今読んでるK&Rに書いてあるのには及ばないが
0547デフォルトの名無しさん2005/08/21(日) 13:05:33
>>545
モジュール化した方がいいと思うが・・・
0548デフォルトの名無しさん2005/08/21(日) 13:08:35
>>545
pthread-winのソースみたいになっとるな
0549デフォルトの名無しさん2005/08/21(日) 13:10:17
>>545
.c を include するのはあまりおすすめな方法じゃないな。
それでも可能だけど一つのファイルを修正しただけでも
全てのコンパイルをしなければならなくなって効率が悪い。

普通は型やプロトタイプ宣言や#defineをヘッダファイルに
まとめておいてそれを使うソースでincludeする。
0550データボックス2005/08/21(日) 15:36:21
複数のソースファイルをコンパイル・リンクするだけなんじゃないか。
0551デフォルトの名無しさん2005/08/21(日) 16:35:21
>>550
多分ヘッダファイルを書けないんだろう。
0552デフォルトの名無しさん2005/08/21(日) 16:42:08
リンクってどうするの?
0553デフォルトの名無しさん2005/08/21(日) 16:44:44
負けファイル作んないと。
0554データボックス2005/08/21(日) 17:25:00
D:\databox>bcc32 main_kansu_file.c sonota_cfile.c kison_objfile.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main_kansu_file.c:
sonota_cfile.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
0555デフォルトの名無しさん 2005/08/21(日) 17:37:13
1 + x/1! + x^2/2! + x^3/3! +・・・・+x^r/r!
をとくプログラム
xとrをきくかたち
教えてください(>Д<)
0556デフォルトの名無しさん2005/08/21(日) 17:41:21
嫌。
0557デフォルトの名無しさん2005/08/21(日) 17:48:46
>>555
それはまず式を簡単にしてからやれよ
そのまま計算するバカはいないよ
プログラミングより先に数学を勉強しなさい
0558デフォルトの名無しさん2005/08/21(日) 18:05:20
x^r/r! = x^(r-1)/(r-1)! * ???????
0559デフォルトの名無しさん2005/08/21(日) 19:34:27
ソースをダウンロードしたら
.o, .lo, .la, .am, .in
というファイルがあるのですがこれはなんでしょうか?
■ このスレッドは過去ログ倉庫に格納されています