トップページ⇒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/
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
というファイルがあるのですがこれはなんでしょうか?
0560デフォルトの名無しさん2005/08/21(日) 19:38:17
質問者は >>1 を理解して、(おそらくほとんどの場合)初心者系や宿題系へどうぞ。
ここではプログラムの組み方を質問するのには不適当です。
やたらレスしたがって >>1を理解したくない、駄弁るだけ、などのかたがたは、
http://pc8.2ch.net/test/read.cgi/tech/1124511889/
へ移動されるのが適当だと思われます。
0561デフォルトの名無しさん2005/08/21(日) 19:50:11
ではまず駄弁るだけの>>560さんが移動してください
0562デフォルトの名無しさん2005/08/21(日) 19:53:14
>>561
つ ttp://pc8.2ch.net/test/read.cgi/tech/1124511889/
0563デフォルトの名無しさん2005/08/21(日) 20:00:55
階乗と累乗教えてください
0564デフォルトの名無しさん2005/08/21(日) 20:04:26
>>563
階乗は自分で書け
累乗はpow
0565デフォルトの名無しさん2005/08/21(日) 20:09:14
新しめのC規格で、オーバーロードってできるのですか?
0566デフォルトの名無しさん2005/08/21(日) 20:23:17
>>555
脳内コンパイル注意
#include <stdio.h>
#include <math.h>
int fact(int n)
{
 int ret=1,i;
 for(i=2;i<=n;i++)ret*=i;
 return ret;
}
double func(double x,int r)
{
 double ret=1.f,t;
 int i;
 for(i=1;i<=r;i++)
 {
  t=pow(x,i);
  t/=(double)fact(i);
  ret+=t;
 }
 return ret;
}
int main()
{
 double x;
 int r;
 printf("x,r= ");
 scanf("%lf,%d",&x,&r);
 printf("Ans= %lf",func(x,r));
 return 0;
}
0567デフォルトの名無しさん2005/08/21(日) 20:27:32
char *hoge = NULL;
int *hogo = 0;
となっているのですが、
NULLと0は何が違うのですか?
0568デフォルトの名無しさん2005/08/21(日) 20:33:18
FAQ参照。
0569デフォルトの名無しさん2005/08/21(日) 20:40:17
はぁ?
書き込むんなら答えをかけよ糞が
0570デフォルトの名無しさん2005/08/21(日) 20:41:25
#define NULL 0
0571デフォルトの名無しさん2005/08/21(日) 20:42:56
mallocでメモリを確保してそれを全て0にしたいのですが
forで回す以外の方法は無いのでしょうか?
0572デフォルトの名無しさん2005/08/21(日) 20:46:25
calloc
memset
0573デフォルトの名無しさん2005/08/21(日) 20:47:01
forで回すのなんて本当にやってるやついるの?
0574デフォルトの名無しさん2005/08/21(日) 20:51:42
なんで、mallocはゴミつめたままで、callocはZeroFillなんだろうな?
0575デフォルトの名無しさん2005/08/21(日) 20:51:50
566さん
ありがとう!!!! 
0576デフォルトの名無しさん2005/08/21(日) 20:54:45
>>>574
絶対にする必要は無いからだろ
0577デフォルトの名無しさん2005/08/21(日) 20:56:02
>>574
常にZeroFillする必要は無いけど、
必要な時には効率よくZerofillしたいからじゃない?
0578デフォルトの名無しさん2005/08/21(日) 20:56:36
mallocは絶対にゼロで埋める必要がないといいたいのだろうか。情報少なすぎて意味分からん。
少なくとも>>571には必要なようだが。
0579デフォルトの名無しさん2005/08/21(日) 20:57:09
>>577
だとしたら、何故callocは?
05805792005/08/21(日) 20:57:49
あ、その使い分けが出来るように、変えてあるということか。
0581デフォルトの名無しさん2005/08/21(日) 20:59:15
>>579
自前でfor回したり、後でmemsetするよりも効率よくZerofillすることが
可能かもしれない。
05825792005/08/21(日) 21:00:37
でも、calocとmallocは本来目的が違う関数なのに、そういう設計はなんだかな。
だったらmallocにZeroFillフラグつけるとか、mallocZとかいう別関数で用意するほうが分かりやすいのに。
0583 ◆fZOaF4CQP6 2005/08/21(日) 21:10:15
ここは阿呆連中ばっかりか?
そんなもん、なんで"printf"があるのに"puts"があるのですか
っていってるようなもん
0584デフォルトの名無しさん2005/08/21(日) 21:11:40
そりゃそうだな
ごめん
0585デフォルトの名無しさん2005/08/21(日) 21:42:16
1 + 1/r^2 + 1/r^2 +・・・・+1/r^n
rとnを聞いて
と求めるプログラム
0586デフォルトの名無しさん2005/08/21(日) 21:43:33
>>585
C/C++の宿題を片づけます 49代目
http://pc8.2ch.net/test/read.cgi/tech/1123661447/l50
0587デフォルトの名無しさん2005/08/21(日) 21:58:59
>>583
おまえ、その二つは用途が完全に違うだろ。
0588デフォルトの名無しさん2005/08/21(日) 22:01:34
だからなに?
用途が違うのに一緒のように使おうとするっていう例では丁度いいじゃん
0589デフォルトの名無しさん2005/08/21(日) 22:15:01
int this_option_optind = optind ? optind : 1;
と言うのがあるのですが = の後ろからの意味が分かりません
どのような意味なのでしょうか?
0590デフォルトの名無しさん2005/08/21(日) 22:16:54
自分で調べろ
0591デフォルトの名無しさん2005/08/21(日) 22:17:20
ヒント:三項演算子
0592デフォルトの名無しさん2005/08/21(日) 22:18:33
>>590
答えなかったら?
0593デフォルトの名無しさん2005/08/21(日) 22:23:27
煽りすらまともに出来ないのかよ。
それだけじゃ、何言ってるのかわからん。
0594デフォルトの名無しさん2005/08/21(日) 22:37:54
static struct hoge hoge_hoge[] =
{
{"hoge1", 1, 0, 'a'},
{"hoge2", 1, 0, 'a'},
{"hoge3", 1, 0, 'a'}
};

