C言語なら俺に聞け( ..
[2ch|▼Menu]
237:デフォルトの名無しさん
09/11/05 05:42:28
>>236
簡単にできる。

238:デフォルトの名無しさん
09/11/05 10:18:25
*(char *)12345678 = 0xFB;
でいいのだろうか

239:デフォルトの名無しさん
09/11/05 10:24:45
>>236
* (char *) 0x12345678 = 0xfb;

240:デフォルトの名無しさん
09/11/05 10:26:05
あぁ

241:デフォルトの名無しさん
09/11/05 10:45:49
16進とは書いてないだろ。

242:デフォルトの名無しさん
09/11/05 10:50:58
アドレスって書いてあれば16進だと思うの普通じゃね?

243:デフォルトの名無しさん
09/11/05 11:09:29
プレフィックスもサフィックスもなく、[0-9] だけで構成された数字を見たら
16進ではない、と思うのが自然な飢餓する。

244:デフォルトの名無しさん
09/11/05 12:11:12
>>227
>>217の糞コードじゃ0がコピーされないだろ


245:デフォルトの名無しさん
09/11/05 14:08:28
for(;;) { *q=*p; if(*p=='¥0') break; p++,q++; }

246:デフォルトの名無しさん
09/11/05 14:17:46
アドレスを10進数で表記するような文献は見たことない

247:デフォルトの名無しさん
09/11/05 15:14:38
>>245
それだと最終的なp, qの値が違う
for(;;) {
*q=*p;
if(*p=='\0') {
p++;
q++;
break;
}
p++,q++;
}

248:デフォルトの名無しさん
09/11/05 15:55:24
>>246
つ情報処理技術者試験


249:デフォルトの名無しさん
09/11/05 16:18:28
URLリンク(www.dotup.org)

この課題の『Aについて』でいきなり詰まってしまいました。
少しずつ理解しながらやりたいので、だれか協力お願いします。
なんどかこのスレで質問することになると思います。

250:デフォルトの名無しさん
09/11/05 16:27:24
整数乱数ってなんですか? とか、そういう感じの具体的な質問をお願いします
協力お願いしますでは何を答えていいのかわかりませんので

251:249
09/11/05 16:33:13
自己解決しました。

252:デフォルトの名無しさん
09/11/05 16:42:03
自己発電しました

253:249
09/11/05 16:56:59
>>249です

整数乱数とはなんですか?
Aについてですが、今までは
int kansuu(int x)
{
return x*x;
}
のように数式を作るような使い方しかして来ませんでした
問題文にあるように関数の中で、min,maxを定義できるんですか?

254:デフォルトの名無しさん
09/11/05 17:03:30
#include <stdlib.h>

int randomNumber (int min, int max) {
return rand() % (max - min + 1) + min;
}

255:デフォルトの名無しさん
09/11/05 17:17:48
>>254
剰余を使うな。

256:デフォルトの名無しさん
09/11/05 17:18:54
int randomNumber(int min, int max)
{
return (int)(rand() / (RAND_MAX + 1.0) * (max - min + 1)) + min;
}

257:デフォルトの名無しさん
09/11/05 17:20:40
>>255
今更気にする必要なし。

258:デフォルトの名無しさん
09/11/05 18:00:43
2の累乗以外の乱数を出す場合は、
振り直し法を使わないと均等にはならないよ。

例えば RAND_MAX が 7 として、
それで 1〜6 の乱数を求めたら
1/8 の確率のものと 2/8 の確率のものが混ざってしまうだろ。
これは RAND_MAX を大きくしても解決しない問題だろ。

259:デフォルトの名無しさん
09/11/05 18:09:31
>>257
それはない。rand() の線形合同法では mod を使うのはご法度。

260:デフォルトの名無しさん
09/11/05 18:16:04
別にいいよ

261:デフォルトの名無しさん
09/11/05 18:51:49
>>256
実数を使っても無駄だよ。
int randomNumber(int min, int max)
{
return rand() / (RAND_MAX / (max-min+1)) + min;
}

整数でも変わらん。
どうしても均等にしたければ振り直し法を使うしかない。

262:デフォルトの名無しさん
09/11/05 18:54:31
整数オーバーフローは起きないの?

263:デフォルトの名無しさん
09/11/05 19:02:14
>>261
奥山晴彦氏の乱数の改良でも使えばいいだろ

URLリンク(www.vector.co.jp)

264:デフォルトの名無しさん
09/11/05 19:09:44
9桁以下の正の整数か否かを判別したいのですが

if(m>0 && n>0 && m<=999999999 && n<=999999999)

これでいいんでしょうか?
もっとスマートになりそうな気が…

265:デフォルトの名無しさん
09/11/05 19:15:07
m の判定と n の判定がごちゃ混ぜになっているのが「スマートではない」な

266:264
09/11/05 19:20:53
>>265
えっとつまり

if(m>0 && m<=999999999 && n>0 && n<=999999999)

ってことですか?
個人的に「999999999なんて入力しないんじゃなかろうか」と思ったのですが…

267:デフォルトの名無しさん
09/11/05 19:24:43
m と n のどっちが外れているかの判別ができないけどいいの?

268:デフォルトの名無しさん
09/11/05 19:34:10
>>266
とりあえずはね
ただし >>267 が言っているような問題がまだ残っているし
入力は屈指のこわーい所で、範囲チェックだけで済むかどうかも怪しいぞ

269:264
09/11/05 19:45:26
>>267-268
急いでソース全部打ってきました


/* 9桁以下の2つの正の整数m,nを入力して、m/nの小数部分 */
/* を四捨五入して得られる整数値を出力するプログラム */

#include <stdio.h>
int main(void)
{
int m,n,quotient;

printf("\n9桁以下の正の整数を2つ入力して下さい\n");

scanf("%d%d",&m,&n);

if(m>0 && n>0 && m<=999999999 && n<=999999999){
quotient = (m+n/2)/n;
printf("\n%d/%dの小数部分を四捨五入して得られる整数値は、%dです。\n\n",m,n,quotient);
}else{
printf("\n入力する値は9桁以下の正の整数にして下さい。\n"
"プログラムを終了します。\n\n");
}
return 0;
}


コメント内のプログラムを作成するのが課題なのですが、ループ処理はまだ習っていないので終了という形にしてみました。
mとn分けたほうがいいでしょうか?

270:デフォルトの名無しさん
09/11/05 19:51:44
ループがまだってことは、関数もまだか
今んとこそこまでかな

271:264
09/11/05 19:59:39
>>270
そうですか
ありがとうございました
とりあえずif文の中を整理して提出してみます

272:デフォルトの名無しさん
09/11/05 20:49:54
>>269
11桁とかの数入力されときどうなるんだっけ?

273:デフォルトの名無しさん
09/11/05 21:18:59
scanf関数を用いて入力された3桁の整数に対して、
10の位および1の位を四捨五入することによって得られる2つの整数を表示するプログラムを作成せよ。
例)『425』を入力した場合、『400, 430』が画面に表示される。

