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

C言語なら俺に開け! Part 〈54〉

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

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

コンパイラを探しているなら >>2-13 を。

上記を逸した場合の結果は激しく未定義だゴルァ!!

  ∧_∧
 ( ´∀`)< ぬるぽ

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
0153デフォルトの名無しさんNGNG
>>152
sprintf
0154デフォルトの名無しさんNGNG
>>153
サンクス
0155141NGNG
レスどうもでした。
>>142さんの方法で無事解決です。

総ツッコミ受けているように明らかに酷いソースなんですが、自分の環境下で一回満足に
動けばそれでいいというものなのでこんな感じに・・・。こういう場合でもちゃんと作るべき?
0156デフォルトの名無しさんNGNG
>>155=141
そういうときはawkでも使うのが無難。
cで書くにしても、普段からちゃんと書く癖をつけておけばバグが減ると言うものです。
0157デフォルトの名無しさんNGNG
typedef struct CELL *LIST;
struct CELL {
int element;
LIST next;
};
これを用いて
整数のリストを引数とする
再帰的な選択ソートのプログラムを教えてくれませんか?
0158デフォルトの名無しさんNGNG
C/C++の宿題やらせてください。おながいします
http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
0159157NGNG
すいません。書き込むとこ間違えました。
0160デフォルトの名無しさんNGNG
代入が起るときは
代入先の変数の型に自動で変換される ってことは
イメージ的には代入元を代入先の型にキャストした値が
代入されると考えて良いでしょうか?
0161デフォルトの名無しさんNGNG
型格上げできる組合せは限られてるわけだが、許される組合せに関して言えば
それでいい。
0162160NGNG
>>161 助言ありがとうございました。安心できました。
0163デフォルトの名無しさんNGNG
計算方法がわかりません。

int value1 = 800000;
double value2 = 0.000000125;

として、

printf("result = %d\n", (int)((double)value1 * value2));

とすると、結果は1とならず0となります。
なぜ1にならないのでしょうか?
0164デフォルトの名無しさんNGNG
>>163
800000*0.000000125=0.1ですよ。。。
0165デフォルトの名無しさんNGNG
>>164
あ、8000000でした。すみません。

関係ないけど、スレタイ「開け」になってるね。
0166デフォルトの名無しさんNGNG
>>165
知らなかったよ(TT)
0167163NGNG
同じ計算を0.1×10と行って1桁ずつ増やしていったら
tmp1 = 0.000001;
tmp2 = 1000000;
の時点で結果が0になってしまった。
キャストの問題でしょうか?
0168デフォルトの名無しさんNGNG
http://www.geocities.co.jp/Playtown-Denei/4338/Cprint.html
0169デフォルトの名無しさんNGNG
浮動小数点演算がぴったり整数値になると思っちゃイヤン
0170デフォルトの名無しさんNGNG
>>167
gccだと最適化の程度によって答えが変わる罠。

冗談はさておき、小数の方が2の負のべき乗になっていないために
演算精度の関係で積が(1に極近い)1未満になっていると思われ。
最適化を強くすると事前に積を求めてしまうのでイミディエイトの1になってしまう。

というわけで、キャストのときは精度に注意しましょう。
0171デフォルトの名無しさんNGNG
>>168
そのごみのようなページは何?
0172163NGNG
>>170
具体的にどうキャストすれば、int型で出力できるでしょうか?
0173デフォルトの名無しさんNGNG
>>163

>printf("result = %d\n", (int)((double)value1 * value2));
を
printf("result = %d\n", (int)((double)value1 * value2 + 1e-10));
とでもしてみたら?
0174163NGNG
>>173
1e-10で帳尻が合うのでしょうが、なんか納得いかないです。
すみません。
一旦変数に入れるしか方法は無いかもしれないですね。
0175デフォルトの名無しさんNGNG
%gで1になった・・・
0176デフォルトの名無しさんNGNG
0.000001→double からすでに劣化してるしな・・
0177デフォルトの名無しさんNGNG
>>163
実数演算を厳密にやろうとしたら常に精度に注意を払わないといけなくなる。
例えば、0.1を10回足しても1にはならないという現象も出てくる。
10進数の小数を2進数で表現する以上、避けては通れない道だと思うしか。
0178デフォルトの名無しさんNGNG
>>175
%gだと高々6桁程度の精度で丸めるからな。
>>176
そだね。
逆に、2^(-12)は劣化しないけど。
0179163NGNG
int main(void)
{
int value1 = 8000000;
double value2 = 0.000000125;
double result;

result = (double)value1 * value2;

printf("result = %d\n", (int)result);

}

結局こうしてみました。

>>175
int型で表現したかったので、すみません。。説明不足でした。
>>177
そうですね。今後気をつけます。

皆様ありがとうございました。
0180デフォルトの名無しさんNGNG
単にintにキャストじゃなくて、近い整数に丸めてからの方が安心。
rintかround。
0181デフォルトの名無しさんNGNG
そうそう。intにするときは「丸めない」からね。xx.yyy...という数のxxの
部分をintに入れるだけだよ。だから179のコードでも結果は同じだと思う。
0182デフォルトの名無しさんNGNG
>>179 で解決する理由がわかりません。
単に他の変数に放り込んだだけのように見えます。
本質的に >>163 とどう違うのか、誰か教えてください。
0183デフォルトの名無しさんNGNG
IntelCPU系だと、内部演算の精度がdouble以上あるから
一旦doubleの変数への丸めが入る段階で巧くいくこともある。
勿論、巧くいかないこともあるからεを足す工夫は必要。

round()を使ってもいいが、(int) (double値 + 1e-15)でも充分。
0184デフォルトの名無しさんNGNG
つか、>>163が"%d"で書こうとしていたところを見ると、この乗算結果が
数学的には整数になることが元々予測できてたんじゃないか?
技術系の計算ではたまにあるよね、そういうこと。
そういったシチュエーションだったら、1.e-10とか1.e-15とかいう半端な数を
突然持ち出すより、いっそ「四捨五入」という意味で、
  (int)(double値 + 0.5)
とする方がスッキリ納得してもらえるんじゃない?
0185デフォルトの名無しさんNGNG
質問。
#define fname "data.txt"
....
strcat(buf,fname"がないよ");*/strcpyでも良い/*
....

という第2引数書き方はC言語的にやって良いのでしょうか?
文字列の扱いはあまりよくわからないので・・・。
0186デフォルトの名無しさんNGNG
突込み所満載だな。

文字列は、"abc" "def"のように書くと"abcdef"と解釈される。
なので、
fname "がないよ"は問題なし。
しかし、
・define名は大文字にするのが一般的
・コメントの書き方が変
・一般的にstrcpy()でもstrcat()でもいいなんてことはないはず
・もしそうだとしたらどこかに無駄があるかもしれない
・そもそもsprintf()を使うほうが無難なケースなのかもしれない

とまぁ、このくらい書いておけば後で誰か突っ込んでくれるだろう。
0187デフォルトの名無しさんNGNG
> ・define名は大文字にするのが一般的
これだけ、他のつっこみとレベルがちとズレてるな
とチャチャ入れ
0188デフォルトの名無しさんNGNG
>>185

char sz[] = {"/*
#define fname "data.txt"
....
strcat(buf,fname"がないよ");*/strcpyでも良い/*
....
*/"};

こんな感じになってるなら問題ない。
0189185NGNG
>186
thx! 謎が解けました。
コメントはこのスレ用に書いたものだったけど、どうもやり方間違えたようですな。
sprintfでも良かったんですけど、使ったことの無いやつを試してみたかったのです。(汗
ともあれ、ありがとうございました。
0190デフォルトの名無しさんNGNG
>>188
ありありだろ(w
0191デフォルトの名無しさんNGNG
おおありなごやはしろでもつ
0192デフォルトの名無しさんNGNG
伊勢は津でもつ津は伊勢でもつ
0193デフォルトの名無しさんNGNG
charの練習で以下の文をつくりますた
void change(char* a){
 a = "AAAAAAAAAAAAAAAAAA";
}
int main(){
 char *test1;
 test1 ="HelloWorld.";
 change(test1);
 printf("test1 : %s\n", test1);
 return 0;
}

test1の内容を"AAAAAAAAAAAAAAAAAA"
に変えようとしてるのですが"HelloWorld."
のままです。
なんででしょう?

0194デフォルトの名無しさんNGNG
>>193
void change(char** a){
 *a = "AAAAAAAAAAAAAAAAAA";
}
int main(){
 char *test1;
 test1 ="HelloWorld.";
 change(&test1);
 printf("test1 : %s\n", test1);
 return 0;
}
0195デフォルトの名無しさんNGNG
>>194
それだと動きました。どうもです。
でも、どうしてポインタが2つも必要なんでしょう?
0196デフォルトの名無しさんNGNG
>>195
ポインタ変数に書き込んでもらう必要があるから。

int 変数に書き込んでもらうには...

void change(int *x){
 *x = 123;
}

int main(){
 int a;
 a = 0;
 change(&a);
 ...
}

とするのと同じ。
今回は、たまたまポインタ変数だったから 間接演算子 '*' が2個並ぶ。
0197C初心者NGNG
本当に超初心者的な質問で申し訳ないのですが、神の方教えて下さい。
appleを入力した数の分だけ表示させるというプログラムを作ろうと
思って下のようなソースを書いたのですが、実行すると
no newline at end of fileと出ます。何処がおかしいのでしょうか?
間違ってる箇所がどうしても見つからないので分る方ご教授下さい。
ちなみにコンパイラはgccでCygwinで実行してます。他のソースを実行する
際は問題は起きてません。

#include <stdio.h>
main()
{
int a , b ;
scanf("%d" , &a);
for( b = 0 ; b < a ; b++ )
printf("apple ");
}
0198デフォルトの名無しさんNGNG
>>197
最後に改行でもいれておあげ。
0199デフォルトの名無しさんNGNG
>>197
最後に改行を加える。
0200デフォルトの名無しさんNGNG
なんで最後に改行が無いとwarningになるの?
0201デフォルトの名無しさんNGNG
>>200
ハッカーは改行で終わっていないと気持ち悪くなるらしいです。
0202デフォルトの名無しさんNGNG
>>201
それだけの理由なの!?
0203C初心者NGNG
198,199の方々の神に感謝。
きちんと実行できますた。
こんなくだらないことで2時間も延々と迷ってた自分が恥ずかしくなりました。
やっぱり基礎知識は重要ですね。本当今日が今までで一番2チャンが有効活用できますた。
0204201NGNG
>>202
規格で改行で終わっていなければならないと決められているから。とこのスレか前スレで誰かが書き込んでいたけど、本当かどうかは知らない。
0205デフォルトの名無しさんNGNG
if(ferror(fin)) perror(NULL);
としたいのですが、ferror() によって errnoが書き換えられる事はないのでしょうか?
0206デフォルトの名無しさんNGNG
ない
0207デフォルトの名無しさんNGNG
>>204
ファイルの終了を想定しているのか?
0208デフォルトの名無しさんNGNG
>>203
別に改行いれなくても実行できるっしょ
0209デフォルトの名無しさんNGNG
C そのものはフリーフォーマットでも、プリプロセッサは行処理するから・・・とか?
0210デフォルトの名無しさんNGNG
ホワイトスペースの文字コード(isspaceが真を返す範囲)を得るにはどうしたらよいですか?
# setlocale 対応で
0211デフォルトの名無しさんNGNG
char ch[256];
for( i = 0; i<255; i++) ch[i] = isspace(i);
でとれる。
0212デフォルトの名無しさんNGNG
なんで255を除くの?
0213デフォルトの名無しさんNGNG
>>212
255は、どのロケールでもisspaceで真にならないから。


とボケてみる。
0214デフォルトの名無しさんNGNG
夜分すいません。
WinXP,BCC32で、
--------------------
#include <stdio.h>
void main(void){
char str[15]="abcdefghijk";
int *p;
p=str;
putchar(*p);
putchar(*(p+1));
putchar(*(p+2));
putchar('\n');
}
--------------------
解説書ではabcと出力されるとあるのですが、aeiと出力されました。
変数を変えて+3,+4にしても1ずれるはずのものが4づつずれます。
4飛びになってしまうのはなぜなのでしょう?
0215デフォルトの名無しさんNGNG
それは p が int* だからです。
char* p にすればよろし。
理由は自分で調べれ...
0216デフォルトの名無しさんNGNG
>>215
手がかりThx.
お礼に何か差し上げたいところですが何も無いので跳躍します。
0217デフォルトの名無しさんNGNG
C言語ってなんですか?
どこかの国の言葉ですか?
エスペラントみたいな?
0218デフォルトの名無しさんNGNG
とりあえず名前すらも知らんやつはプログラマじゃないな
0219デフォルトの名無しさんNGNG
>>217
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 | 1点!!!!    |
 |_________|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
 \ (___ノ
0220デフォルトの名無しさんNGNG
配列を使って縦50、横6で数字を0から並べたいのですがどうすればよろしいでしょうか?
0221デフォルトの名無しさんNGNG
>>220
配列にタテヨコはないが、二次元配列を使えばいい。
0222デフォルトの名無しさんNGNG
ありがとうございます、二次元配列を使って作っているのですが、どうも・・うまく動かないのです。
0223デフォルトの名無しさんNGNG
>>222
ソース晒しキボンヌ
0224デフォルトの名無しさんNGNG
# define MAX_ROWS 6
# define MAX_COLS 50
#include <stdio.h>
int main()
{
int table [MAX_ROWS][MAX_COLS];
int x;
int y;
for (x= 0; x<MAX_ROWS; x++)
for (y= 0; y<MAX_COLS; y++)
{
printf("%d ", table[MAX_ROWS][MAX_COLS]);

}
fflush(stdin);
getchar();

}



超初心者ですみません。
0225デフォルトの名無しさんNGNG
>>224
#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>
int main()
{
  int table [MAX_ROWS][MAX_COLS];
  int x, y;
  for (x= 0; x<MAX_ROWS; x++) {
    for (y= 0; y<MAX_COLS; y++) {
      printf("%d ", table[MAX_ROWS][MAX_COLS]);
    }
    printf("\n");
  }
  return 0;
}
0226デフォルトの名無しさんNGNG
table[MAX_ROWS][MAX_COLS]は
table[x][y]でしょ。
0227デフォルトの名無しさんNGNG
tableに代入してないよ?
0228デフォルトの名無しさんNGNG
二つのfor文が上下逆さじゃない?
0229デフォルトの名無しさんNGNG
>>223
#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>

int main(){
int table [MAX_ROWS][MAX_COLS];
int a=0,x,y;

while(a<300){
for(y=0;y<MAX_COLS;y++){
for(x=0;x<MAX_ROWS;x++){
table[x][y]=a;
a++;
printf("%d ",table[x][y]);
}
printf("\n");
}
}
return 0;
}

汚いけど...
0230デフォルトの名無しさんNGNG
>>229
ありゃ?これで...

#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>

int main(){
int table [MAX_ROWS][MAX_COLS];
int a=0,x,y;

while(a<300){
for(y=0;y<MAX_COLS;y++){
for(x=0;x<MAX_ROWS;x++){
table[x][y]=a;
a++;
printf("%d ",table[x][y]);
}
printf("\n");
}
}
return 0;
}
0231デフォルトの名無しさんNGNG
>>229,>>230
だめぽ...
0232デフォルトの名無しさんNGNG
>>231
while{}は不要。
xとyの二重ループで300回じゃん。
0233デフォルトの名無しさんNGNG
皆さんありがとうございます。難しいですね、プログラミングって
0234デフォルトの名無しさんNGNG
プログラミングは積み重ねだからね。

あ、こういう質問は宿題スレのほうがいいかも。
宿題じゃなくても。
0235デフォルトの名無しさんNGNG
>>232
そういえばそうですね
0236デフォルトの名無しさんNGNG
別に配列使わなくてもループだけでいいのでは。
0237喧嘩王 ◆52.FsIEe7o NGNG
for(y=0;y<MAX_COLS;y++){
  for(x=0;x<MAX_ROWS;x++){
    table[x][y]=a++;
    printf("%d ",table[x][y]);
  }
  printf("\n");
}
プ━( ´,_ゝ`)━( ´,_ゝ)━( ´,_)━( ´,)━( )━m9( ゚,_ゝ゚)プッ!!
0238デフォルトの名無しさんNGNG
>>236
配列使ったのは、たぶんあとで拡張するために。

