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

C言語なら、俺に聞け! <31>

■ このスレッドは過去ログ倉庫に格納されています
0001SHOW-A息子NGNG
漏れは32才。22年間、父SHOW-Aにプログラムを叩き込まれてきた。
いろいろな言語を極めたが、一番漏れになじんだのはCだった。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。

便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。あと、至急父に仕事を与えてやってください。

コンパイラ、過去ログなどのリンクは>>2-5 あたり
0685デフォルトの名無しさんNGNG
変数というか式になりますかその場合。
0686デフォルトの名無しさんNGNG
>>684
一行に確実に40個数字があるの?それぞれの区切り文字は半角スペース?
0687デフォルトの名無しさんNGNG
というか、どちらでもいい。つまらん論争だな。
0688デフォルトの名無しさんNGNG
>>686
数字は確実にあります。Fortranから吐かれたでーたで、半角スペースも
1桁とかぞえて、5桁です。
^^^24^^^12^^^^1.......
(^は半角スペースのつもり)
fscanf(fp,"%d%d%d%d.........(40個ならべ、それぞれ変数に格納しる)

というしかてがないのでしょうか?
0689デフォルトの名無しさんNGNG
>>684
俺ならfreadを使う。それとatoi系の関数。
0690デフォルトの名無しさんNGNG
>>689
fgetsとstrtolの方がよくない?多分strtolは数字のあとの空白で変換を終えてくれるとおもうから。
0691690NGNG
strtolの第二引数をうまく使えばいいと思うんだよね。
0692689NGNG
>>690
ありがと。書き込み時刻からわかると思うけど、
俺のレスは 684を読んだ時のものです。
0693690NGNG
>>689
なぜfreadを薦めたのかわかった。
なるほどね(笑) よく>>688を読んだら分かった。
0694デフォルトの名無しさんNGNG
>>688
for(i = 0; i < 100; i++) {
  fgets(buf, sizeof buf, fp);
  for(j = 0; j < 40; j++) {
    sscanf(buf,"%d", a[i][j]);
  }
}
じゃ駄目なの?
0695684NGNG
>>693
皆様、レスありがとうございます。

でもfreadを使う方がいいのか分からない........。
0696デフォルトの名無しさんNGNG
>>695
何桁だろうとスペースで補って5文字なんだろ?
ならfread使えばいい。
0697684NGNG
>>696

fread使ったことがないですが、やってみます。
>>694
こちらの線も試してみます。

(Fortranはこういう時だけ便利なんだけどなあ。)
0698デフォルトの名無しさんNGNG
freadで5バイトずつ読みとってからatoiで数値にして変数に格納。これを40回繰り返してから改行文字を読み飛ばす。
という作業を100回繰り返せばよいのかな。
0699698NGNG
×5バイトずつ
○5バイト
0700684NGNG
>>698
改行文字を読み飛ばすのはどうするんですか?
0701デフォルトの名無しさんNGNG
>>700
fgetsとか・・・
まあ改行文字数分fseekしてもいいけど。
0702684NGNG
>>701
ありがとう。
やってみます。
0703698NGNG
あ、そうだ。
5バイト読みとったあとに終端に\0をつけないと。
最初にbuf[5]に\0を入れておいてもいいかな。
0704デフォルトの名無しさんNGNG
退屈です。仕事をください。
0705デフォルトの名無しさんNGNG
externのプロトタイプ宣言ってつけた場合とつけない場合とどう違うのですか?
extern宣言の場合、とあるプロジェクトのソース見たら引数が違ったのですが。
こんな感じで・・・
↓
---a.c---
extern int hoge();
---------
---b.c---
int hoge( int hoge ){...}
---------
0706デフォルトの名無しさんNGNG
memsetをつかうと警告で”プロトタイプ宣言の無い関数の呼び出し”
といわれてしまうのですが.........。
0707デフォルトの名無しさんNGNG
>>705
デフォルトでexternだからつけてもつけなくても同じ

>>706
string.hをインクルード
0708707NGNG
あくまでも「extern」を。だからね。
0709デフォルトの名無しさんNGNG
いくら欲しい?
0710デフォルトの名無しさんNGNG
ちなみにプロトタイプ宣言の引数リストが省略されると関数呼び出しでどんな引数リストにしてもコンパイルでひっかからないはず。
0711706NGNG
>>707>>710
ありがとう。スッキリしました。
0712bloomNGNG

http://www.leverage.jp/bloom/start3/
0713705NGNG
>>707
そうなんですか。ありがとです

>>710
そいつは初耳ですた。
0714デフォルトの名無しさんNGNG
おれの能力を100とすれば710の能力は30ぐらいだな。
0715デフォルトの名無しさんNGNG
C++厨がいる模様。
0716684NGNG
freadの使い方はなんとなくわかったのですが....。
横40、縦126に並んだ5桁ずつのデータをmallocで動的に確保
した3次元配列に格納しようとしています。
イメージとしてはx[i][j][k]です。

for(i=0 ; j<1 ; i++) {
for (j=0; j < 128 ; j++ ){ // セクター範囲ループ
fread(x,sizeof(int),40,fp1); // レーダー雨量の読み込み
printf("%d\n",x);
}
}

メモリの確保は成功しているようなのですが、読み込むときに
”メモリがreadになることは出来ませんでした"といわれます。
なぜでしょうか(T_T)。
0717684NGNG
>>716
コメント消し忘れた...鬱欝....。
0718デフォルトの名無しさんNGNG
> fread(x,sizeof(int),40,fp1)
fread(x[i][j],sizeof(int),40,fp1);

int x[2][128][40];
と仮定
0719684NGNG
>>718
多謝!多謝!
0720718NGNG
あれ?
int x[1][128][40];
か?
0721デフォルトの名無しさんNGNG
718は25くらいか
0722デフォルトの名無しさんNGNG
C++厨は可及的速やかに去ってください。
0723デフォルトの名無しさんNGNG
>>716
そのxは何?(^_^;)
0724684NGNG
>>720
本当は、i=720,j=128,k=40のデータなのです。
今は簡単のため、i=1にしています。

あっ!>>716は

for(i=0 ; j<1 ; i++) {

になってた。
これ

for(i=0 ; i<1 ; i++) {

欝鬱蔚....。
0725723NGNG
もしかして、xってint型?
freadの第一引数はvoid *だよ(^_^;)
0726デフォルトの名無しさんNGNG
>>716
一番外のループの判定はi使ってるよね?
0727684NGNG
>>723
忘れて下され......(汗)
0728デフォルトの名無しさんNGNG
多分freadの機能を勘違いしているんだと思う。
0729684NGNG
>>725
あ、私の勘違い。(xのデータの意味を聞かれているのかとおもった。)
え、ということは、型キャストかなにかしなければいけないのですか?
ネットで調べたら
double data[256];
fread( data, sizeof(double), 256, stream );
というように使ってあったのですが。

>>726
はい。iです。
0730デフォルトの名無しさんNGNG
>>729
いや、ポインタならいいんだけど、printfで%dなんてやっているからint型かと思った。
0731デフォルトの名無しさんNGNG
int x[720][128][40];
fread(x, sizeof(int), 720 * 128 * 40, fp1);
ひょっとしてこうか?
0732デフォルトの名無しさんNGNG
#include <stdio.h>
int count_bits(unsigned int x){
int count = 0;
while (x){
if (x & 1U) count++;
x>>=1;
}
return (count);
}
int int_bits(void){
return (count_bits(~0U));
}
void print_bits(unsigned int x){
int i;
for (i=int_bits() - 1;i >= 0; i--)
putchar(((x>>i) & 1U) ? '1' : '0');
}
int main (void){
unsigned int nx;
printf("非負の整数を入力してください:");
scanf("%u",&nx);
print_bits(nx);
putchar('\n');
return 0;}
// --------------------------------
上記のプログラムでunsigned なら動くのですが
unsigned int を全て int に変えると動きません。
エラーメッセージも出ないので無限ループか何かに入ってるようです
なぜだかわかりますか?
0733デフォルトの名無しさんNGNG
↓なんか、やってること変わってない?

684 :デフォルトの名無しさん :02/09/12 17:34
質問です。
横に40個並んだ数値データの列が100行あるデータファイルがあります。
データの一つ一つは5桁の整数で、これを配列に格納したいのです。
1 2 3 1 1.............(40個)
(100行)
0734732NGNG
ちなみに入力にはいづれの場合も正の整数を入力しています

環境は
コンパイラ:Borland C++
OS: Win2k
です
0735デフォルトの名無しさんNGNG
>>732
処理系によっては論理シフトが算術シフトになるから?
・・・・きっと的はずれなこと言っているな・・・・
0736684NGNG
>>730
ありがとう。
>>731
え、そうなるんですか?
改行されているのですが、freadは無視して読み込んでゆくのですか?
>>733
データの列は100⇒128になりました。
freadがよいというのでやって見ているのですが.....どうも
うまくゆきません。
0737デフォルトの名無しさんNGNG
>>736
freadで5文字分をchar型の配列に読み込んでからatoiで変換するんだってば。
0738デフォルトの名無しさんNGNG
>>735
多分そう。
>>732
count_bits() のループ内で、x の値がどう変わっていくか調べると判ると思う。
0739デフォルトの名無しさんNGNG
最初にfreadを薦めた人の考えは、
「一行の構造が決まっているから、改行文字以前の部分は
一気に固定長の文字配列に読み込んでから変換すればいい」
って事だと思う。

それがなぜか、intの多次元配列に直接読み込んでる。
ご冗談を。。
0740684NGNG
>>737
>>739
ああ、ワカリマスタ.....。
有難う、やってみます。

当方Fortran厨だったもので、Cの文字列の扱いがどうにも
苦手です。ただただ、データファイルの整数値を読みたいだけ
なのですが(涙)Fortranなら
 read(fp1,'40d5') a[i][i][k] k=1,40
でスミマスのに.......。
0741デフォルトの名無しさんNGNG
C の 無 能 さ が ま た 証 明 さ れ ま し た
0742684NGNG
>>741
いえ、私が無能なだけです(鬱
0743デフォルトの名無しさんNGNG
739は28だな。
0744デフォルトの名無しさんNGNG
char buf[40 * 5 + 1];
buf[40 * 5] = '\0'; // 末尾に車止め
...
for (i =...
  for (j =...
    fread(buf, sizeof(char), 40 * 5, fp1); // 5桁が40個
    for (k = 0; k < 40; k++)
      x[i][j][k] = atoi(buf[k * 5]);
...
こういう意味だよね?
0745デフォルトの名無しさんNGNG
いや、>>28は俺だ。
0746デフォルトの名無しさんNGNG
>>743 26ですが、何か
0747デフォルトの名無しさんNGNG
間違えた
> x[i][j][k] = atoi(buf[k * 5]);

x[i][j][k] = atoi(buf + k * 5);
または
x[i][j][k] = atoi(&buf[k * 5]);
0748デフォルトの名無しさんNGNG
でもまてよ、5桁の最上位が必ず空白であると仮定しているんだけど、
これって本当かな
0749744=747 NGNG
改行の読み飛ばしは適当にやってね
0750デフォルトの名無しさんNGNG
>>748
仮定してないでしょ?
10000以上の数だったら空白はないはず。
0751デフォルトの名無しさんNGNG
>>750
そか、じゃあ、5文字ずつやんなきゃ駄目だね。
0752684NGNG
>>744>>747
あ、なんか動き出しました。
いけそうな予感がします。
しかし”車止め"ってのは一体...。
>>748
実はそうなんです。
0753デフォルトの名無しさんNGNG
でも正直、「何も考えずにscanf(系)を使え」が正解だと思うのだが
0754デフォルトの名無しさんNGNG
>>752
ん?ということはある数をxとして、0 <= x <=9999か?
0755デフォルトの名無しさんNGNG
>>752
ありゃそうなのか。じゃああとは、改行の読み飛ばしだけか。
0756デフォルトの名無しさんNGNG
>>752
「車止め」というか null terminator とか何とかいうんだけど、
C言語の文字列は、末尾に 0 コードが入っていないといけない
0757デフォルトの名無しさんNGNG
753は10ってとこだな。
0758684NGNG
>>753
私も初めは
fscanf(fp,"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d\n",a[i][j][1],a[i][j][2].....);
考えましたが、これはあまりにも......。
>>754
整数値はせいぜい3桁どまりです。

0759 NGNG
車止め・・・・、初めて聞いた。
どこか地方の方言?
0760732NGNG
>>735
>>738
なるほど、今助言から調べてみましたが
そうでした
ありがとうございました
0761デフォルトの名無しさんNGNG
番兵ちゃうのん?
0762デフォルトの名無しさんNGNG
あんまり関係ないけど、
char (*token)[5] = buf;
という、5文字単位に切り直したポインタを使うと、
> x[i][j][k] = atoi(&buf[k * 5]);
これが
x[i][j][k] = atoi(token[k]);
となって、見やすいかもしれない。。。けどどうでもいいな、こりゃ

scanfマンセー
0763デフォルトの名無しさんNGNG
東京は雨が降ってきたみたいです。
このスレは雨天休業です。
0764デフォルトの名無しさんNGNG
>761
ちゃう
0765732NGNG
いややっぱり違うっぽいです
#include <stdio.h>
int main (void){
int x;
printf("非負の整数を入力してください:");
scanf("%d",&x);
x >>=5;
int i;
for (i=32-1 ;i >= 0; i--) // intは32bit
putchar(((x>>i) & 1U) ? '1' : '0');
putchar('\n');
return 0;
}
これを実行してみたところ(値は5ぐらいを代入)
全て0になりました。算術シフトはされていないようです。
0766デフォルトの名無しさんNGNG
764は8か
0767732NGNG
intの右シフトが算術シフトなら
上位ビットは1になるはずですよね?
しかも代入している値は正の数ばかりですので
最上位ビットも1ではありません。

どなたか間違いのわかるかた
よろしくお願いします
0768デフォルトの名無しさんNGNG
http://chijiwa.ne.jp/yaboo/siseki/daimon/daimon_ue.JPG
車止め
0769デフォルトの名無しさんNGNG
>765
たぶんそこじゃなくて count_bits() 関数のことを言ってたんだと思うけど......
0770デフォルトの名無しさんNGNG
>>767
いくつかあるループのうち、どこで無限ループになるのか書いてくれればバグの発見も早いわけだが。
0771デフォルトの名無しさんNGNG
> scanf("%d",&x);
> x >>=5;

えっと、32より小さな値は無視?
0772デフォルトの名無しさんNGNG
あ、64かな
0773デフォルトの名無しさんNGNG
LEAVE命令とFPOデータではどのくらい処理速度が変わってくるのでしょうか。
概算でいいので教えていただけないでしょうか。
0774デフォルトの名無しさんNGNG
>>773
そんな命令(?)がCにあったっけ?
0775732NGNG
>>769
x>>=1; の部分ですか?
それならこの方法でもわかると思いますが違うのでしょうか?

>>770

ちょっと試してみます
0776732NGNG
>>771
右シフトすると上位が1になるか確かめるためです
とりあえず右にシフトしたかっただけで
5自体に特別な意味はありません
0777デフォルトの名無しさんNGNG
>>732
↓これの

int count_bits(unsigned int x){
int count = 0;
while (x){
if (x & 1U) count++;
x>>=1;
}

int cout_bits(unsigned int x)
を
int count_bits(int x)
にすると無限ループになるって話じゃないのかな(わかんないけど)?
0778732NGNG
>>769
count_bits 関数のことでした
なぜここだけint にすると問題が出るのでしょう?
わからないです
0779デフォルトの名無しさんNGNG
FILE *fp;
int i,j,k;
int x[1][128][40];

fp = fopen("filename", "r");

for(i=0; i<1; i++)
for(j=0; j<128; j++)
for(k=0; k<40; k++)
fscanf(fp, "%d", &x[i][j][k]);

fclose(fp);

0780732NGNG
>>777
そうです。そのとおりですが何がおかしいのかわかりません
0781デフォルトの名無しさんNGNG
算術シフトって、
「シフトすると最上位ビットが1になる」んじゃなくて、
「シフトしても最上位ビットは変わらない」だと思うが。

「算術シフトはされていない」という言葉の意味がわからなかったので、
よく読まずに書いてみるテスト
0782デフォルトの名無しさんNGNG
int型を受け取るcount_bitsにINT_MAXよりも大きな値を渡したら無限ループにならない?
0783デフォルトの名無しさんNGNG
>732
>>777 だけど、
x には 111.....111 が渡されるから
これをいくら算術シフトしても111....111のままで無限ループ
0784732NGNG
確か算術シフトは最上位ビットで
シフトして動かした部分が埋め尽くされることだったと思います

>>777
での unsigned を除くとエラーがでることが不明です。。
■ このスレッドは過去ログ倉庫に格納されています