宿題でこんなのが出たのですがどうしても出来ません!!
どなたか教えてください!!

274:デフォルトの名無しさん
09/11/05 21:19:58
ちなみにこんな感じでやってみたけどダメでした

#include<stdio.h>
#include<math.h>

int main(void){
int x,a,b;

scanf("%d",&x);
a=(x/100)+0.5;
a=((int)a)*100;

b=(x/10)+0.5;
b=((int)b)*10;


printf("10の位を四捨五入して整数で表します.\n");
printf("結果=%d\n",a);
printf("1の位を四捨五入して整数で表します.\n");
printf("結果=%d\n",b);

return 0;
}

275:デフォルトの名無しさん
09/11/05 21:25:03
>>274
惜しい!

276:デフォルトの名無しさん
09/11/05 21:34:03
自販機のLEDあるじゃないですか
あれみたいに、
右から順にボタンLEDが点灯していき左端で停止
停止したら右からまたLEDが順に点灯していきスタック
スタックしたら右からまたLEDが・・・

ってのをやりたいのですが、「一行で」やるにはどうすればいいのですか。

ifを使うとビットシフトでできるのですが
「一行でやれよバカ」だそうです。

277:デフォルトの名無しさん
09/11/05 21:38:33
>>276
質問の内容が意味不明だが
改行しなきゃいいんじゃないかな?

278:デフォルトの名無しさん
09/11/05 21:39:59
1行って言われてもね……

279:デフォルトの名無しさん
09/11/05 21:42:06
>>276
日!本!語!で!お!k!


280:デフォルトの名無しさん
09/11/05 21:45:36
#define (コントローラのLEDアドレス)  Fuckintosh
char       LED = 0x01;

Fuckintosh = LED << 1;

で、左端のLEDまで点灯させます。 2進数で10000000です

じゃあ左端を点けたまま再度右から点灯させていくなら 10000001 -> 10000010とシフトしていけばいいのか、と
別に変数を用意し、+ したのですが
なぜかこれだと 二個同時に点いたります。

ifで分けてやると思い通りの点灯パターンを行うのですが
「(ifとか使わず)一行でやれよバカ」だそうです。

281:デフォルトの名無しさん
09/11/05 21:47:09
二個同時と言うのは左端を含めずに二個です

シフトしていくLEDと隣り合ったLEDが点いて消えたり点いたり、
一緒にシフトして行ったり
shます

282:デフォルトの名無しさん
09/11/05 21:53:05
1行とか言ってるソイツがアホなだけだろ。

283:デフォルトの名無しさん
09/11/05 21:54:30
ほんと日本語へたくそだな
if使ったコード晒せよ


284:デフォルトの名無しさん
09/11/05 22:02:38
>>280
でけたwww
int i,j,hoge;for(i=0,LED=0;i<8;i++){hoge=LED;for(j=0;j<8-i;j++)(LED=hoge|(1<<j)),*p=LED;}

その説明では状況が分からん

285:デフォルトの名無しさん
09/11/05 22:03:19
00000000
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
10000001
10000010
10000100
10001000
10010000
10100000
11000000
11000001
11000010
11000100
11001000
11010000
11100000
こんな感じ?

286:デフォルトの名無しさん
09/11/05 22:06:50
そうです

LEDが16コあって、そのうちの8つがLEDコントローラA
残りの8つがBに繋がっちょります
が、8つ点ける時点でつまずきました

287:デフォルトの名無しさん
09/11/05 22:08:38
10000000
よしここから右端から点けよう

10000001 点いた
10000011 あれ?
10000110 あれ?
10000111 おや?
10001101 なんじゃ

なんてことになってます。


288:デフォルトの名無しさん
09/11/05 22:11:50
>>287
コードを晒すんだ!
そのほうが日本語より直接的で分かりやすいと思う

289:デフォルトの名無しさん
09/11/05 22:15:53
なので、
Fuckintosh = 10000000 + (FuckOSX << 1) とかしたらどうかな、と思ったのですが

上のようにワケのわからんパターンで点灯し
ならORで、とやってもだめでした


>>288
仕事場に置いてきてまってるもんで

自販機を思い浮かべてもらえれば。
あの多段ボタンLEDそのままなので。

そのLEDは2進数00000000に対応しており、点けたい部位のビットを1にすれば光ります
10000000なら左端、00001000なら右から4番目、というふうに

290:デフォルトの名無しさん
09/11/05 22:17:53
>>285 をテーブルに入れて垂れ流せばいいよ。

291:デフォルトの名無しさん
09/11/05 22:18:19
>>289
この時期まで研修とは…
大企業だな
裏山鹿

>>284 でおk

292:デフォルトの名無しさん
09/11/05 22:18:26
あー違った

Fuckintosh = 10000000 + (FuckOSX << 1)の 10000000 の部分は決め打ちではありません。
変数です。
if(FuckMac >= 10000000)
 Fuckintosh = (FuckMac + (FuckOSX << 1));

という感じですかね

293:デフォルトの名無しさん
09/11/05 22:21:35
2進数10000000は、16進数で0x80,

左端と右端を点けるには10000001、つまり0x81
やはり左端の値を保持して、新たにシフトさせていく変数を用意し
左端の値と足していけば順次シフトできるんじゃなかろうか、
と思ったのです。