>>237
%3d にするとケタがそろうよ。
0239デフォルトの名無しさんNGNG
%3dを使うとなぜ桁がそろうようになるのですか?
0240山崎渉NGNG
(^^)
0241デフォルトの名無しさんNGNG
>>239
へるぷ嫁
0242デフォルトの名無しさんNGNG
アドレスからそのアドレスに割り当てられている変数名(文字列)が
取得したのですがどうすればいいですか?

int a;
int b;
int c;
:
:
printf("a=%d",a);
printf("b=%d",b);
printf("c=%d",c); ←こいつらをLOOPさせて1行にできないか?
0243デフォルトの名無しさんNGNG
printf("a=%d b=%d c=%d", a, b, c);
0244デフォルトの名無しさんNGNG
printf("c=%d ", c, printf("b=%d ", b,printf("a=%d ", a)));
0245242NGNG
実際はa,b,cの3種類ではなくて
1万個ぐらいの変数(!=配列)があるんです。
1万行のprintfを書くかしかないのか・・・
0246デフォルトの名無しさんNGNG
設計を見直せ
0247デフォルトの名無しさんNGNG
環境依存で良ければ、int i, a=1, b=2, c=3, *p;
if(a<c)p=&a;
else p=&c;
for(i=0;i<3;i++)
printf("%d ", *(p+i));
0248デフォルトの名無しさんNGNG
>>247 それは何のジョークでつか?
0249デフォルトの名無しさんNGNG
1万もの変数って何の変数?
0250デフォルトの名無しさんNGNG
つうかマルチポストうざい
0251デフォルトの名無しさんNGNG
1マンコぐらいの変数でがたがた言ってる奴って
大規模システムの開発とかやったことないんじゃねぇの?プッ
0252デフォルトの名無しさんNGNG
int i;
while((i = getchar()) != EOF)
printf("printf(\"%c=%%d\",%c)", i, i);

でコードの自動生成はどうだ?
■ このスレッドは過去ログ倉庫に格納されています