C言語なら俺に聞け! Part 112
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/08/08(月) 01:32:01質問する前には最低限検索を。
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/
0504デフォルトの名無しさん
2005/08/20(土) 17:35:42独り言なら公園の便所の中でやってくれ
0505デフォルトの名無しさん
2005/08/20(土) 18:25:230506デフォルトの名無しさん
NGNGVS2003のVC++で確認したら、ループの外で num / 2の処理をしてるみたい。
0508デフォルトの名無しさん
2005/08/21(日) 00:23:54本当に基本的なことなのですが。
staticで関数外に構造体などの領域を宣言しても
いきなりその構造体が使える(=メモリが割り当てられる)
わけではないのでしょうか?
そこにアクセスしようとすると、
アクセスバイオレーションが発生します。。。。
0509デフォルトの名無しさん
2005/08/21(日) 00:30:37いいえ、使えます
0510デフォルトの名無しさん
2005/08/21(日) 00:42:51正しいコードなら>>509のとおりなのであなたのコードに問題があるとしか考えられません。
というわけでソースコードを晒してみて下さい。
0511508
2005/08/21(日) 00:44:02例えば、staticで構造体を宣言します。
typedef struct aa
{
int i;
char *p;
}AA;
static宣言された領域は0初期化されてしまいますので、
pももちろん0になっています。
pはアドレスしか保存されませんよね。
ということは、
どこかにpの実体用メモリ領域が必要になってくるってことなんでしょうか?
0512508
2005/08/21(日) 00:53:23typedef 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:520514508
2005/08/21(日) 00:59:52上の構造体のtypedefしたaddrは必要ありません。
2番目の構造体で、構造体のアドレスを使いたいのです。
0515デフォルトの名無しさん
2005/08/21(日) 00:59:57int id;
a addr;
char *host;
}table_info;
0516デフォルトの名無しさん
2005/08/21(日) 01:01:43その構造体は何の構造体? struct infoとライフサイクルに違いはある?
何対何の関係?
0517508
2005/08/21(日) 01:11:19上の構造体は、本来なら既に別ファイルで定義されているものなのです。
それを呼び出す形で、2番目の構造体で使いたいとおもっています。
0518デフォルトの名無しさん
2005/08/21(日) 01:12:040519デフォルトの名無しさん
2005/08/21(日) 01:13:35でいいじゃん。何が不満よ。
0520デフォルトの名無しさん
2005/08/21(日) 01:14:470521デフォルトの名無しさん
2005/08/21(日) 01:20:110522508
2005/08/21(日) 01:20:34そうですね。ポインタを理解してないのが敗因のようです。
勉強してきます。
大変ありがとうございました!
0523515
2005/08/21(日) 01:21:19int 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:51fp++がマズいのでしょうか?
for(i=0;feof(fp)==0;i++){
fp++;
}
0527デフォルトの名無しさん
2005/08/21(日) 01:58:34そうです。FILE*をインクリメントしてどうする。
0528デフォルトの名無しさん
2005/08/21(日) 02:00:02あ、考えてみるとポインタだったんですね。
つまり*fp++とすればいいのですか?
0529デフォルトの名無しさん
2005/08/21(日) 02:01:43そうです。
0530デフォルトの名無しさん
2005/08/21(日) 02:02:26ファイル内の位置は、FILE構造体のメンバに隠されている。
移動させたかったら、FILE*を引数に取る、目的に見合ったを関数を使え
0531デフォルトの名無しさん
2005/08/21(日) 02:05:17さらに構造体だったんですね。。。勉強になりました。
こんな感じですか?
fseek(fp,1,SEEK_CUR)
0532531
2005/08/21(日) 02:13:370533デフォルトの名無しさん
2005/08/21(日) 02:14:030534デフォルトの名無しさん
2005/08/21(日) 02:14:29それ以前にファイルサイズの取得は標準の範囲内では出来ない。
環境依存の方法を使うしかない。
0535デフォルトの名無しさん
2005/08/21(日) 02:15:110536531
2005/08/21(日) 02:20:54ループ内に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ありがとうございます。
ですが上手く動作せず、デタラメな数字がでてしまいます。
バイナリモードだからでしょうか?
それとも私の組み込み方が悪いのかもしれませんが。。。
>fseekの意味を取り違えている。
教えていただけませんか?
0539デフォルトの名無しさん
2005/08/21(日) 02:34:19feek(fp, 0L, SEEK_END);
size=ftell(fp);
いや、おれはいつもstatで取得するけど
0541デフォルトの名無しさん
2005/08/21(日) 07:31:13複数のファイルにコードを書く場合はどのようなことをするのですか?
また、リンクとはどういったいみなのでしょうか?
0542デフォルトの名無しさん
2005/08/21(日) 07:32:56まず本嫁
0543デフォルトの名無しさん
2005/08/21(日) 07:38:110544デフォルトの名無しさん
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#include "sub1.c"
#include "sub2.c"
とか書けばOK
0546デフォルトの名無しさん
2005/08/21(日) 08:30:17俺は普通の入門書読んだが、一通りは書いてあったぞ
まぁ今読んでるK&Rに書いてあるのには及ばないが
0547デフォルトの名無しさん
2005/08/21(日) 13:05:33モジュール化した方がいいと思うが・・・
0548デフォルトの名無しさん
2005/08/21(日) 13:08:35pthread-winのソースみたいになっとるな
0549デフォルトの名無しさん
2005/08/21(日) 13:10:17.c を include するのはあまりおすすめな方法じゃないな。
それでも可能だけど一つのファイルを修正しただけでも
全てのコンパイルをしなければならなくなって効率が悪い。
普通は型やプロトタイプ宣言や#defineをヘッダファイルに
まとめておいてそれを使うソースでincludeする。
0550データボックス
2005/08/21(日) 15:36:210551デフォルトの名無しさん
2005/08/21(日) 16:35:21多分ヘッダファイルを書けないんだろう。
0552デフォルトの名無しさん
2005/08/21(日) 16:42:080553デフォルトの名無しさん
2005/08/21(日) 16:44:440554データボックス
2005/08/21(日) 17:25:00Borland 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をとくプログラム
xとrをきくかたち
教えてください(>Д<)
0556デフォルトの名無しさん
2005/08/21(日) 17:41:210557デフォルトの名無しさん
2005/08/21(日) 17:48:46それはまず式を簡単にしてからやれよ
そのまま計算するバカはいないよ
プログラミングより先に数学を勉強しなさい
0558デフォルトの名無しさん
2005/08/21(日) 18:05:200559デフォルトの名無しさん
2005/08/21(日) 19:34:27.o, .lo, .la, .am, .in
というファイルがあるのですがこれはなんでしょうか?
0560デフォルトの名無しさん
2005/08/21(日) 19:38:17ここではプログラムの組み方を質問するのには不適当です。
やたらレスしたがって >>1を理解したくない、駄弁るだけ、などのかたがたは、
http://pc8.2ch.net/test/read.cgi/tech/1124511889/
へ移動されるのが適当だと思われます。
0561デフォルトの名無しさん
2005/08/21(日) 19:50:110562デフォルトの名無しさん
2005/08/21(日) 19:53:14つ ttp://pc8.2ch.net/test/read.cgi/tech/1124511889/
0563デフォルトの名無しさん
2005/08/21(日) 20:00:550564デフォルトの名無しさん
2005/08/21(日) 20:04:26階乗は自分で書け
累乗はpow
0565デフォルトの名無しさん
2005/08/21(日) 20:09:140566デフォルトの名無しさん
2005/08/21(日) 20:23:17脳内コンパイル注意
#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:32int *hogo = 0;
となっているのですが、
NULLと0は何が違うのですか?
0568デフォルトの名無しさん
2005/08/21(日) 20:33:180569デフォルトの名無しさん
2005/08/21(日) 20:40:17書き込むんなら答えをかけよ糞が
0570デフォルトの名無しさん
2005/08/21(日) 20:41:250571デフォルトの名無しさん
2005/08/21(日) 20:42:56forで回す以外の方法は無いのでしょうか?
0572デフォルトの名無しさん
2005/08/21(日) 20:46:25memset
0573デフォルトの名無しさん
2005/08/21(日) 20:47:010574デフォルトの名無しさん
2005/08/21(日) 20:51:420575デフォルトの名無しさん
2005/08/21(日) 20:51:50ありがとう!!!!
0576デフォルトの名無しさん
2005/08/21(日) 20:54:45絶対にする必要は無いからだろ
0577デフォルトの名無しさん
2005/08/21(日) 20:56:02常にZeroFillする必要は無いけど、
必要な時には効率よくZerofillしたいからじゃない?
0578デフォルトの名無しさん
2005/08/21(日) 20:56:36少なくとも>>571には必要なようだが。
0579デフォルトの名無しさん
2005/08/21(日) 20:57:09だとしたら、何故callocは?
0580579
2005/08/21(日) 20:57:490581デフォルトの名無しさん
2005/08/21(日) 20:59:15自前でfor回したり、後でmemsetするよりも効率よくZerofillすることが
可能かもしれない。
0582579
2005/08/21(日) 21:00:37だったらmallocにZeroFillフラグつけるとか、mallocZとかいう別関数で用意するほうが分かりやすいのに。
そんなもん、なんで"printf"があるのに"puts"があるのですか
っていってるようなもん
0584デフォルトの名無しさん
2005/08/21(日) 21:11:40ごめん
0585デフォルトの名無しさん
2005/08/21(日) 21:42:16rとnを聞いて
と求めるプログラム
0586デフォルトの名無しさん
2005/08/21(日) 21:43:33C/C++の宿題を片づけます 49代目
http://pc8.2ch.net/test/read.cgi/tech/1123661447/l50
0587デフォルトの名無しさん
2005/08/21(日) 21:58:59おまえ、その二つは用途が完全に違うだろ。
0588デフォルトの名無しさん
2005/08/21(日) 22:01:34用途が違うのに一緒のように使おうとするっていう例では丁度いいじゃん
0589デフォルトの名無しさん
2005/08/21(日) 22:15:01と言うのがあるのですが = の後ろからの意味が分かりません
どのような意味なのでしょうか?
0590デフォルトの名無しさん
2005/08/21(日) 22:16:540591デフォルトの名無しさん
2005/08/21(日) 22:17:200592デフォルトの名無しさん
2005/08/21(日) 22:18:33答えなかったら?
0593デフォルトの名無しさん
2005/08/21(日) 22:23:27それだけじゃ、何言ってるのかわからん。
0594デフォルトの名無しさん
2005/08/21(日) 22:37:54{
{"hoge1", 1, 0, 'a'},
{"hoge2", 1, 0, 'a'},
{"hoge3", 1, 0, 'a'}
};
のようなコードがあるのですが、
なぜhogeとhoge_hogeを二つの変数を宣言しているのですか?
0595デフォルトの名無しさん
2005/08/21(日) 22:43:32お前生意気帰れ二度と来るな
0596デフォルトの名無しさん
2005/08/21(日) 22:47:18hoge は変数じゃない
0599デフォルトの名無しさん
2005/08/21(日) 22:52:05「struct hoge」型の変数hoge_hogeの宣言。
0600デフォルトの名無しさん
2005/08/21(日) 22:52:270601デフォルトの名無しさん
2005/08/21(日) 22:53:210602デフォルトの名無しさん
2005/08/21(日) 22:54:110603デフォルトの名無しさん
2005/08/21(日) 22:55:33条件演算子
そのコードの意味としてはこんな感じ。
int this_option_optind;
if (optind != 0)
this_option_optind = optind;
else
this_option_optind = 1;
■ このスレッドは過去ログ倉庫に格納されています