294:デフォルトの名無しさん
09/11/05 22:39:35
つーか、ビット操作なら unsigned でやれよ。


295:デフォルトの名無しさん
09/11/05 22:58:53
排他的論理の計算ってどんなときに使うんですか?

101100110
110011101

011111011
になるのはいいんですが、この計算はたとえばどんな時に使用されるの?

296:デフォルトの名無しさん
09/11/05 22:59:47
stdioはstandard input outputの略
ではprintfやsacanfとかって.....
語源とか気になる関数とか多いです

297:デフォルトの名無しさん
09/11/05 23:03:17
>>295
フラグの入れ替えとかハッシュ計算とか


298:264
09/11/05 23:07:50
>>272
11桁ですか?
おそらく弾かれて、プログラム終了となるんじゃないかと思うのですが…

299:デフォルトの名無しさん
09/11/05 23:09:48
>>295
特定のビットだけ反転させたいときだな。
あまり使う機会はない。

>>296
print や scan に format の f 付けただけ。


300:デフォルトの名無しさん
09/11/05 23:14:03
>>299

おお、こんなに早くお返事が!!!
サンクスです
検索かけても語源とかなかなか出てこなくって
「UNIXの古い資料調べれば全部分かる」
みたいな話はどこかに書いてありましたが
それもちょっとよく分からん話だったんで

301:デフォルトの名無しさん
09/11/05 23:27:38
1ビットずつフラグに使ってたら、反転させたいときもあるんだろうな

302:デフォルトの名無しさん
09/11/05 23:43:26
>>296
print formatted output

その他気になるのは↓で探すよろし
URLリンク(www.opengroup.org)

303:デフォルトの名無しさん
09/11/06 00:09:44
ボタンとかのオブジェクト配置するには?
画面の出し方は死ぬほどサンプルあるけれど

304:デフォルトの名無しさん
09/11/06 00:34:17
いきなりなんだよwww
windowclass にボタン指定しろよw

305:デフォルトの名無しさん
09/11/06 00:39:22
スレ違い

306:デフォルトの名無しさん
09/11/06 00:45:15
>>295
RAID5の計算とか
CRCとか
画像処理とか

A = 101100110
B = 110011101
A xor B = C
C = 011111011

C xor A = ...
C xor B = ...

307:デフォルトの名無しさん
09/11/06 02:55:03
>>302
リンク先までありがとうございます
正直、英語は読めないので何をどう見たらよいやら分かりませんが調べてみます
やはりプログラマーは英語必須なんでしょうなあ

308:デフォルトの名無しさん
09/11/06 02:59:12
英語読めなくてもプログラマやってる奴は結構いるよ
カスばっかだけど

309:デフォルトの名無しさん
09/11/06 03:03:42
プログラミングコンテストの問題が英語だから理解出来ないとかね
プログラミング以前の段階で淘汰されてて面白い

310:デフォルトの名無しさん
09/11/06 03:08:20
職業としてやるんじゃなかったら英語なんてたいして必要ない。
英検三級ありゃやっていける。

311:デフォルトの名無しさん
09/11/06 03:39:30
int main()
{
unsigned char LED = 0x01;
int i,j,n;
for (i = n = 0; i <= 36; n=++i)
{
LED = 0;
for (j = 8; j > 0; n-=j*(n>=j),j--)
{
LED |= (n>=j)<<(j-1);
}

for (j = 7; j >= 0; j--)
{
printf("%d", LED >> j & 1);
}
printf("\n");
}
return 0;
}

どうしてこうなった

312:デフォルトの名無しさん
09/11/06 04:21:24
unsigned char func(int n)
{
unsigned char LED = 0;
int i, stack = 0;
for (i = 8; n > i; n-=i--, stack++);
LED = ~0 << (8-stack) | !!n << (n-1);

return LED;
}

int main()
{
int i,j;
unsigned char LED;

for (i = 0; i <= 36; ++i)
{
LED = func(i);

for (j = 7; j >= 0; j--)
{
printf("%d", LED >> j & 1);
}
printf("\n");
}

return 0;
}

がんばってこれか

313:デフォルトの名無しさん
09/11/06 06:00:48
stackをループじゃなくて2次式を解くことでできそうな気がするけど、またあとで。

314:デフォルトの名無しさん
09/11/06 15:15:26
Cは無限ループifしなくても何かが起こったときに
関数に飛ぶことはできないの

315:デフォルトの名無しさん
09/11/06 15:16:46
日本語でおk

316:デフォルトの名無しさん
09/11/06 15:17:11
>>314
日本語でOK。

317:デフォルトの名無しさん
09/11/06 15:20:07
>>314
signal()

318:デフォルトの名無しさん
09/11/06 15:45:21
教えてやるから日本語で質問しろ。

319:デフォルトの名無しさん
09/11/06 16:01:10
馬鹿は回答するな

320:デフォルトの名無しさん
09/11/06 16:02:26
>>314
atexit()

321:デフォルトの名無しさん
09/11/06 16:12:23
>>314
標準Cには、そういう仕掛けはない。
Win32 API なり、Pthreads なりを使うわけだが
OS が特定できんことには。

322:デフォルトの名無しさん
09/11/06 17:15:23
signalは標準だろボケ
無知は黙ってろよカス

323:デフォルトの名無しさん
09/11/06 17:31:42
>>322
では一つ、signal()の標準的な使い方を教えてくだされ。

324:デフォルトの名無しさん
09/11/06 17:37:51
問題文を出力するなどのため、
引数の内容が長文化した場合、(継続文字?)について教えてください。

例えば、プリントエフ関数で、長文を表示させる場合、

printf("1行目から2行目\n3行目から4行目\n");

といったように書いていったのですが、
当然ながらだんだん見えなくなってくるので、

printf("・・・・3行目から4行目\n"
"5行目から6行目\n6行目から7行目\n・・・・");

と、表示していくことになりますが、
他によい方法はないのでしょうか。
こういう場合、どういう方法が一般的なのでしょうか。
プリントエフで一個ずつ表示するものなのでしょうか。



325:デフォルトの名無しさん
09/11/06 17:41:12
SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM は標準のようだ
質問の「何か」っていうのが具体的に何かわからないと何ともいえないが

