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

C言語のことは漏れらに聞け!!<40>

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C 言語ならオレに訊け。

C 言語じゃないなら訊くな。
問題をちゃんと切り分けて、C の話かそうでないか洗ってから質問してくれ。

つーか訊く前に Web で検索しろ。

コンパイラ探してるなら >>2 を見れ。

GUI とか、C 標準でできない事の質問は使ってる開発環境のスレに逝ってくれ。
ソース丸投は別スレがあるから他に逝ってくれ。
宿題は別スレがあるから他に逝ってくれ。
書籍については別スレがあるから他に逝ってくれ。

・前スレ <39>
http://pc3.2ch.net/test/read.cgi/tech/1036409391/

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/
0232225NGNG
>>231
いいから答えてくれ!
230に!
0233デフォルトの名無しさんNGNG
>>230

コンパイラにも拠るが、出力されるアセンブラコードが違うことはあるよ。
どっちも結果的な動作は同じなのでバグは発生しないはずだが。
基本的に a /= 2 と書いたほうが速いまたは変わらないはず、
なのだが俺は分かりやすいほうがいいと思うので a = a / 2 派。
0234デフォルトの名無しさんNGNG
c=a=a/2;
は
c=a/=2;
にはできなったとおもいます。
0235デフォルトの名無しさんNGNG
>>なのだが俺は分かりやすいほうがいいと思うので a = a / 2 派。
プ(w
0236デフォルトの名無しさんNGNG
>>234
日本語喋れやザルが
0237デフォルトの名無しさんNGNG
7゚{vv
0238225NGNG
>>233
だよね!やべーよ!このソース!
#include <stdio.h>

int main(void)
{
  unsigned long a,k,k_max=0,y,y_max=0;
  unsigned long data[99];
  for(y=1;y<=100;y++){
    a=y;
    k=0;
    while(a>1){
      if(a%2==0){
        a=a/2;
        k++;
      }
      else{
        a=a*3+1;
        k++;
      }
    }
    data[y-1]=k;
  }
  
0239225NGNG
  for(y=101;y<1000000;y++){
    a=y;
    k=0;
    while(a>1){
      if(a<=100){
        k+=data[a-1];
        break;
      }
      if(a%2==0)
      {
        a=a/2;
        k++;
}
else
{
a=a*3+1;
k++;
}
}

if(k>k_max)
{
k_max=k;
y_max=y;
}
}

printf("対象値が%dのとき計算回数の最大値は%dです。\n",y_max,k_max);

return(0);
}
0240225NGNG
ある正数yが1になるまで、『奇数なら3倍し、1をたす』、『偶数なら、半分にする』
繰り返した回数をkとして1〜1000000までのkの最大値とそのときのyをだすプログラムで
『1〜100までの結果を配列に蓄え、以降の計算に利用する』ってやつ

a=a/2をa/=2に変えると、おかしな結果になる!
なんで!!!すごくない!?
0241デフォルトの名無しさんNGNG
>なのだが俺は分かりやすいほうがいいと思うので a = a / 2 派。

こいつは ++i と書かずに i = i + 1 とか書いてるのか?
0242デフォルトの名無しさんNGNG
>>240
ならないが
0243225NGNG
( ̄□ ̄;)!!
オレはなるぞおおお
なんでだああああ
0244デフォルトの名無しさんNGNG
>>243
ほんとに a = a / 2 を a /= 2 に変えただけ?
a = a * 3 + 1 を a *= 3 + 1 にしちゃったりしてないよね?
0245デフォルトの名無しさんNGNG
#define a (*foo())
int *foo() { static int bar, *p=&bar; return p++; }
0246デフォルトの名無しさんNGNG
i = i + 1 と対比されるのは i += 1 であって、++i ではないような・・・・・・。
0247デフォルトの名無しさんNGNG
>>245
(゚Д゚)ハァ?
0248225NGNG
>>244
マジでそれだけ変えた!まじまじ!
XPでBCCで、CPad使ってるYO!
0249デフォルトの名無しさんNGNG
>>248
全く変わりませんが
0250デフォルトの名無しさんNGNG
しょーもないネタだったな
次はもっと面白いのにしてね>>248
0251デフォルトの名無しさんNGNG
まずは、具体的な結果の比較を出すのが先であろう。
0252デフォルトの名無しさんNGNG
gcc on x86 だと最適化の有無によって結果が変わるね
0253デフォルトの名無しさんNGNG
char str[] = "ahoahoahoahoaho";この中から、すべての a を削除するルーチンを教えてください。ちなみに、2時間前にC言語の勉強はじめたとこです。
0254デフォルトの名無しさんNGNG
>>253
char *foo (void) {
static char s[] = "hohohohoho";
return s;
}
0255デフォルトの名無しさんNGNG
>>253
とりあえず、入門書を一冊読んで、理解してから質問してください。
0256253NGNG
そんなひどい……
0257デフォルトの名無しさんNGNG
void foo(char *s, char a) {
while (s = strchr(s, a))
memmove(s, s+1, strlen(s));
}
0258デフォルトの名無しさんNGNG
char *delete_a ( char *str ) {
char *s = str, *d = str, *l;
while ( (l = strchr(s, 'a')) != NULL ) {
*l = '\0';
while ( *s ) *d++ = *s++;
s++;
}
return d;
}
0259225NGNG
じゃあ結果だ!
これがa=a/2のとき
対象値が837799のとき計算回数の最大値は524です。
-- Press any key to exit (Input "c" to continue) --

これがa/=2の時
対象値が992425のとき計算回数の最大値は992600です。
-- Press any key to exit (Input "c" to continue) --

ちなみにマジレスだから!みんな変わんないって事はオレだけ!?
だれか変わった人いねーーがーー
0260デフォルトの名無しさんNGNG
void foo(char *s, char a) {
char *t = s;
while (*s) {
while (*t == a) t++;
*s++ = *t++;
}
}
0261デフォルトの名無しさんNGNG
同じだった。
#include <stdio.h>
int main(void){
unsigned long a, k, k_max=0, y, y_max=0, data[100];
for (y=1; y<=100; y++)
for (a = y, data[y] = 0; a > 1; data[y]++)
if (a % 2 == 0) a /= 2;
else a = a * 3 + 1;
for (y = 101; y < 1000000; y++) {
for (a = y, k = 0; a > 100; k++)
if (a % 2 == 0) a /= 2;
else a = a * 3 + 1;
k += data[a];
if (k > k_max) { k_max = k; y_max = y;}
}
printf("対象値が%dのとき計算回数の最大値は%dです。\n",y_max,k_max);
return 0;
}
0262デフォルトの名無しさんNGNG
>>259
>>252

>>260
えらー
0263デフォルトの名無しさんNGNG
void foo(char *s, char a) {
char *t = s;
do {
while (*t == a) t++;
} while (*s++ = *t++);
}
0264253NGNG
ありがとうございます。なんとかできそうです。
0265デフォルトの名無しさんNGNG
VRMLの質問はどのスレに行けばいいですか?
もしや板違い?
0266匿名希望 NGNG
#include<stdio.h>
int scan_uint(void){ 
int tmp;
do{
printf("非負の整数を入力して下さい:"); scanf("%d",&tmp);
}while(tmp<0);
return (tmp);
}
int rev_int(int){
int tmp=0;
if(num>0){
do{
tmp=tmp*10+num%10;
num/=10;
}while(num>0);
}
return (tmp);
}
int main(void) {
int nx=scan_unit();
printf("反転した値は%dです\n",rev_int(nx);
return (0);
}

 上記のプログラムは「読み込んだ非負の整数値を逆順に表示」するプログラムなのですが、13行目の式の意味が分かりません。どうか御教授ください。


0267デフォルトの名無しさんNGNG
tmp=tmp*10+num%10;
tmp*10 + numの一桁目。
tmp=123, num=456だったら
tmpは1236になる。
0268デフォルトの名無しさんNGNG
>259
Compilerはなんですか.Overflowとかが起こってんのかなあ.
0269デフォルトの名無しさんNGNG
>>268
>>248
0270デフォルトの名無しさんNGNG
>269
なるほど.
0271266NGNG
>>267さん
ありがとうございました。
0272那由多 ◆F4E74ZBQPA NGNG
>266

123→321とするプログラムですよね。

(1)tmp=0,num=123
tmp=0*10+123%10=3

<num/10=12>

(2)tmp=3,num=12
tmp=3*10+12%10=32

<num/10=1>

(3)tmp=32,num=1
tmp=32*10+1%10=321

ってことでいいのかな。
0273デフォルトの名無しさんNGNG
>238
よく見たら,data配列のsizeの宣言がおかしいような.data[99]の値はちゃんと保存されてるのか?
0274デフォルトの名無しさんNGNG
>238
アハハハ、やっちゃったね。
0275デフォルトの名無しさんNGNG
>>273
いくら払えばいいんですか?
0276デフォルトの名無しさんNGNG
どばーっと。
0277デフォルトの名無しさんNGNG
一匹でいいや
0278225NGNG
>>273
どういう事?
sizeの宣言ってdata[99]の99のこと?
でも1から100までだから、配列のサイズは99でしょ?

てか実際変えてるのはa=a/2のとこだけだから、
そこは関係ないと思う。
最もプログラムの本質に関わることだったらあれだけど・・・
0279デフォルトの名無しさんNGNG
>>278
何を言っているのか要領を得ないが、data[99] と宣言したら、使えるのは
data[0] 〜 data[98] だぞ。
0280デフォルトの名無しさんNGNG
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
サイズは10。
0281デフォルトの名無しさんNGNG
>>279
何言っているのか要領を得ないが、わかるようにはっきり言ったらどうだ?
0282デフォルトの名無しさんNGNG
>>281
十分はっきりしてるじゃねーか
0283172NGNG
記憶クラス(staticとかexternとか)について誰かわかりやすく教えてくれませんか?
手元の本を読んでもチンプン・カンプンなんで…

ページでもいいからお願いします。(あつかましくてすみません)

勉強し始めて一週間とちょいぐらいのレベルです。
0284デフォルトの名無しさんNGNG
>>281
何言っているのか要領を得ないが、何がわからないのかはっきり言ったらどうだ?
0285デフォルトの名無しさんNGNG
>>283
まず、static の何がわからないか、extern の何がわからないか書いてくれ。
0286デフォルトの名無しさんNGNG
>>225
つまらん
ログ流すな
0287デフォルトの名無しさんNGNG
このスレ、なんで週末になるとレベルが低くなるの?

int *p = data-1;
0288デフォルトの名無しさんNGNG
>>284
十分はっきりしてるじゃねーか
0289デフォルトの名無しさんNGNG
>>287
0290デフォルトの名無しさんNGNG
>>287
十分はっきりしてるじゃねーか
0291172NGNG
>>285
何がわからないのか…う〜ん

いままで(といっても一週間程度だけど) static とか使わないでソース書いてきたんで、
どうしてそんなものを宣言する必要があるのか? とか
だったら最初から外部関数でいいんじゃないの? とか
考えちゃうわけでして…

こんなんじゃだめですか?(抽象的でごめんなさいマジで…)
0292デフォルトの名無しさんNGNG
よくいるよ。強い口調で言ってみたものの自分が間違っていることに気づいたが
後に引けない>>279みたいなやつ。
0293172NGNG
>>291
外部関数 → 外部変数

です、間違えた
0294デフォルトの名無しさんNGNG
>>292
>>279のどこが間違ってるの?
0295デフォルトの名無しさんNGNG
>>294
コピペだから気にするな
0296デフォルトの名無しさんNGNG
>>294
お願いだから相手にしないでよ。
0297デフォルトの名無しさんNGNG
>>291
じゃ、何も知らないという前提でいいな。

まず extern だけど、これは関数や変数の実体を定義していないが、直ちに
使いたいという場合に用いる。
例えば、プログラムの規模が大きくなってくると整理の為にソースを分割して
コンパイルするけど、その際に file_a.c で実装されている関数 func1() を
file_b.c から呼び出したい時に 「extern int func1(int value);」 とか書く。
ただし変数でなく関数の場合、extern は通常つける必要が無く、単に
「int func1(int value);」 と書くだけでよい。
つまり、ファイルを複数に分割するつもりがないなら、覚える必要は無い。

static だけど、これはグローバル (関数外) で書くのとローカル (関数内) で
書くのとでは意味が違う。

グローバル (関数外) で書く static は、他のファイルのソースから extern
できないようにする。
static に指定するとそれは外側から見えなくなるので、file_a.c と file_b.c
で共に同名の変数や関数が定義されてても、ぶつかる事がない。

ローカル (関数内) で書く static は、これは変数にしか付けられないわけだが、
普通に宣言した変数と違って前回に呼び出された時の値をそのまま保存するよう
になる。
これは、例えば前回に関数が呼ばれた時間を覚えておいて、そこからの経過時間
を返したい場合などに使える。

・・・難しいかな?
0298デフォルトの名無しさんNGNG
>>293
static → 外部モジュールで参照不可
extern → 外部モジュールで参照可
0299デフォルトの名無しさんNGNG
>>293
static 変数とグローバル変数の大きな違いは、static 変数は関数の外側から
見えない事。
だから、別の場所で間違って値を変更してしまう危険を防ぐ事ができる。
さらに、その変数が他の関数では直接使われない事がすぐわかり、ソースを
読むのが簡単になる。

グローバル変数だらけのソースは一般に嫌われる。
(何がどこで使われてるかわかったものじゃないから)
0300デフォルトの名無しさんNGNG
300
0301デフォルトの名無しさんNGNG
Σ(゚д゚lll)ガーン
0302デフォルトの名無しさんNGNG
>>298
> extern → 外部モジュールで参照可

それは微妙に違くないか?
0303デフォルトの名無しさんNGNG
extern → 外部モジュールのを参照可に?
0304172NGNG
>>297-299
ありがとうございます!

extern は大体(思い込みかもしれないけど)わかりました。
要するにソースの規模が大きくなるならextern にしとけってことで(いいのかな?)

static はかなり疑問符をつけながら読んでますw
大まかな認識として値を保持し続けるってことでいいのかな?

ほんとありがとうございます。勉強しはじめなんで一気に飲み込むのは僕には無理があるようで、これから徐々に消化していきたいと思います。
でも、おかげさまでアバウトな面での認識はできました。
0305デフォルトの名無しさんNGNG
>>304
extern についてはちょっと違う。
extern は、関数を使いたいファイル側で使うの。

[file_a.c]
#include <stdio.h>
extern int square(int i);

int main(void)
{
 printf("%d\n", square(2));
 return 0;
}

[file_b.c]
int square(int i)
{
 return i * i;
}

こんな感じ。
0306デフォルトの名無しさんNGNG
>>303
それが妥当な説明だね。簡単に言うなら。
0307デフォルトの名無しさんNGNG
>>273
1から100までなのに配列のサイズが99っておかしくねぇ?
おまえの理論は、1〜N個のデータはN-1個の配列に格納できるっつーことだぞ。
つまり、N=2とすると、1個の配列に格納できるって話になっちまうぞ。
もう一度よく考えれ。
0308デフォルトの名無しさんNGNG
>>304
 staticは関数の宣言に使用した場合と変数の宣言に使用した場合で
意味が異なる。
 static func() と使った場合はそのファイル内ローカルの関数になる。
 また関数内で static int a;と変数を宣言した場合はauto変数でなく
 静的に(スタック上でなくメモリ上に)確保される。
 つまり関数外でstaticなしで宣言したことと同じになる。

 extern func();と
 func():は同じことだ。

 どうだい、これでますますよくわかっただろう(w
0309デフォルトの名無しさんNGNG
>つまり関数外でstaticなしで宣言したことと同じになる。
リンケージは?
0310デフォルトの名無しさんNGNG
>>308
罠張るなよ。
グローバルの static 変数はどうなるんだ。
あと大抵の入門者は auto なんてキーワード知らんから持ち出すな。
0311デフォルトの名無しさんNGNG
>>307
何故それを 273 に向かって言う?
つーか、多分 「1 〜 100」 はループカウンタを言っていると思われ。
実際には N - 1 でアクセスしてる。

・・・それでも後ろに 1 つはみ出るけどナー。
0312172NGNG
(^^;
もちっと勉強してから、でなおしてきますぜぃ!

あ、でも使用用途が判らなかったから悩んでたんでそこらへんは解決しました!
あとは勉強して自然と身につけるのみですよね
0313デフォルトの名無しさんNGNG
>>312
どうでもいいが、新たに質問したら、名前はそこの番号に変えた方がいいぞ。
0314デフォルトの名無しさんNGNG
>>309
 それは書いた後で気がついた
0315デフォルトの名無しさんNGNG
知識ひけらかしたいのかもしらんが、無駄にレスが多くなるような回答はやめようべ。
ただでさえ流れるの早いんだから。
0316デフォルトの名無しさんNGNG
>>315
309 や 310 や 311 みたいな突っ込みもいかんのか?
0317225NGNG
1から100までって99個でないのか?
0318デフォルトの名無しさんNGNG
>>317
1から10まで9個か?
0319デフォルトの名無しさんNGNG
>>317
だから配列のインデックスは98が最高なんだから99にアクセスしたらまずいだろって。
もうこの話引っ張るのやめてくれよ。
0320225NGNG
死んできます。
探さないでください。
0321デフォルトの名無しさんNGNG
CでRS232Cに入出力するためにはどうしたらいいですか?
開発環境:Windows
コンパイラ:VC++かCygwin
0322デフォルトの名無しさんNGNG
from >>1
C 標準でできない事の質問は使ってる開発環境のスレに逝ってくれ。
0323デフォルトの名無しさんNGNG
>>322
開発環境依存ですか。ありがとうございます。
0324デフォルトの名無しさんNGNG
キーボードから入力とかディスプレイに出力ってのも環境依存だな。
大抵は標準入出力を使ってやりとりすれば出来ると思うけど。
0325デフォルトの名無しさんNGNG
週末にこの寂れ様・・・
0326デフォルトの名無しさんNGNG
>> 325
厨がわいてた方がいいと言うのか?
0327デフォルトの名無しさんNGNG
しかしこのスレ回転速いな・・・。
0328デフォルトの名無しさんNGNG
>>327

         ス        ス
            レ
                  レ
ス  レ ..┌→─→─→─→─→─┐     ス
      │               ↓  レ
      ↑               │
      │               ↓
      ↑               │
   レ  .└─←─[. 0.001 秒 ]─←┘   レ  ス
ス         レ      レ
                    ス
          ス

という事でよろしいか?
0329デフォルトの名無しさんNGNG
1kHz じゃ、まだまだだな。
0330328NGNG
   ||
 ∧||∧
(  ⌒ ヽ トゥトゥトゥマシェーリー
 ∪ 。ノ    トゥトゥトゥマシェーリー
  ∪∪
0331デフォルトの名無しさんNGNG

     ||
   ∧||∧
  (  ⌒ ヽ>>328
   ∪  ノ
   ∩∪∩
   (・∀・| | クヨクヨスンナ
    |     |
  ⊂⊂____ノ
       彡
________
■ このスレッドは過去ログ倉庫に格納されています