のようなコードがあるのですが、
なぜhogeとhoge_hogeを二つの変数を宣言しているのですか?
0595デフォルトの名無しさん2005/08/21(日) 22:43:32
>>569
お前生意気帰れ二度と来るな
0596デフォルトの名無しさん2005/08/21(日) 22:47:18
>>594
hoge は変数じゃない
05975692005/08/21(日) 22:48:44
>>595
帰れって言われてもここは自宅ですよ?
あなたが現実とネット上の世界の区別が付かないといわれている人ですか?
0598!=5952005/08/21(日) 22:50:47
>>597は無視でいきましょう。
0599デフォルトの名無しさん2005/08/21(日) 22:52:05
>>594
「struct hoge」型の変数hoge_hogeの宣言。
0600デフォルトの名無しさん2005/08/21(日) 22:52:27
>>598 = >>595だな
0601デフォルトの名無しさん2005/08/21(日) 22:53:21
それが何か?
0602デフォルトの名無しさん2005/08/21(日) 22:54:11
必死だな
0603デフォルトの名無しさん2005/08/21(日) 22:55:33
>>589
条件演算子
そのコードの意味としてはこんな感じ。

int this_option_optind;
if (optind != 0)
    this_option_optind = optind;
else
    this_option_optind = 1;
0604デフォルトの名無しさん2005/08/21(日) 22:56:31
static hogeをループで回したときは、なぜ多重宣言にならないんですか?
0605デフォルトの名無しさん2005/08/21(日) 22:58:47
>>597
見苦しいぞ
0606デフォルトの名無しさん2005/08/21(日) 22:59:20
>>604
たとえ何回ループされようとソースコード上ではたった1箇所でしか定義がなされていないから。
■ このスレッドは過去ログ倉庫に格納されています