326:デフォルトの名無しさん
09/11/06 17:43:30
>>324
俺なら1行ごとに分ける
printf(
  "1行目\n"
  "2行目\n"
  "3行目\n"
  ・・・・
  "最終行\n");
それか、問題文を別ファイルから読み込む

327:デフォルトの名無しさん
09/11/06 17:52:34
>>326
なるほど1行ずつですか。

>>それか、問題文を別ファイルから読み込む
買ってきた本でもファイルの入出力を最後のほうで取り上げています。
なんとかそこまで早くたどり着きたいものです。

最終的にはプロンプトでサウンドノベルみたく動く文字出力を実現したいです。
あの、1文字、1文字、動いていく感じがたまらなくいいので。
たぶん繰り返し処理とか使うんだろうなあとは思っているのですが。

328:デフォルトの名無しさん
09/11/06 18:08:36
優れたプログラマ=論理演算多用 if少ない

if((A >> B) |= C) != ( ((D >> E) << F) &= (G | H)){
  VAR = I >> (J |= (K + L));
}

329:デフォルトの名無しさん
09/11/06 18:10:13
>>328
馬鹿?

330:デフォルトの名無しさん
09/11/06 18:11:20
劣ったプログラマ=if多い

if()
 if()
  if()
   if()
    if()
else if()
 if()
  if()
 else if()


ifを判定するだけで最低1クロック無駄にする

331:デフォルトの名無しさん
09/11/06 18:18:10
Cでどう短く書くかより、実際の効率で考えるべき

332:デフォルトの名無しさん
09/11/06 18:39:47
ものすごいアホがいる。

333:デフォルトの名無しさん
09/11/06 18:43:02
>>328
まだ減らせるぞw
((A >> B) |= C) != ( ((D >> E) << F) &= (G | H))&&(VAR = I >> (J |= (K + L)));



334:デフォルトの名無しさん
09/11/06 19:22:57
>>324
ふつーは
printf("一行目\n");
printf("二行目\n");
printf("三行目\n");
printf("四行目\n");

335:デフォルトの名無しさん
09/11/06 19:46:24
printf("四行目\n",printf("三行目\n",printf("二行目\n",printf("一行目\n"))));


336:デフォルトの名無しさん
09/11/06 20:05:35
>334,>335は関数呼び出しコストを度外視しているところが間抜け。
一回で済むことを4回もやるな。

337:デフォルトの名無しさん
09/11/06 20:15:43
それ以前に、ただの文字列出力にprintf使う奴はプログラマーに向いていない。

338:デフォルトの名無しさん
09/11/06 20:18:32
まあ普通は DrawText() 使うよな。

339:デフォルトの名無しさん
09/11/06 20:20:03
関数くらい人に教わる前に自分で習得しろって?
そりゃ俺も C 始める前にアセンブラで PRINT マクロ作ってたさ、そのアセンブラも自作でね
けど今どうなんだろう? C の printf には BASIC の PRINT コマンドほどの教育力あるんかね
俺個人としては、かえって饒舌すぎるところがあるように思えるんだが

340:デフォルトの名無しさん
09/11/06 20:24:32
まぁ、まともなコンパイラならprintf()の代わりにputs()を使うくらいのことはするからな。

341:デフォルトの名無しさん
09/11/06 20:50:57
それだと結果が変わってしまうな。

342:デフォルトの名無しさん
09/11/06 20:53:29
いまどきのコンパイラなら334も324も最適化で同じになるだろ。

343:デフォルトの名無しさん
09/11/06 21:11:57
結局どう表示したいのか一目でわかるのが>>326の良いところ

344:デフォルトの名無しさん
09/11/06 21:49:55
結局トレードオフなんあぢょ。

345:デフォルトの名無しさん
09/11/06 22:06:53
あるアドレスに名前を付ける時ってどうするの?


346:デフォルトの名無しさん
09/11/06 22:14:14
>>345
マクロとか変数名とか名前-アドレスマップとか

347:デフォルトの名無しさん
09/11/06 22:15:57
ポインタ

348:デフォルトの名無しさん
09/11/06 22:19:10
>>347
初心者は黙ってろ。

349:デフォルトの名無しさん
09/11/06 22:28:10
× DIV = (300 / 2);
○ DIV = (300 >> 1)

350:デフォルトの名無しさん
09/11/06 22:39:15
一番やりがち、真っ当なのはdefine

#define 90000000 adressV125



351:デフォルトの名無しさん
09/11/06 22:41:20
>>348
ぬるぽ

352:デフォルトの名無しさん
09/11/06 22:42:13
>>350
釣り針でかすぎw

353:デフォルトの名無しさん
09/11/06 22:47:28
コンパイラが対応していれば、#plasmaでもいい。
でもプラズマは本当に「そのプラットフォーム専用」でないと用意されていない。

354:デフォルトの名無しさん
09/11/06 22:53:32
本命は l だと思う。

355:デフォルトの名無しさん
09/11/06 22:59:59
#import

356:デフォルトの名無しさん
09/11/07 00:46:37
DXライブラリを使用して今までは正常にコンパイルできていたのですが、PCのフォルダなどを整理してから、

Fatal: ファイル VORBISFILE_STATIC.LIB が開けません

とメイク結果に表示されコンパイルできなくなってしまいました。
エディンタの再設定もしてあり、必要なファイルはあると思うんですが...
だれかアドバイスいただけないでしょうか。

357:デフォルトの名無しさん
09/11/07 00:55:41
ここはそんな質問する場じゃない

358:デフォルトの名無しさん
09/11/07 01:04:48
DBに接続するためのパスワード文字列をソースに埋め込もうと
考えたんですが、stringsコマンドでバレてしまいますよね。
通常は暗号化したパスワードを文字列として持たせるのがベターなんでしょうか?


359:デフォルトの名無しさん
09/11/07 01:39:49
>>357
すみません初心者用の本でライブラリを使いなさいと書いてあったんです...
本の通りにやり直してもできないんです

360:デフォルトの名無しさん
09/11/07 01:41:28
ここはそんな質問する場じゃない!

