C言語なら、俺に聞け! <31>
■ このスレッドは過去ログ倉庫に格納されています
0001SHOW-A息子
NGNGいろいろな言語を極めたが、一番漏れになじんだのはCだった。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。
便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。あと、至急父に仕事を与えてやってください。
コンパイラ、過去ログなどのリンクは>>2-5 あたり
0685デフォルトの名無しさん
NGNG0686デフォルトの名無しさん
NGNG一行に確実に40個数字があるの?それぞれの区切り文字は半角スペース?
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNG数字は確実にあります。Fortranから吐かれたでーたで、半角スペースも
1桁とかぞえて、5桁です。
^^^24^^^12^^^^1.......
(^は半角スペースのつもり)
fscanf(fp,"%d%d%d%d.........(40個ならべ、それぞれ変数に格納しる)
というしかてがないのでしょうか?
0689デフォルトの名無しさん
NGNG俺ならfreadを使う。それとatoi系の関数。
0690デフォルトの名無しさん
NGNGfgetsとstrtolの方がよくない?多分strtolは数字のあとの空白で変換を終えてくれるとおもうから。
0691690
NGNG0694デフォルトの名無しさん
NGNGfor(i = 0; i < 100; i++) {
fgets(buf, sizeof buf, fp);
for(j = 0; j < 40; j++) {
sscanf(buf,"%d", a[i][j]);
}
}
じゃ駄目なの?
0695684
NGNG皆様、レスありがとうございます。
でもfreadを使う方がいいのか分からない........。
0696デフォルトの名無しさん
NGNG何桁だろうとスペースで補って5文字なんだろ?
ならfread使えばいい。
0698デフォルトの名無しさん
NGNGという作業を100回繰り返せばよいのかな。
0699698
NGNG○5バイト
0700684
NGNG改行文字を読み飛ばすのはどうするんですか?
0701デフォルトの名無しさん
NGNGfgetsとか・・・
まあ改行文字数分fseekしてもいいけど。
0702684
NGNGありがとう。
やってみます。
0703698
NGNG5バイト読みとったあとに終端に\0をつけないと。
最初にbuf[5]に\0を入れておいてもいいかな。
0704デフォルトの名無しさん
NGNG0705デフォルトの名無しさん
NGNGextern宣言の場合、とあるプロジェクトのソース見たら引数が違ったのですが。
こんな感じで・・・
↓
---a.c---
extern int hoge();
---------
---b.c---
int hoge( int hoge ){...}
---------
0706デフォルトの名無しさん
NGNGといわれてしまうのですが.........。
0708707
NGNG0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNG0712bloom
NGNGhttp://www.leverage.jp/bloom/start3/
0714デフォルトの名無しさん
NGNG0715デフォルトの名無しさん
NGNG0716684
NGNG横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)。
0717684
NGNGコメント消し忘れた...鬱欝....。
0718デフォルトの名無しさん
NGNGfread(x[i][j],sizeof(int),40,fp1);
int x[2][128][40];
と仮定
0719684
NGNG多謝!多謝!
0720718
NGNGint x[1][128][40];
か?
0721デフォルトの名無しさん
NGNG0722デフォルトの名無しさん
NGNG0723デフォルトの名無しさん
NGNGそのxは何?(^_^;)
0724684
NGNG本当は、i=720,j=128,k=40のデータなのです。
今は簡単のため、i=1にしています。
あっ!>>716は
for(i=0 ; j<1 ; i++) {
になってた。
これ
for(i=0 ; i<1 ; i++) {
欝鬱蔚....。
0725723
NGNGfreadの第一引数はvoid *だよ(^_^;)
0726デフォルトの名無しさん
NGNG一番外のループの判定はi使ってるよね?
0727684
NGNG忘れて下され......(汗)
0728デフォルトの名無しさん
NGNG0729684
NGNGあ、私の勘違い。(xのデータの意味を聞かれているのかとおもった。)
え、ということは、型キャストかなにかしなければいけないのですか?
ネットで調べたら
double data[256];
fread( data, sizeof(double), 256, stream );
というように使ってあったのですが。
>>726
はい。iです。
0730デフォルトの名無しさん
NGNGいや、ポインタならいいんだけど、printfで%dなんてやっているからint型かと思った。
0731デフォルトの名無しさん
NGNGfread(x, sizeof(int), 720 * 128 * 40, fp1);
ひょっとしてこうか?
0732デフォルトの名無しさん
NGNGint 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デフォルトの名無しさん
NGNG684 :デフォルトの名無しさん :02/09/12 17:34
質問です。
横に40個並んだ数値データの列が100行あるデータファイルがあります。
データの一つ一つは5桁の整数で、これを配列に格納したいのです。
1 2 3 1 1.............(40個)
(100行)
0734732
NGNG環境は
コンパイラ:Borland C++
OS: Win2k
です
0735デフォルトの名無しさん
NGNG処理系によっては論理シフトが算術シフトになるから?
・・・・きっと的はずれなこと言っているな・・・・
0736684
NGNGありがとう。
>>731
え、そうなるんですか?
改行されているのですが、freadは無視して読み込んでゆくのですか?
>>733
データの列は100⇒128になりました。
freadがよいというのでやって見ているのですが.....どうも
うまくゆきません。
0737デフォルトの名無しさん
NGNGfreadで5文字分をchar型の配列に読み込んでからatoiで変換するんだってば。
0738デフォルトの名無しさん
NGNG多分そう。
>>732
count_bits() のループ内で、x の値がどう変わっていくか調べると判ると思う。
0739デフォルトの名無しさん
NGNG「一行の構造が決まっているから、改行文字以前の部分は
一気に固定長の文字配列に読み込んでから変換すればいい」
って事だと思う。
それがなぜか、intの多次元配列に直接読み込んでる。
ご冗談を。。
0740684
NGNG>>739
ああ、ワカリマスタ.....。
有難う、やってみます。
当方Fortran厨だったもので、Cの文字列の扱いがどうにも
苦手です。ただただ、データファイルの整数値を読みたいだけ
なのですが(涙)Fortranなら
read(fp1,'40d5') a[i][i][k] k=1,40
でスミマスのに.......。
0741デフォルトの名無しさん
NGNG0742684
NGNGいえ、私が無能なだけです(鬱
0743デフォルトの名無しさん
NGNG0744デフォルトの名無しさん
NGNGbuf[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デフォルトの名無しさん
NGNG0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
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これって本当かな
0749744=747
NGNG0750デフォルトの名無しさん
NGNG仮定してないでしょ?
10000以上の数だったら空白はないはず。
0751デフォルトの名無しさん
NGNGそか、じゃあ、5文字ずつやんなきゃ駄目だね。
0753デフォルトの名無しさん
NGNG0754デフォルトの名無しさん
NGNGん?ということはある数をxとして、0 <= x <=9999か?
0755デフォルトの名無しさん
NGNGありゃそうなのか。じゃああとは、改行の読み飛ばしだけか。
0756デフォルトの名無しさん
NGNG「車止め」というか null terminator とか何とかいうんだけど、
C言語の文字列は、末尾に 0 コードが入っていないといけない
0757デフォルトの名無しさん
NGNG0758684
NGNG私も初めは
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桁どまりです。
0761デフォルトの名無しさん
NGNG0762デフォルトの名無しさん
NGNGchar (*token)[5] = buf;
という、5文字単位に切り直したポインタを使うと、
> x[i][j][k] = atoi(&buf[k * 5]);
これが
x[i][j][k] = atoi(token[k]);
となって、見やすいかもしれない。。。けどどうでもいいな、こりゃ
scanfマンセー
0763デフォルトの名無しさん
NGNGこのスレは雨天休業です。
0764デフォルトの名無しさん
NGNGちゃう
0765732
NGNG#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デフォルトの名無しさん
NGNG0767732
NGNG上位ビットは1になるはずですよね?
しかも代入している値は正の数ばかりですので
最上位ビットも1ではありません。
どなたか間違いのわかるかた
よろしくお願いします
0769デフォルトの名無しさん
NGNGたぶんそこじゃなくて count_bits() 関数のことを言ってたんだと思うけど......
0770デフォルトの名無しさん
NGNGいくつかあるループのうち、どこで無限ループになるのか書いてくれればバグの発見も早いわけだが。
0771デフォルトの名無しさん
NGNG> x >>=5;
えっと、32より小さな値は無視?
0772デフォルトの名無しさん
NGNG0773デフォルトの名無しさん
NGNG概算でいいので教えていただけないでしょうか。
0774デフォルトの名無しさん
NGNGそんな命令(?)がCにあったっけ?
0776732
NGNG右シフトすると上位が1になるか確かめるためです
とりあえず右にシフトしたかっただけで
5自体に特別な意味はありません
0777デフォルトの名無しさん
NGNG↓これの
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)
にすると無限ループになるって話じゃないのかな(わかんないけど)?
0778732
NGNGcount_bits 関数のことでした
なぜここだけint にすると問題が出るのでしょう?
わからないです
0779デフォルトの名無しさん
NGNGint 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);
0780732
NGNGそうです。そのとおりですが何がおかしいのかわかりません
0781デフォルトの名無しさん
NGNG「シフトすると最上位ビットが1になる」んじゃなくて、
「シフトしても最上位ビットは変わらない」だと思うが。
「算術シフトはされていない」という言葉の意味がわからなかったので、
よく読まずに書いてみるテスト
0782デフォルトの名無しさん
NGNG0783デフォルトの名無しさん
NGNG>>777 だけど、
x には 111.....111 が渡されるから
これをいくら算術シフトしても111....111のままで無限ループ
0784732
NGNGシフトして動かした部分が埋め尽くされることだったと思います
>>777
での unsigned を除くとエラーがでることが不明です。。
■ このスレッドは過去ログ倉庫に格納されています