361:デフォルトの名無しさん
09/11/07 02:39:25
気合い入れてもう一回ググッてきます。がんばってきます

362:デフォルトの名無しさん
09/11/07 10:18:05
フォルダの整理って何したんだよ?

363:デフォルトの名無しさん
09/11/07 11:09:18
makeしたら負けだと思う。

364:デフォルトの名無しさん
09/11/07 11:46:42
>>363
自分で書いて面白いと思ってんの?

365:デフォルトの名無しさん
09/11/07 11:50:14
おつにゃん

366:デフォルトの名無しさん
09/11/07 13:17:46
printf("\
1行目\n\
2行目\n\
3行目\n\
・・・・
最終行\n\
");


367:デフォルトの名無しさん
09/11/07 13:20:21
それインデンツできないから×

368:デフォルトの名無しさん
09/11/07 14:31:46
printf(
"1行目\n"
"2行目\n"
"3行目\n"
・・・・
"最終行\n"
);

369:デフォルトの名無しさん
09/11/07 15:06:46
char *s="
#include "hoge.txt"
";
printf(s);

370:デフォルトの名無しさん
09/11/07 17:34:37
if(fgets(str, sizeof(str), stdin) == NULL)
が成り立つことってあるのでしょうか。

371:デフォルトの名無しさん
09/11/07 17:45:41
ファイル終端。


372:370
09/11/07 17:50:17
キーボードからの入力でファイル終端ってどういう場合なんでしょうか

373:デフォルトの名無しさん
09/11/07 17:54:11
>>372
Ctrl-Z とか Ctrl-D とか ファイルリダイレクト とか

374:デフォルトの名無しさん
09/11/07 17:54:12
>>372
Windows なら ctrl + z
*nix なら ctrl + d だっけか?

375:370
09/11/07 18:02:17
ありがとうございます

376:デフォルトの名無しさん
09/11/07 18:47:31
define BUF 1024
char buffA[BUF], buffB[BUF];
char** str;
int needss, i, j, x, y;
質問です。上記の変数を利用しプログラムを記述しました。
まったく問題なく実行でき、さらに処理を追加しようと新たに
char buffC[BUF]という配列を宣言すると、エラーを吐くようになりました。
どうも、char型の変数を増やすとbuffBに文字列が格納された瞬間にエラーがでます。
変数名を変えても改善しませんでした。
プログラム自体には問題なく、当然コンパイラーは警告すらでません。
何が問題なのかまったく分からず困惑しています。
変数名が悪いのか、配列の要素数が全体で見れば多すぎるのかと思いましたが、そんなことはないはずですよね・・。

環境はUbuntu9.04 コンパイラGCC エディタEmacsです。
エラーの考えられる原因はなんでしょうか。


377:デフォルトの名無しさん
09/11/07 18:50:07
object-CってC使いに易しいかな?
iMacポチって待機中なんだけど…

378:デフォルトの名無しさん
09/11/07 18:53:18
>>376
スタックオーバーフローか未初期化のポインタで何か操作しようとしてる可能性が高い

379:デフォルトの名無しさん
09/11/07 19:07:01
>>378

ポインタはmallocでメモリを確保しています。
というか、変数を追加しなくても、実行できなくなりました・・。
mallocで確保したメモリがfreeで解放できずスタックオーバーフローになっているという落ちとかでしょうか。。

380:デフォルトの名無しさん
09/11/07 19:13:01
malloc はスタック関係ねー

381:デフォルトの名無しさん
09/11/07 19:13:11
>>379
bufBに文字列が格納された時にエラーが発生という
場合、格納しようとしている文字列に問題があると
考えられる。多分読み出してはならない領域を
指すポインタだとか....
正確なことはソース見なければわからないんで
うpローダ使ってアげてみたら?

382:デフォルトの名無しさん
09/11/07 19:15:04
まあどうせ単なるショボバグだろうな。


383:デフォルトの名無しさん
09/11/07 19:18:20
コンパイラのせいにしたいのがみえみえ

384:デフォルトの名無しさん
09/11/07 19:19:29
>ポインタはmallocでメモリを確保しています。

というが、

>define BUF 1024
>char buffA[BUF], buffB[BUF];
>char** str;
>int needss, i, j, x, y;

の中にあるポインタはstrしかなく、
そこにmallocの戻り値を格納するとしたら、多分
(charの配列ではなく)char*の配列を確保しているわけで
何かもうそもそもソースがおもしろいことに?^^

385:376
09/11/07 19:22:31
ネタコメント削除してソースうpしますです。。

386:デフォルトの名無しさん
09/11/07 19:24:04
(* (char *) ABC_easy_as_a_123)(int);

これどういう意味ですか。
ポインタ型charにキャストするなら最初からそうやったらいかんのですか。

387:デフォルトの名無しさん
09/11/07 19:25:56
>>386
関数のポインタだろうけど、なんぞこれw

388:376
09/11/07 19:33:16
URLリンク(codepad.org)

うpしました。ダメ出しお願いします。

389:デフォルトの名無しさん
09/11/07 19:34:35
struct SomeStruct
{
// ・・・
};

と書けばいいのになんで

typedef struct
{
// ・・・
}
SomeStruct;

と書くのが巷で流行ってるの?


390:デフォルトの名無しさん
09/11/07 19:39:41
structをtypedefしないんだったらそいつへのポインタを
使うのはダサイかも

391:デフォルトの名無しさん
09/11/07 19:40:35
ヒント:構造体を使う時

392:デフォルトの名無しさん
09/11/07 19:42:56
構造体は、struct タグ名 で宣言するが
これで宣言したのはタグ付きの構造体の中身であって、
型として認められていない。
ここでtypedef を用いると、「SomeStruct型の構造体である」ことを認めさせることになる。

typedefを使わないと、
 struct SomeStruct MyStruct;
と別に一行必要になり。これでようやくSomeStruct型の構造体と認められるわけだ


つまり、構造体の「型宣言」と同時に「構造体として使えるように名前もつけてしまおう」という横着した手法なだけだ。

構造体は、述べたように最初の段階では使用できる構造体として認められない。
必ず、「SomeStruct型の構造を持つ○○」という名前をつけてやらなければ使用できない。
だからtypedefで型と名前を同時に決めることもよくある話。

393:デフォルトの名無しさん
09/11/07 19:47:01
C++だと、これを勝手にやってくれちゃってんで面倒なことにもなりかねない。
Cの頃からtypedef structでやっていればC++って何て便利なんだ!と思うかもしれないが
あれは余計なお世話といってよい。

394:デフォルトの名無しさん
09/11/07 19:47:04
理屈っぽ

395:デフォルトの名無しさん
09/11/07 19:49:40
>>388
/*ここで必要な箱の数が分かったのでmallocで領域を確保*/
/*forで必要な行数回、1行の文字数のchar型の領域を作成*/
str = ( char ** )malloc( sizeof( char * ) * ( needBr + 1 ) );
for (i = 0; i <= needBr; i++){
str[i] = ( char * )malloc(oneLineLen * sizeof (char) + 1);
}


396:デフォルトの名無しさん
09/11/07 19:52:04
>>392
なんか勘違いしてるっぽいな。

397:デフォルトの名無しさん
09/11/07 19:53:53
strに実体がないような?

398:デフォルトの名無しさん
09/11/07 19:57:45
str = ( char ** )malloc( sizeof( char * ) * ( needBr + 1 ) );

思いっきり書き忘れていました・・。
しかも括弧付けわすれで評価が意図しない形になる(はず)になっていました。
charが1バイトなので+1で大丈夫だっただけですよね・・。

399:デフォルトの名無しさん
09/11/07 20:01:04


400:デフォルトの名無しさん
09/11/07 20:03:02


401:376
09/11/07 20:11:20
9文字入力して4文字で改行で実行したりすると
*** glibc detected *** ./a.out: double free or corruption (out): 0x082b9018 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7dfc604]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7dfe5b6]
./a.out[0x8048823]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7da3775]
./a.out[0x8048521]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out
08049000-0804a000 r--p 00000000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out
0804a000-0804b000 rw-p 00001000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out
082b9000-082da000 rw-p 082b9000 00:00 0 [heap]
b7c00000-b7c21000 rw-p b7c00000 00:00 0
b7c21000-b7d00000 ---p b7c21000 00:00 0
b7d8c000-b7d8d000 rw-p b7d8c000 00:00 0
b7d8d000-b7ee9000 r-xp 00000000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7ee9000-b7eea000 ---p 0015c000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7eea000-b7eec000 r--p 0015c000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7eec000-b7eed000 rw-p 0015e000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so
b7eed000-b7ef0000 rw-p b7eed000 00:00 0
b7ef0000-b7efd000 r-xp 00000000 08:08 2779 /lib/libgcc_s.so.1
b7efd000-b7efe000 r--p 0000c000 08:08 2779 /lib/libgcc_s.so.1
b7efe000-b7eff000 rw-p 0000d000 08:08 2779 /lib/libgcc_s.so.1
b7eff000-b7f03000 rw-p b7eff000 00:00 0
b7f03000-b7f04000 r-xp b7f03000 00:00 0 [vdso]
b7f04000-b7f20000 r-xp 00000000 08:08 6255 /lib/ld-2.9.so
b7f20000-b7f21000 r--p 0001b000 08:08 6255 /lib/ld-2.9.so
b7f21000-b7f22000 rw-p 0001c000 08:08 6255 /lib/ld-2.9.so
bf80c000-bf821000 rw-p bffeb000 00:00 0 [stack]
Aborted
とかもうね・・・。

402:376
09/11/07 20:15:23
謎のエラーはmallocが1行抜けてたからのようです。。
395さんはじめありがとうございました・・。

403:デフォルトの名無しさん
09/11/07 20:34:31
この先、メモリが10GBとかになったらC言語じゃ対応できなくね?
CってポインターがINTで4294967295までしか設定できないよね
それ以上のアドレスは指定できないけどどうすんの?アドレスが5000000000とかの指定できなくね?おわた

404:デフォルトの名無しさん
09/11/07 20:41:56
はいはいワロス

405:デフォルトの名無しさん
09/11/07 20:44:30
ポインタがint値だなどと誰が決めたのだ。
ポインタはポインタであってポインタでしかない。
多くの実装でlong intに変換可能だというだけ。
なんだったら見たこともない宇宙文字列で実装してもいいのだ。

406:デフォルトの名無しさん
09/11/07 20:54:08
>>403
どれでもいいから 64bit 版のコンパイラで sizeof(void*) を表示してみそ

407:デフォルトの名無しさん
09/11/07 20:56:10
long long long long long long long long long long long long long long long long long long long long int

408:デフォルトの名無しさん
09/11/07 20:57:50
>403
メモリが10GB(仮想記憶含まず)ならCPUもそれを指定できないとダメ子さんになるから
(intは何ビットか計算するの面倒だからやらないまぁ、64bitで十分だろうけど)
CPUのbit数xが10G < pow(2, x)を満たす必要がある
intはpow(2, x)なるbit数であるのが一般的である

また、規格ではポインタがintに変換できるとは書かれていない
C99からintptr_tとか入った気もするけど、マジックリストにでも使うんですか
とか思って特に調べていない

409:デフォルトの名無しさん
09/11/07 21:02:02
某ランドのコンパイラとかがC99に対応していない
long longが使えない

410:デフォルトの名無しさん
09/11/07 21:04:17
C99 はロールバックしたうえで、C201x を練り直して欲しい

411:デフォルトの名無しさん
09/11/07 21:07:07
>>403

2038年までにはCは終わってる

412:デフォルトの名無しさん
09/11/07 21:09:47
>>409
long long 使えるよ
C99には対応してないけど
ECC6.1.0(Embarcadero C++ Compiler)な

413:デフォルトの名無しさん
09/11/07 21:16:44
time_t を使っているからコンパイラが対応してれば 2038年は超えられる

414:デフォルトの名無しさん
09/11/07 21:20:51
そりゃ何とかするでしょ
もっと新しいいい言語が出ていればそっちに変わっているだろうが、
2038年にまだC言語が使われていれば何とかするしかない

415:デフォルトの名無しさん
09/11/07 21:22:27
あと30年も生きていられるわけないじゃないか^^

416:デフォルトの名無しさん
09/11/07 21:25:08
おまえ何歳だ?

417:デフォルトの名無しさん
09/11/07 21:28:06
30年もすれば日本は消滅して日本人は貧困にあえぎプログラミングどころかパソコンに触る機会もないよ

418:デフォルトの名無しさん
09/11/07 21:28:45
C言語で楽しくプログラミングする人の集まるスレだから、アンチは別のスレに行ってよ
time_tを変えて再コンパイル、リンクするか64bitCPUに移行すれば、2038年問題なんて大したことではない
30年後もx86さまさまの人は時代後れを認識した方がいいと予言しておく

419:デフォルトの名無しさん
09/11/07 21:29:49
64bitCPUとtime_tは関係があるわけ?

420:デフォルトの名無しさん
09/11/07 21:31:16
64bitCPUにすれば今までのtime_tは2038年以降も正常に動くんだよ

421:デフォルトの名無しさん
09/11/07 21:35:09
先延ばししただけじゃねーの?

422:デフォルトの名無しさん
09/11/07 21:40:35
先延ばしじゃない方法があるのか?

423:デフォルトの名無しさん
09/11/07 21:44:57
永遠はあるよ

424:デフォルトの名無しさん
09/11/07 21:49:41
time_tは有限?

425:デフォルトの名無しさん
09/11/07 21:50:37
その都度仕様を変えれば無限とも言える

426:デフォルトの名無しさん
09/11/07 22:01:29
64bit でも 292277026596年問題が残るが、その頃のマシンがバグったらグレートウォールごと吹っ飛ぶとかあるのかな

427:デフォルトの名無しさん
09/11/07 22:04:34
そこまでくると、さすがに超人ロックくらいしか生きてないだろうな

428:デフォルトの名無しさん
09/11/07 22:04:51
>>426
その頃にはさすがに人類は死滅してるよ

429:デフォルトの名無しさん
09/11/07 22:07:17
>>420
CPU関係ねーよカス

430:デフォルトの名無しさん
09/11/07 22:08:23
嫌味で言ったつもりだったが、なに釣られてんのwww

431:デフォルトの名無しさん
09/11/07 22:08:38
いやいや。
今仮に18歳のぴちぴち大学1年生でも
30年後は48歳だよ?

48歳の人はあんまりもうプログラムはしてないんじゃないかな。
経営側か、現場であっても少なくとも設計よりの仕事をしていて
もうやりたくてもプログラムなんてさせてもらえなくて
夜遅く家に帰ると妻はうるさく、娘には嫌われ、
トイレ横の物置を改造して作った名ばかりのパソコンルームに
30年前に自作したコンピュータがおいてあって、
それの電源をいれてほそぼそと趣味のコードを打ち込むのが日課だったり^^

432:デフォルトの名無しさん
09/11/07 22:11:43
>>428
そう思うと勿体ないよな。
これだけの科学技術を創り出すのに、どれだけの時間がかかったことか。

再び文明が生まれたとしても、車輪の再発明をするだけだ。

433:デフォルトの名無しさん
09/11/07 22:13:29
地球が始まった時間に比べれば一瞬の出来事

434:デフォルトの名無しさん
09/11/07 22:21:49
>>432
人間が生まれて600万年
だが技術革命はここほんの100年余りの事だ

435:デフォルトの名無しさん
09/11/07 22:22:40
もしかしたら今が本来の人間の姿からかけ離れて
どうかしてるかもしれないって話

436:デフォルトの名無しさん
09/11/07 22:23:45
は?詳しく話してくれないか?それを

437:デフォルトの名無しさん
09/11/07 22:23:58
他の惑星に移住してて、そこで新たにタイムテーブル作ってるから問題なしとか

438:デフォルトの名無しさん
09/11/07 22:24:55
リフボードでトラパーの波に乗るんだろうな

439:デフォルトの名無しさん
09/11/07 22:53:51
UFOに乗ってる宇宙人なんか肉体無いらしいよ
これ以上はオカルト板でしようぜ

440:249
09/11/07 23:38:09
>>249です。
まず1列目に1〜9の数字を入れようとして
以下のようなプログラムを作りました。
URLリンク(www.dotup.org)
しかし上のプログラムでは1列目に同じ数字が出てしまうので
1行目に出た数字は2,3行目には出ないようにしたいです。
それを改良したいのですが方法が分かりません。
教えてください。

441:デフォルトの名無しさん
09/11/08 00:12:03
>>440
何がどうなって欲しいの?

442:デフォルトの名無しさん
09/11/08 00:19:22
10進数を10桁の2進数に変換したいんだけどどうやったらいいかわからない
8とか16進数なら表示できるのわかるんだけど、2進数って簡単に表示できないんだっけ?

443:デフォルトの名無しさん
09/11/08 00:21:06
C言語は2進数はサポートしてないからね

444:デフォルトの名無しさん
09/11/08 00:22:00
AND取ってループすれば出せるでしょ

445:デフォルトの名無しさん
09/11/08 00:22:53
8進数とか16進数の表示を自前でやってみたら

446:デフォルトの名無しさん
09/11/08 00:24:30
2で割っていけばいいんでは?

447:デフォルトの名無しさん
09/11/08 00:27:08
>>442
limits.hをインクルードしてsizeof(int) * CHAR_BITで
intのビット数を求め、10進数をunsignedにキャストして←ここ重要
1UL << (sizeof(int) * CHAR_BIT - 1)のマスクとandを取った結果が
0か1かを書きだして行く
マスクは>>で右シフトしてループ



448:デフォルトの名無しさん
09/11/08 00:27:48
>>441

>>440のプログラムでは

100
100
300
など一列目に同じ数字が出ることがあるので

500
600
200
のように一列目の各行におなじ数字が出ないように改造したいです

449:デフォルトの名無しさん
09/11/08 00:32:10
#include <stdio.h>

int main() {
int beam = 10; // チゲ
int i, n ; // counter
for ( n = 0; n != 1024; ++n ) {
printf( "%d : ", n );
for ( i = 0; i != beam; ++i ) {
printf( "%d", n >> ( beam - i - 1 ) & 1 );
}
printf( "\n" );
}
}

450:デフォルトの名無しさん
09/11/08 00:44:32
>>448
1〜9 までの重複しない3つの数字が欲しいだけ?
もしそうならこれでおk

{
int i, x, n[9];
for(i=0;i<9;i++) n[i]=i+1;
for(i=0;i<9;i++)
{
x=rand()%(i+1);
t=n[i];
n[i]=n[x];
n[x]=t;
}
for(i=0;i<3;i++) cardForNumbers[i+1][1]=n[i];
}

451:デフォルトの名無しさん
09/11/08 00:52:23
先生質問です。

char *ptrを引数として他の関数に渡す時は
other_Kansu (&ptr); ですよね?

char **ptrを引数として渡すときはどうなるんでしょうか?
other_Kansu (&*ptr)ですか?

452:デフォルトの名無しさん
09/11/08 00:58:19

ちょっくら驚く豆知識

なんと!
なんとなんとなんと!
なんとなんとなんとなんとなんとなんと!

4bit CPUでも128bitデータなどを扱えるのである!!!!!!!!!!!!

何をバカな、と思ってるのは素人である。ド素人である。
4bit CPUでは、128bitデータを「1サイクルで」レジスタなどに格納できないだけであって
128 / 4サイクル使って上位4bitもしくは下位4bitから順番にメモリに128bitぶん格納していけばよいのだ。

バカか手前等。

453:デフォルトの名無しさん
09/11/08 00:58:22
面白い質問ですね^^

void other_Kansu( char ** ) に char *ptr を渡したいときは other_Kansu( &ptr ) です。
void other_Kansu( char ** ) に char **ptr を渡したいときは other_Kansu( ptr ) です。
&*ptr でもいいですが、それは結局 ptr です。

多分。

454:デフォルトの名無しさん
09/11/08 01:01:19
>>451
両方違うともいえるし、両方合っているともいえる

455:デフォルトの名無しさん
09/11/08 01:07:16
>>453
非常にややこしいですね・・。

>void other_Kansu( char ** ) に char **ptr を渡したいときは other_Kansu( ptr ) です。
passing argument 1 of ‘ptr' makes integer from pointer without a cast
って言われるんですが無視でいいんでしょうか・・?

>>454
正解は存在しますか・・?


456:デフォルトの名無しさん
09/11/08 01:27:21
&* はC言語の仕様上はダメなんじゃないの?

int a=10, *p=&a;
のとき
&*p って &10 でしょ

457:デフォルトの名無しさん
09/11/08 01:36:22
ptr が char** だから *ptr は char* であるので
依然としてアドレス演算は可能でしょう^^

>passing argument 1 of ‘ptr' makes integer from pointer without a cast

その警告は今回の件とは直接には無関係です^^

458:デフォルトの名無しさん
09/11/08 01:37:03
>>447
右シフト使わない前者のでunsignedにする理由って何?

459:デフォルトの名無しさん
09/11/08 01:38:43
こいつは何をいっているんだ

460:デフォルトの名無しさん
09/11/08 01:39:01
451は、なにか、勘違いしてるような?

461:デフォルトの名無しさん
09/11/08 01:39:27
int a=10, *p=&a;
*p は a のアドレス(仮に1000番地)を保持

&*p は 1000番地のアドレスを指すので
&10ではなくて &(1000番地)で結局1000番地
1000番地は10

ってなる気がする

462:457
09/11/08 01:40:41
あ、上の2行と下の2行は別の書き込みへのレスです^^
ごっちゃになってしまいました^^

463:デフォルトの名無しさん
09/11/08 01:42:11
>>452
いきなり何の話してんの?
上のメモリに関する話にしては話がズレすぎてるし、その豆知識をどうしたいんだ。

>>455
深く考えすぎ。

464:デフォルトの名無しさん
09/11/08 01:44:48
>>457

キャストなしで整数になるの意味が分からないんですが、引数の受け渡し方があってるならどっか根本的に勘違いが発生してそうです・・。
違う視点から警告と向き合ってみますです。

どうもありがとうございました><

465:デフォルトの名無しさん
09/11/08 01:50:11
>>464
変数の宣言部、関数のプロトタイプ、関数の実装部を見直してみてはどうか。

466:デフォルトの名無しさん
09/11/08 01:53:13
>>464
今ちょうど見直してましたが、間違っては無さそうです。
他の関数へは上手く**ptrが渡せてるみたいなのですが・・。
該当部分をもう一度書き直して見ます・・。

467:デフォルトの名無しさん
09/11/08 01:54:38
>466
ソースきぼん

468:デフォルトの名無しさん
09/11/08 02:02:05
>>467

変数名とか・・・かなり恥ずかしいんですが(/////)
URLリンク(codepad.org)

469:デフォルトの名無しさん
09/11/08 02:02:55
>>467

hoge.c:68: 警告: passing argument 1 of ‘addStr’ makes integer from pointer without a cast
書き忘れました。。


470:デフォルトの名無しさん
09/11/08 02:07:30
void addStr (char *causeBuf, int causeNeedBr, int causeOneLineLen, char** causeStr)

471:デフォルトの名無しさん
09/11/08 02:11:06
>>470

お、お見事です・・。

472:デフォルトの名無しさん
09/11/08 02:16:36
完全に見るところを間違えてました・・。
ゴールが見えそうです。
ありがとうございました><

473:デフォルトの名無しさん
09/11/08 02:21:08
argument 1 of ‘addStr’
ちゃんと警告よみましょうねっていう。

474:デフォルトの名無しさん
09/11/08 02:23:23
英語の知識か日本語のコンパイラがあれば読めてました><

475:デフォルトの名無しさん
09/11/08 02:26:34
英語が読めなくてもいいから、今回のような失敗の時はこういう警告がでるのだということを覚えておくといいよ。
そうすれば、次に同じ警告が表示されたとき、やっぱり読めないけど、
一個目のパラメータに変なの渡してるんだなということが分かるようになる。

これはこれで慣れ。ガンガレ


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5399日前に更新/137 KB
担当:undef