【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131at TECH
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131 - 暇つぶし2ch350:デフォルトの名無しさん
07/04/09 14:56:45
>349
そんなアホナ。。。

351:デフォルトの名無しさん
07/04/09 15:00:27
ワロタ

stat とか fstat で

352:デフォルトの名無しさん
07/04/09 15:11:31
環境依存

353:デフォルトの名無しさん
07/04/10 12:13:30
program.exe arg1 arg2 arg3 ....

と何個でも、何文字でも無制限にいけるのか?

354:デフォルトの名無しさん
07/04/10 12:27:41
引数の長さには通常制限があるが、環境依存。
ARG_MAXでぐぐれ。

355:デフォルトの名無しさん
07/04/10 12:39:20
制限はあるけどそれはプログラムの方の制限じゃないよ

356:デフォルトの名無しさん
07/04/10 20:30:12
ARG_MAXはPOSIXだと思う

357:デフォルトの名無しさん
07/04/11 00:27:46
うん

358:デフォルトの名無しさん
07/04/11 00:30:27
シェルの制限かと思ってた

359:デフォルトの名無しさん
07/04/12 22:37:03
>>349
できました! ありがとうございます!

360:デフォルトの名無しさん
07/04/13 01:54:24
>359
mjky

361:デフォルトの名無しさん
07/04/13 15:40:58
malloc とか free に一枚皮を被せるって常識なの?

void Free(void *ptr)
{
  if (ptr != NULL) free(ptr);
}
こんなようなの、、、


362:デフォルトの名無しさん
07/04/13 15:50:03
少なくとも、free() にNULL渡すのは問題ない仕様だから
それは意味無いな。

363:デフォルトの名無しさん
07/04/13 15:50:40
違った delete に渡すのが問題無いんだった

364:デフォルトの名無しさん
07/04/13 15:51:15
>>361
常識ではないし、標準Cなら
| free 関数は、ptr が指す領域を開放し、その後の割付けに使用できるようにする。
| ptr が空ポインタの場合、何もしない。
ので、まったくの無駄。

もっとも、malloc/free のトレースをしたいという目的で
ラップするのはアリ。

365:デフォルトの名無しさん
07/04/13 16:46:05
メモリリーク検出には役立つかも知れない

366:デフォルトの名無しさん
07/04/13 23:45:45
>>361
ペアであるmalloc/freeのインターフェイスをよりペアらしくできるから、
オレはこんな感じにすることがある。

result_type my_malloc(void **ptr, int size)
{
  *ptr = malloc(size);
  return (NULL != *ptr) ? result_success: result_faild;
}

result_type my_free(void **ptr)
{
  if (NULL == *ptr)
  {
    free(*ptr);
    *ptr = NULL;
  }
  return result_success;
}

367:デフォルトの名無しさん
07/04/14 00:02:53
void**はないだろ、常識的に考えて…

368:デフォルトの名無しさん
07/04/14 00:04:43
スレタイを100回音読すべきだな

369:デフォルトの名無しさん
07/04/14 00:25:26
>>367
間違えやすいよな.C++なら参照使えばいいけど,
Cならマクロ使った方がいい局面かも.

370:デフォルトの名無しさん
07/04/14 00:42:17
自分用ツールだったら、よくmallocが0を返したら即exit(1)するラッパを使う。
C++を使えるときにはnewを使えばいいんだけど。

371:デフォルトの名無しさん
07/04/14 02:43:50
>>366
my_freeは、渡されてきたポインタがNULLの時にのみ解放してるけど、それでいいの?
というか単純ミスだよなw

372:デフォルトの名無しさん
07/04/14 02:57:19
my_free(NULL);

373:デフォルトの名無しさん
07/04/14 09:31:55
linuxの場合は、malloc()が成功したかどうかは、実際にメモリにアクセスするまで分からないから、
malloc()の戻り値をチェックするのは無駄だって説もあるな。

374:デフォルトの名無しさん
07/04/14 09:45:08
>>373
カーネルの設定換えれば検出できるようになるね。
さもなくば、calloc()で検出できるんじゃないか?

375:デフォルトの名無しさん
07/04/14 10:05:41
そんな環境依存の話を書かれても

376:デフォルトの名無しさん
07/04/14 10:12:33
つまり、このスレ的にはmalloc()の戻り値を検出するためだけのラッパは要らないということで。

377:デフォルトの名無しさん
07/04/14 10:23:45
仕様的にはmallocの時点で割り当て失敗かどうか検出できないのってどうなの?

378:デフォルトの名無しさん
07/04/14 10:31:26
WindowsもたぶんVirtualAlloc使うと、実際にアクセスするまで確保されない
ってこのスレじゃ関係ないね

379:デフォルトの名無しさん
07/04/14 11:49:59
今ググても見つからなかったけど、俺が読んだ文章だと「近代的なOSだと、そういうふうになってる」みたいな言い方だったね。
mallic()で0を返さないって。

380:デフォルトの名無しさん
07/04/14 11:54:59
マリックwwwww

381:デフォルトの名無しさん
07/04/14 15:47:16
>>373
malloc()は、システムコールじゃないよ。libcの関数だよ。
わかってる?

382:デフォルトの名無しさん
07/04/14 15:58:38
>>377
駄目。

malloc()の実装のサンプル(システムコールとの関係)はK&Rにも載ってるから
興味がある人は目を通して理解しておくと良いよ。
知ったかぶりすると恥ずかしいから。

Windowsで言うなら、
VirtualAllocは確保できなくても0以外を返すかもしれない(実際は知らない)けど
HeapAlloc(OSからもらったメモリを必要な分だけに区切って渡す)は
確保出来ないときは0(NULL)を返すということ。
(サイズ情報等を埋め込むから、必ず実際のメモリにアクセスする)
VC++なんかのmallocは、HeapAllocをそのまま呼んでるだけだし。

383:デフォルトの名無しさん
07/04/14 16:11:45
URLリンク(www.linux.or.jp)
> デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が
> NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。
> これは本当にまずいバグである。
なるほど、確かにこれはバグだと言っている

384:デフォルトの名無しさん
07/04/14 16:19:02
ヒント: 管理情報はアプリケーションに返すメモリブロックに隣接している必要はない
malloc()がどう実装されてるかなんてそれこそ環境依存以外の何者でもない
とはいえ利用可能でないのにNULLを返さないのは規格違反だろうな

385:デフォルトの名無しさん
07/04/14 16:23:15
なるほど、
アドレス空間が足りない時等「一般的にmallocがNULLを返す状況」では無く、
システム全体(カーネルと各プロセス最小限使用分)の「物理メモリ」が不足する状況で
プロセスの存在そのものが抹消されるわけね。
それも、自分自身とは限らないプロセスが。

386:デフォルトの名無しさん
07/04/14 16:25:23
とはいえ、どう考えても、これが「近代的なOS」と関係あるとは思えない。

「近代的なOS」が使っているのは、仮想記憶とデマンドページングだろ。
mallocが失敗してもNULLを返さないのとは関係ない。

387:デフォルトの名無しさん
07/04/14 16:26:27
つまり、このスレ的にはLinuxのlibc(におけるmalloc()の実装)は間違いだということですね。

388:デフォルトの名無しさん
07/04/14 16:30:32
Linuxはカーネルだけだから理論的にはまともな実装をしたlibcに置き換えることもできる。
glibcと言っておこう

389:デフォルトの名無しさん
07/04/14 16:31:52
>>384
でも、とりあえず、manでヒープの破壊について触れているくらいだから
今話題のLinuxのglibcの実装に関しては、
確保したブロックの前後に管理ブロックがあると、仮定しても構わないでしょ。

390:デフォルトの名無しさん
07/04/14 16:33:25
じゃあどういう状況でNULLを返さないことがあり得るんだろう。
アプリケーションに返すメモリがたまたまページ境界にまたがったときかな

391:デフォルトの名無しさん
07/04/14 16:38:02
>>390
いや、>>385な状況で、実際に物理メモリが足りないと判明する時でしょ。たぶん。
ページ境界の可能性もあるけど、大きなブロックを確保して真ん中にアクセスした時とかも。

ていうか、この場合、メモリ不足が
「アクセスするまでわからない」じゃなくて「絶対にわからない」だな。
分かった瞬間に検出することも出来ないまま殺されちゃうんだから。
>>373の「NULLチェックが無駄かも」という結論は一緒かもしれないけど。

392:デフォルトの名無しさん
07/04/14 16:38:04
あとページサイズを超える大きなメモリブロックを割り当てた場合
最初のページだけは管理情報の書き込み時点でコミットされるけど
2ページ目以降を踏んだとたん落とされる可能性がある

393:デフォルトの名無しさん
07/04/14 16:38:28
2秒差でかぶったorz

394:デフォルトの名無しさん
07/04/14 21:09:29
ハードウェアの制限で256の倍数でデータを書き出しを行いたいのですが
端数が出た場合の処理はどのように実現するのがスマートなのでしょうか。

データは必ずシーケンシャルに確実に書き込まれる必要があって困っています。
携帯開発辛い...



395:デフォルトの名無しさん
07/04/14 21:14:10
>>394
言語と何ら関係がない質問なので、スレ違い。

まぁ、切り捨てていいなら切り捨てるし切り捨ててはいけないなら補うだけだな。
尤も、補う方法もダミーを詰めるだけでいいのか適当に間引く必要があるのか知らんが。

396:デフォルトの名無しさん
07/04/15 02:13:31
>>394
許されるバッファサイズと
書き込みサイズ > 256
書き込みサイズ ~= 256
書き込みサイズ <<< 256
で, 解が 異なると思うんだが...


397:デフォルトの名無しさん
07/04/15 08:03:22
>>396
馬鹿晒さなくていいから。

398:デフォルトの名無しさん
07/04/15 12:16:27
n: アライメント
書き出しサイズ (data_size + (n-1)) / n * n

n が2の累乗数なら (data_size + (n-1)) & ~(n-1) で代用可能

399:デフォルトの名無しさん
07/04/15 17:27:09
>>382
VirtualAllocがメモリの予約やコミットに失敗した時は
NULLを返すのは保証されてるよ~

400:デフォルトの名無しさん
07/04/15 19:59:29
完璧にスレ違いだけどな

401:デフォルトの名無しさん
07/04/21 04:35:16
フラッシュの書き込みとかやったなあ、なつかしい

402:デフォルトの名無しさん
07/04/22 23:30:12
ファイルのサイズを取得する方法として
fseek()でSEK_ENDに移動して
ftell()の戻り値を取得する方法を使っていたんですが、
どこかのサイトに
「バイナリモードでファイルをオープンした時はSEEK_ENDの値が保証されない」
みたいな事が書いてありました
理由がよくわからないんですが、なぜなんでしょう

403:デフォルトの名無しさん
07/04/23 00:08:58
その管理者に「日本語でおk」とメールしろ

404:デフォルトの名無しさん
07/04/23 00:10:45
ISO/IEC 9899:1999 7.19.9.2 The fseek function / Para.3

3 For a binary stream, the new position, measured in characters from the beginning of the
file, is obtained by adding offset to the position specified by whence. The specified
position is the beginning of the file if whence is SEEK_SET, the current value of the file
position indicator if SEEK_CUR, or end-of-file if SEEK_END. A binary stream need not
meaningfully support fseek calls with a whence value of SEEK_END.

だそうだ、詳しくは知らない

405:デフォルトの名無しさん
07/04/23 00:11:27
>>402
SEEK_ENDの値が保証されない
でググって最初のやつ

406:デフォルトの名無しさん
07/04/23 00:24:42
>>402
URLリンク(takagi.in)
このページか? 大嘘だから無視していい

The fseek() function sets the file position indicator for the stream
pointed to by stream. The new position, measured in bytes, is obtained
by adding offset bytes to the position specified by whence. If whence is

...

The fgetpos(), fsetpos(), fseek(), ftell(), and rewind() functions con-
form to ISO/IEC 9899:1990 (``ISO C90'').


407:デフォルトの名無しさん
07/04/23 00:31:34
ファイルサイズをバイト単位で管理しないファイルシステムがあった大昔のためだろ。
テキストファイルはファイル終端を表すEOFコードを書き込んでいたが、
バイナリファイルではそうもいかないため終端へのシークができない
(あえてやるとすればブロックなどといったもう少し大きな単位での終端までいってしまう)
ということのはず。

408:デフォルトの名無しさん
07/04/23 05:10:49
>406のページは他にも嘘が……

409:デフォルトの名無しさん
07/04/23 05:26:59
>>407
CP/Mがそんなだったかな。
EDLINEとかDOS用のエディタでテキストファイルを作ると最後に^Zが付くのはその名残。

410:デフォルトの名無しさん
07/04/23 19:21:07
副作用完了点について質問があります。

1) どこだったか忘れてしまったのですが、ネット上の文書で
「カンマ演算子はインクリメント/デクリメントの副作用完了点にならない」
というような記述を読みました。これは正しいのでしょうか?
i++, i++; としてはならないと書いてありました。

2) int *f(int *p) { return p; } という関数があったとして、
以下の例は合法でしょうか?
int i;
*func(&i) = 1;
*func((++i, &i)) = 1;

3) 関数 int g(int); について、式 (++i * g(++i)) の 二つの ++i の評価される順序や、
式 (g/*1*/(i) + g(g/*2*/(i))) で g/*1*/ と g/*2*/ が呼ばれる順序は定義されていますか?

よろしくお願いします。

411:デフォルトの名無しさん
07/04/23 19:54:58
++i と i++ で処理が変わるようなプログラムは
今の時代書くべきじゃない。

412:デフォルトの名無しさん
07/04/23 19:56:19
++i や i++ を何かに突っ込んだプログラムもな。
a[i++] = b; とか。
読みやすいプログラムを書け。

413:デフォルトの名無しさん
07/04/23 19:57:42
>>411,412
なんで乞われてもいないのに語りだすん?

414:デフォルトの名無しさん
07/04/23 20:08:42
引数を列挙する時のコンマは副作用完了点にならないけど、
コンマ演算子は副作用完了点になるはずだと思うんだけど。

415:デフォルトの名無しさん
07/04/23 21:05:46
論理積 (&&)、論理和 (||)、カンマ演算子 (,)、三項演算子 (?:) の評価順は左から。
その他の演算子は不定。なので
1) は「正しくない」
2) は「合法」
3) は「定義されていない」

>>413
>>411-412 は、今何の話をしているかをまったく理解できていないものと思われる。

416:デフォルトの名無しさん
07/04/23 21:27:43
でも、よく下のような使い方は見るよね

int a,b

for(i=0;i<10;i++)
{
  *a++ = *b++;
}

417:デフォルトの名無しさん
07/04/23 21:43:38
>>416 それがどうした?

418:デフォルトの名無しさん
07/04/23 21:47:41
>>416
見ないし、見たくない。

419:デフォルトの名無しさん
07/04/23 22:15:36
>>416
以下を、突っ込んで欲しい順に並べてください。
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?
ウ・aとbはポインタちゃうやろ!!

420:デフォルトの名無しさん
07/04/23 22:20:26
>>419
ウ・aとbはポインタちゃうやろ!!
ア・「でも」は何処に掛かってんだ!?
イ・更に話題を発散させるつもりか!?


421:402
07/04/23 22:26:44
みなさん回答ありがとうございます

> A binary stream need not meaningfully support fseek calls with a whence value of SEEK_END.

という事は厳密には移植性が無いって事でいいんですかね

と思ったんですが

>>406 マジすか?混乱してきました
>>408 後学のためにどこか教えていただけますか?

422:デフォルトの名無しさん
07/04/23 22:44:09
>>421
例えばこの辺。
> Linux などの Unix 系 OS の環境では、テキストモードとバイナリモードの区別がないという表現がよく見受けられますが、
>それはあくまでもナロー文字を扱っている場合のことであり、ワイド文字を扱う場合には当てはまりません。
>また、たとえ Unix 環境でナロー文字しか扱わない場合であっても、移植性の高いコードを書くには、
>テキストモードとバイナリモードを等価なものと考えてはいけません。

ここを見れば判るが、POSIXではそもそもそんなモードがない。
URLリンク(www.linux.or.jp)

423:デフォルトの名無しさん
07/04/24 00:44:29
カンマ演算子について、

while ((c = getchar()) != EOF) {}
なんて書き方を良く見るが、たまに
while (c = getchar(), c != EOF) {}
の方が分かりやすい人も居るんじゃないかと思ったりする。
(優先順位等が分かっている人には)

ただ、K&R等で上の書き方が使われているし、
一般的に「慣れている方が分かりやすい」という観点からは
やはり上の形なのかな、と思う。
K&Rで上の形式なのは、大昔の非最適化コンパイラの都合もあるだろう。

424:デフォルトの名無しさん
07/04/25 15:10:10
dirent_t構造体のメンバ変数でd_typeというのがあるのですが、
これの示す値がどのように定義されているのかが分かりません。

とりあえず実際に動かして調べてみたところ、
ファイルの場合は8、ディレクトリの場合は4が入ってくるようなのですが、
他にも何か値が入ってくる場合があるのでしょうか?

御教授ください

425:デフォルトの名無しさん
07/04/25 15:14:06
sys/stat.h

426:デフォルトの名無しさん
07/04/25 19:11:37
>>423
確かにカンマ演算子使うのはいいかもな、
ま、俺もどうせ今更だから使わないけど

427:デフォルトの名無しさん
07/04/25 19:31:06
>>423
下の方が分かりやすいとは思うんだけど、
c を2回書かないといけない点は気持ち悪い。
悩ましいところ。

428:デフォルトの名無しさん
07/04/25 22:49:49
すみませんお願いします。
scanfで10桁までの数字を入力し、その10桁の数字を配列に格納するにはどうしたら良いでしょうか?
こんな感じの↓問題なのですが、お願いします。

1.10桁までの任意の数字を入力し、入力した値を配列に格納し、
「何桁目を表示しますか?」を出力し1~10までの任意の数字を入力後
「○○桁目の数字は○です」と出力されるプログラムを作成せよ

ググってもわからないし、全然できないです…orz
どなたか解いてください。

429:428
07/04/25 22:52:19
あ、使用しないとならない関数はscanf printf switch case になります。

430:デフォルトの名無しさん
07/04/25 22:52:36
宿題スレにいけば教えてくれるよ

431:デフォルトの名無しさん
07/04/26 10:21:10
出題者にswitch case は関数じゃない、とつっこんどけ

432:デフォルトの名無しさん
07/04/28 13:57:29
while (GetChar(&c) != EOF) {}

でええやんw

433:デフォルトの名無しさん
07/04/28 14:03:40
なんですかそれは

434:デフォルトの名無しさん
07/04/28 14:33:14
int pos,list[10];
setNum(&list[], sizeof(list));
pos=getPos("何桁目を表示しますか?", sizeof(list));
printf("%d桁目の数字は%dです\n", pos, list[pos] );

こんな感じでおk


435:デフォルトの名無しさん
07/04/28 15:20:44
setNumとかgetPosって何やねん

436:デフォルトの名無しさん
07/04/28 15:37:00
setNum()
配列サイズの個数の任意の数字を入力し、入力した値を配列に格納

getPos()
メッセージを出力し1~サイズ以下の任意の数字を入力させ、それを返却

437:デフォルトの名無しさん
07/04/28 16:24:15
標準Cにそんな関数あるのか?

438:デフォルトの名無しさん
07/04/28 16:42:57
無いなら作れ

439:デフォルトの名無しさん
07/04/28 16:46:46
最初から「宿題は自分でやれ」でええやん

440:デフォルトの名無しさん
07/04/28 20:09:57
御教授ください

とありましたが、「御教示ください」と言ふべきです。

441:デフォルトの名無しさん
07/04/28 22:21:30
「あいにくですが教授の知り合いはいません」と答えておけばいい

442:デフォルトの名無しさん
07/04/28 22:25:40
「教えたまえ」でいいじゃん

443:デフォルトの名無しさん
07/04/30 19:09:20
はらいたまえ、きよめたまえ

444:デフォルトの名無しさん
07/05/01 17:07:22
質問です、プログラムAから別のプログラムBを立ち上げて、
Bの出力する標準出力はディスプレイに出さず全てAが受け取り、
Bが行うscanfなどの標準入力要求時には、すべてAから入力を与えるようにするにはどうすればよいでしょうか。

system,popen等の関数を調べたのですが、実現できません。
一見popenで出来るかと思いきや入力か出力のどちらかしかできないようで困ってます。

手順やキーワードだけでも結構ですので教えてもらえませんでしょうか。

445:gost
07/05/01 17:22:26
符号なし 32bit の変数 a と b があります。
>>
unsigned long a;
unsigned long b;
a と b には任意の値が格納済みであるとして、加算するとオーバー
フロー(0xFFFFFFFFを超える)の場合、"Overflow"、オーバーフロー
しない場合、"(a+b) OK" を出力するプログラム 教えてください
条件:
if((a + b) > 0xFFFFFFFF) の判定は使えません。
if((a + b) <= 0xFFFFFFFF) の判定は使えません。
a と b を加算してはなりません。

446:デフォルトの名無しさん
07/05/01 17:32:29
>>444
popenの第2引数に"rw"使えなかったっけ
あとはforkで起動してパイプつなぐとか

447:デフォルトの名無しさん
07/05/01 17:43:29
>>445
宿題臭いな。宿題スレに行けば。

448:gost
07/05/01 17:46:03
thanks



449:デフォルトの名無しさん
07/05/01 17:51:05
昔、if (x || y || z) よりも if ((x | y | z) != 0) の方が
速くなる可能性がある(コメント必須)という話があったが

if (memcmp(p, "924", 3) != 0) より
if (p[0] != '9' || p[1] != '2' || p[2] != '4') より
if ((p[0] ^ '9' | p[1] ^ '2' | p[2] ^ '4') != 0) の方が
速くなる可能性もあるのかな。(コメント絶対必須で)
もちろん、ショートサーキットの起こる率によっても違うだろうが。


まあ、このケースに限れば(バスエラーが起きない状況なら)
if (*(DWORD *)p & *(DWORD *)"\xFF\xFF\xFF" == *(DWORD *)"924")
の右2つを整数定数に変えたものが最速か。
もちろん、このコードは移植性も無いし可読性もない
最悪のコードではあるのだが。

450:デフォルトの名無しさん
07/05/01 17:51:27
stdioのFILE系で読み書きを同時にするのはトラブルの元だって
たしかrubyの人が言ってた気がする。

451:デフォルトの名無しさん
07/05/01 18:00:03
宿題の答えとしては条件に合わない方法

unsinged long c = a + b;
if(c < a) {
 puts("Overflow");
} else {
 puts("(a+b) OK");
}

∵)
オーバーフローしたとすると、
c = a + b - m (m = 0x100000000)
c >= a だと仮定すると b >= m となるが、b < m なので矛盾する。
従って、オーバーフローした場合は必ず c < a となる。

逆に、オーバーフローしていない場合に
必ず c >= a になるのは自明。

∴ c < a ならばオーバーフローしている。

452:デフォルトの名無しさん
07/05/01 18:06:40
>>449
分岐は基本的にコストが高いから
分岐が少ない方が速くなる可能性はあるけど、
どのくらい速くなるかは
環境と実行条件によるとしか言えない。
だから、よく使われると想定する環境下で実測するしかない。

ただ、よほどじゃないと問題にならない程度の差しかないと思うけどね。今の時代。
数兆周のループの中に入ってるとかでもない限り。

453:デフォルトの名無しさん
07/05/01 18:32:01
a > 0xFFFFFFFF - b
ではいかんか?

454:デフォルトの名無しさん
07/05/01 18:47:24
氏ね

455:デフォルトの名無しさん
07/05/01 19:25:10
>>445
Hacker's Delightの2-12でも読めば?

456:デフォルトの名無しさん
07/05/01 20:51:40
リモートの機器から日、時、分、秒を取得して、
ローカルの日時から、年月を補ってtime_t型通算病
(所謂UNIXタイム)を求めたいのだけど・・

単純にtime, localtime, mktimeで作ると、月替わりタイミングでバグるよね。
スマートなやり方があった気がするが・・思い出せない、おながいします。

※リモートとの時刻誤差は数分以内程度を想定してます。



457:デフォルトの名無しさん
07/05/01 20:55:26
日が違ってる場合に年月の補正をすればいいんじゃない?

458:デフォルトの名無しさん
07/05/01 23:47:23
C言語の問題じゃねー気がするが
日が取得できるのならそれをつき合わせて補正でイナフ

459:デフォルトの名無しさん
07/05/02 00:24:31
年が今年なら、年月日だけあわせて0時の通産を求めて時分秒足したら

460:デフォルトの名無しさん
07/05/02 01:02:14
>>451
このスレ的には加算を禁じる理由は何もないからいいんじゃね

461:デフォルトの名無しさん
07/05/02 01:23:14
>>457-459
サンクス、思い出した。言語は関係ないな、こんなイメージで、ぶちこんどいた。

time_t now = time(0);
struct tm local = *localtime(&now);
time_t adjust = (local.tm_mday - remote->tm_mday) * (24 * 60 * 60);
if (adjust > issenwokoeta) {
  throw new AdjustOverflowException();
}
local.tm_mday = remote->tm_mday;
local.tm_hour = remote->tm_hour;
local.tm_min = remote->tm_min;
local.tm_sec = remote->tm_sec;
return mktime(&local) + adjust;



462:444 のものです。
07/05/02 02:04:03
あるプログラムから別のプログラムから立ち上げて、
その標準入出力を掴むプログラムを作っていたものです。

その呼ばれたプログラムのstdin,stdoutを呼び出し元プログラムで制御するまでに一立ったのですが。
仮にsshやftpを立ち上げてみると、ログインパスワード入力時の
「Password:」 の表示が標準出力じゃないみたいで、
呼び出し元プログラムを通さず、画面に出てきてしまいます。

一体何故でしょうか?

463:462訂正
07/05/02 02:04:43
>あるプログラムから別のプログラムから立ち上げて、

あるプログラムから別のプログラムを立ち上げて、


464:デフォルトの名無しさん
07/05/02 02:41:30
>>463
スレ違い。

465:デフォルトの名無しさん
07/05/02 03:03:04
んじゃ別のところで;^^)

466:デフォルトの名無しさん
07/05/02 04:58:46
つ【stderr】

467:デフォルトの名無しさん
07/05/02 09:34:10
パスワード系はエコーバックもあれしてるからなあ

468:デフォルトの名無しさん
07/05/02 11:25:37
つ/dev/tty

469:デフォルトの名無しさん
07/05/03 04:12:22
話ぶった切って悪いんですがILP64環境で4バイト長の整数を使いたいときってどうなるの?

470:デフォルトの名無しさん
07/05/03 04:23:57
C99 ならこれが使えるんじゃないかと思うけど、どうだろう?
URLリンク(seclan.dll.jp)

471:デフォルトの名無しさん
07/05/09 11:36:43
ヘッダにコードを書いてはいけないと聞いたのですが
何かあるのでしょうか?
別に書いても動きますよね?

472:デフォルトの名無しさん
07/05/09 11:42:37
動く事は動くが再利用性やコードの見通しが悪くなるからあんまり書かない方がいい

473:デフォルトの名無しさん
07/05/09 11:55:36
>>471
規格の 6.9 External definitions で、一つの関数または変数に対する定義は
プログラム全体で一つ以下(使われなければ無くてもいい)と制限されている。
ただし inline 関数や初期化子の無い外部変数定義は例外。

ヘッダは複数のコンパイル単位に取り込まれるので、うかつに関数や変数の
定義を置くとプログラム全体としては同じ名前に対する定義を複数持ってしまう
ことになり、未定義動作となる。

現行の一般的な処理系では、この規則に反するほとんどの場合がリンク時に
「重複した定義」などのエラーとして報告される。

474:デフォルトの名無しさん
07/05/09 12:03:53
>>472 473
なるほど、わかりました。
ありがとうございます。

475:デフォルトの名無しさん
07/05/09 13:41:50
3次元配列を使ってプログラムを組んだんですが、これをポインタを使ったプログラムに書き換えたいです。
簡単な方法があれば教えて欲しいです。
いまいちポインタが分かってないもんで、よろしくお願いします。
3次元配列は、2000*2000*2000の配列です。

476:デフォルトの名無しさん
07/05/09 14:03:38
>>475
配列とポインタって中でやることはほとんど同じだから、
書き換えたってたいして意味無い(動かないものが動くようになったりしない)よ?

> 3次元配列は、2000*2000*2000の配列です。
これ、一般人が買うようなPCだとオンメモリでは扱えない大きさだよ?
(わかってるならいいんだけど)

477:デフォルトの名無しさん
07/05/09 14:22:57
>>476

ありがとうございます。やっぱり動作が軽くなったりはしないですよね・・・


478:デフォルトの名無しさん
07/05/09 14:28:48
何十ギガという単位で実メモリがあれば速くなるんじゃないかな。


479:デフォルトの名無しさん
07/05/09 14:47:12
今FDにはいっている会員IDとPCの中にあるDATファイルの会員IDを照らし合わせて、同じ会員IDの名前だけとりだすというプログラムをつくっているんですがどなたか優しいできる方プログラムをのせていただけませんか?おねがいします!

480:デフォルトの名無しさん
07/05/09 14:50:45
まずは両方のデータをアップしなさいな。
データのフォーマットがわかないと作れないじゃん。

481:デフォルトの名無しさん
07/05/09 14:53:31
訂正:わかないと→わからないと

482:デフォルトの名無しさん
07/05/09 14:55:28
データとは会員IDのナンバーとかですか?ほんと初心者ですいません。

483:デフォルトの名無しさん
07/05/09 15:26:41
FDの中のデータは会員IDのみになっていて、1001がはいっています。PCのDATファイルには会員ID、名前、生年月日、住所の順に
1001 田中 19840908 千葉県
1002 高橋 19841203 埼玉県
1003 吉田 19840405 山形県
1004 佐藤 19841112 沖縄県
がはいっています。この2つを照らし合わせて1001のIDの田中だけ表示させたいというプログラムです。やさしいかた教えてください!お願いします!

484:デフォルトの名無しさん
07/05/09 15:35:58
>1001 田中 19840908 千葉県
「1001」と「田中」の間には何があるの?
半角スペース?
他の項目の区切りも同じ?

485:デフォルトの名無しさん
07/05/09 15:41:40
区切りは全部タブです!よろしくお願いします!

486:デフォルトの名無しさん
07/05/09 16:00:39
>>480 >>484
丸投げするような莫迦の相手をするな。

487:デフォルトの名無しさん
07/05/09 16:07:23
何日までに作ってほしい?

488:デフォルトの名無しさん
07/05/09 16:16:07
早ければ早いほどうれしいですが忙しいなら無理には大丈夫です。今週いっぱいにはつくりたい予定ですが。丸投げですいません。よろしくお願いします。

489:デフォルトの名無しさん
07/05/09 16:21:33
代金は銀行振り込みでいい?

490:デフォルトの名無しさん
07/05/09 16:28:26
#include <stdio.h>

const int BUFFER_SIZE = 100;
int main()
{
int y,m,d,days,n;
char buf[BUFFER_SIZE],c;
printf("年月日を入力してください\n");
while(true){
fgets(buf,BUFFER_SIZE,stdin);
n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,);
if(n==3){
break;
}
else if(n==-1){
continue;
}
else{
printf("error\n");
return 0;
}
}


年月日を入力して曜日を求めるプログラムの一部なんですが、
fgets(buf,BUFFER_SIZE,stdin);
n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,); の部分はどういう処理になるんでしょうか?nに整数が入るのがイマイチわかりません

491:デフォルトの名無しさん
07/05/09 16:44:15
ユーザがどういう入力をすると想定してるの?
もしかして"20070509"(YYYYMMDD)とか?

492:490
07/05/09 17:05:15
そうです。2007 5 9 って半角スペースで区切ると曜日が表示されます。
2007 5 9みたいに入力してなぜnが3とか-1とかになるんですか?

493:デフォルトの名無しさん
07/05/09 17:10:27
-1 ではなく EOF と書け。

494:デフォルトの名無しさん
07/05/09 17:22:59
>n=sscanf(buf,"%d%d%d%c",&y,&m,&d,&c,);
この%cは何を得ようとしてるの?

495:デフォルトの名無しさん
07/05/09 17:27:22
標準関数のリターン値の意味を質問しているのか?

ヘ ル プ 読 め。

manとかMSDNとかググるとか、ヘルプ読めない環境でプログラミングなんて無茶だから。

496:デフォルトの名無しさん
07/05/09 18:04:25
>>483
#include <stdio.h>

int main(void)
{
 system("grep -f fddata.dat pcdata.dat");
 return 0;
}


497:490
07/05/09 18:14:30
簡単に書き直したらうまく出来ました。
ありがとうございました

498:デフォルトの名無しさん
07/05/09 22:44:15
WindowsでもLinuxでもいいんだけど共有メモリ使う時に
構造体にキャストして使う方法とわざわざmemcpyで各要素ごとにコピーする方法が
等価だって言い張る人にどうやって違うんだよって説明すればいいですか?

相手は37歳のシナです。

499:デフォルトの名無しさん
07/05/09 22:56:06
>>498
比較用のコードを書いて、ベンチマークの結果をみせてやるとか。

500:デフォルトの名無しさん
07/05/09 22:57:49
>>498
そのシナさんはキャストでもコピーが作成されると思ってんの?
だとしたら、キャストの場合はアドレスが変わってないことを
見せてあげればいいんじゃない?

501:デフォルトの名無しさん
07/05/09 22:58:49
>>498
まず >>1 を読み直せ。それでも相談を続けるなら2つの方法に
対応するコードと、双方の主張を理由をつけて挙げてくれ。

502:デフォルトの名無しさん
07/05/09 22:58:50
>>499
それが、そうやって今しがたみせてやりましたが今度は
このような書き方は一般的じゃないとかいって怒り出して机をめちゃめちゃに
して帰りました。おまえの低能ぶりには呆れるとか捨て台詞を吐いて行ってしまいました。

正直な話、共有メモリの一番うまい使いかたってOpenMPとか見たいに自作のデータ構造を
そのまま共有メモリで共有できる形が理想なのにそれを言っても解かってもらえないのだろうか。

503:デフォルトの名無しさん
07/05/09 23:02:04
よそでやれ

504:デフォルトの名無しさん
07/05/09 23:10:58
Cの話じゃないよね
そいつの人格か理解力の問題か
そういう人とのコミュニケーションの取り方の問題だよね

505:デフォルトの名無しさん
07/05/09 23:12:08
>>502
シナさんがこんな時間まで残業付き合ってくれてたんなら少しは大目に見てやれ。

506:デフォルトの名無しさん
07/05/10 00:32:14
マ板でやれ

507:デフォルトの名無しさん
07/05/10 11:03:51
483ですがどなたか本当におねがいします。新社会人でこまっています。やさしい方おねがいします。

508:デフォルトの名無しさん
07/05/10 11:12:27
Excel でも使えば?

509:デフォルトの名無しさん
07/05/10 11:14:59
>>483
Cじゃないとだめ?
C#とかJavaは?

510:デフォルトの名無しさん
07/05/10 11:17:50
>>507
>>1 を100回音読後、首吊って詫びろ阿呆。

511:デフォルトの名無しさん
07/05/10 11:33:06
>507
上司に「できません」って言え

512:デフォルトの名無しさん
07/05/10 14:37:05
>>507
仕事なのか? だったらコマンドラインで grep 使えよ。
わざわざ作れもしないCプログラムで仕事を遅らせるのはアホ。


513:デフォルトの名無しさん
07/05/10 15:00:16
>>507
もしやそれは練習課題?

514:デフォルトの名無しさん
07/05/10 17:29:15
上にもあるように、scanfつかえ

515:デフォルトの名無しさん
07/05/10 18:10:54
ごめんなさい。でも真剣に困ってるし助けてほしいんです。よろしくお願いします。

516:デフォルトの名無しさん
07/05/10 18:12:27
だからscanfつかえよ

517:デフォルトの名無しさん
07/05/10 18:13:24
帰れ

518:デフォルトの名無しさん
07/05/10 18:13:55
常識知らずにかける情けは無い

519:デフォルトの名無しさん
07/05/10 18:20:37
スレ違い

520:デフォルトの名無しさん
07/05/10 19:38:09
だーから相手すんなってば。
相手するなら誘導してやれ。

521:デフォルトの名無しさん
07/05/10 22:03:02
>>515
ですけどもういいです。もっとできる人探しておしえてもらいます。
ここにいる人達はどうせこのプログラムがかけないんでしょ?
こんなしたてに聞いているのにひどい人達ですね。みなさんわからない
時期はなかったんですか?

522:デフォルトの名無しさん
07/05/10 22:07:50
君は自分の要求を受け入れる人の言うことにだけ耳を傾けるのかね。

523:デフォルトの名無しさん
07/05/10 22:24:34
>ここにいる人達はどうせこのプログラムがかけないんでしょ?
こういうこと言うやつに何も教える気は無い、消えろ。
その聞き方じゃどこ行っても同じだぞ、初心者にしか相手してもらえない

524:デフォルトの名無しさん
07/05/10 22:26:54
少なからず相手しちゃってる件

525:デフォルトの名無しさん
07/05/10 22:26:59
ネタにマジレスカコイイ

526:デフォルトの名無しさん
07/05/10 22:30:26
でしょでしょエヘヘ

527:デフォルトの名無しさん
07/05/11 01:53:21
でも実際こういう新入社員は居る事実。

528:デフォルトの名無しさん
07/05/11 16:58:23
>>521を本人が書いているという保証はどこにもないなあ・・・。


529:デフォルトの名無しさん
07/05/11 17:41:56
だから?

530:デフォルトの名無しさん
07/05/11 21:21:44
疑問文に感嘆符つけて質問する奴は俺の中ではスルー対象だわ。
非常に高い確率でDQNだからな。相手してられん。

531:デフォルトの名無しさん
07/05/11 21:23:12
疑問文に感嘆符とはどういうことだね!

532:デフォルトの名無しさん
07/05/11 21:35:48
?!

533:デフォルトの名無しさん
07/05/11 21:37:02
>>530
感嘆符つけて質問する奴なんてお前のレス以前に見たこと無い。

534:デフォルトの名無しさん
07/05/11 21:39:36
勘違いしつつぼやく奴は俺の中ではスルー対象だわ。
非常に高い確率でDQNだからな。相手してられん。

535:デフォルトの名無しさん
07/05/11 21:43:23
インテロバーング

536:デフォルトの名無しさん
07/05/11 21:46:44
疑問符と感嘆符を間違える奴は俺の中ではスルー対象だわ。
非常に高い確率でDQNだからな。相手してられん。

って、スルーできてねーっつーの。

537:デフォルトの名無しさん
07/05/14 13:03:18
今こそスルー力が試されるとき!

538:デフォルトの名無しさん
07/05/14 13:34:27
throw new NullPointerException("ぬるぽ");

539:デフォルトの名無しさん
07/05/14 15:05:17
try {
 >>538
} catch(Exception e) {
 System.out.println("ガッ");
}

540:デフォルトの名無しさん
07/05/14 15:06:41
Javaはスレ違い。
C言語で書け!!

541:デフォルトの名無しさん
07/05/14 15:06:53
>>483
あんまり暴れるな

「IDが一致してたら表示」でいいんだよね

FDからIDを1つ取ってくる
それをPCのファイルのIDを照らし合わせて一致したら表示
次のIDをFDから持ってきて上を繰り返す

という手順でいいんじゃない?
いまケータイだからソースは載せられんけど

542:デフォルトの名無しさん
07/05/14 16:43:12
>>541
>あんまり暴れるな
君みたいに、いちいち反応する連中がいなくなってくれれば
もっと早く収束してたんだろうけどね。

543:デフォルトの名無しさん
07/05/14 16:47:37
あまりにくだらない

544:デフォルトの名無しさん
07/05/14 17:24:35
>>542
いちおう>>541はやり方書いてるけど?

545:デフォルトの名無しさん
07/05/14 18:18:25
>>544
は?関係ねえよ。
>>486

546:デフォルトの名無しさん
07/05/14 18:36:30
てst

547:デフォルトの名無しさん
07/05/14 21:56:34
>>545
とりあえずおまいが氏ね

548:デフォルトの名無しさん
07/05/15 23:15:56
どなたか
URLリンク(www.cns.ci.ritsumei.ac.jp)
の08、09の解析をしていただけないでしょうか?

549:デフォルトの名無しさん
07/05/15 23:22:45
>>548
スレ違い

550:デフォルトの名無しさん
07/05/20 06:03:52
整数12ビットの列を扱うには、構造体のビットフィールドを使うしかないのでしょうか?

551:デフォルトの名無しさん
07/05/20 06:33:12
16bitなり32bitなりで読み込んで
必要な部分だけマスクして取りだしゃいい。

それでも外部に記録されているものを読み書きする場合には
エンディアン依存は避けられないが
ビットフィールドよりはまし。

552:デフォルトの名無しさん
07/05/20 13:14:54
charを介して変換すればマシンのエンディアンには依存しない
どう変換するかは元データのエンディアンによる(6ビット1バイトだとすれば)

553:デフォルトの名無しさん
07/05/20 17:36:09
どうせ外部とのI/Fなら、コンパイラもセットで依存し捲くってもいいというコンセンサスを得た上で
ビットフィールドを使うのが一番楽だと思うが。
#後は野とn(ry

554:デフォルトの名無しさん
07/05/20 22:00:06
そしてBeOSの悲劇

555:デフォルトの名無しさん
07/05/21 16:02:25
1000までの素数を求めて出力するプログラムの作成を教えてください。
mod使う方法で。


556:デフォルトの名無しさん
07/05/21 16:14:04
mod 素数 C言語あたりでググったほうがはやい

557:デフォルトの名無しさん
07/05/21 16:15:12
つか、Cでmod使えとは。
>>555
宿題スレへ行け。そしてもう来るな。

558:デフォルトの名無しさん
07/05/21 16:18:27
#define mod(a, b) ((a) % (b))

559:デフォルトの名無しさん
07/05/21 17:27:29
inline int mod(int a, int b) { return (a % b); }

560:デフォルトの名無しさん
07/06/04 00:15:06
ファイルの行数を数えてその分配列を確保したいのですが、
このような配列の使い方(foo関数の部分)をしていいのでしょうか?
malloc()した方がいいんでしょうか。

よろしくお願いします。

int main()
{
  int line_count;

file_line_count(&line_count); //ファイルの行数を数える関数
foo(line_count);
}

void foo(int line_count) //foo関数
{
  int array[line_count]:
       ^^^^^^^^^^^^^^
  :
  :
}

561:デフォルトの名無しさん
07/06/04 00:33:19
>>560
対象とする規格による。いわゆる C99 なら標準で認められている。
C99 より前の C の規格や現行の C++ では認められていない。

562:デフォルトの名無しさん
07/06/04 00:34:16
>>560
そのような可変長の配列はC99で採用された仕様だから、
一部のC89信者に蛇蠍の如く忌み嫌われる。

まぁ、C99限定でいいのなら使っていいと思うよ。
但し、スタックサイズに注意すること。

563:デフォルトの名無しさん
07/06/04 02:47:44
関係ないけどファイルの行数を数える関数で戻り値使わないでポインタ渡しなのが気持ち悪い・・・

564:デフォルトの名無しさん
07/06/04 02:51:17
昔あった、関数は全部voidで宣言しろっていうとんでもないコーディングルールを思い出した

565:デフォルトの名無しさん
07/06/04 04:45:24
>>564
戻り値を表示できるデバッガが無かったとか?

566:デフォルトの名無しさん
07/06/04 08:22:36
でも結構しっかりしたC用のAPIだと戻り値はエラー状態を表すのに使われていて、
本来戻り値になるであろうものもポインタの引数になるというのはよく見かける。

567:デフォルトの名無しさん
07/06/04 08:33:37
MPI とかそんな感じだったような。

568:デフォルトの名無しさん
07/06/04 09:41:44
余計 void はありえないなw

569:デフォルトの名無しさん
07/06/04 11:30:55
戻り値のチェックを忘れる馬鹿がいるから、とかじゃね?

570:デフォルトの名無しさん
07/06/04 11:36:05
is~な問い合わせ関数でも、戻り void でステートをポインタ引数に取るのか…
たまんねーコーディング規約だな

571:デフォルトの名無しさん
07/06/04 23:25:39
>>570
うんにゃ
ポインタは渡さない
後はわかるな?

572:デフォルトの名無しさん
07/06/04 23:33:04
よりよってグローバル変数かよ。

573:572
07/06/04 23:33:55
"に"が抜けた。

×よりよってグローバル変数かよ。
○よりによってグローバル変数かよ。

574:デフォルトの名無しさん
07/06/04 23:52:32
>>572-573が妙にイラッと来る

575:デフォルトの名無しさん
07/06/05 00:02:58
×>>572-573が妙にイラッと来る
>>572-573が妙にムラッと来る

576:560
07/06/05 00:03:24
>>561
>>562
有難うございます。

色々つっこまれてる。(;゚□゚)

577:デフォルトの名無しさん
07/06/05 05:00:17
>>571
まあ、N88-BASIC のコードを移植するプロジェクトならアリかもしれんが・・・。

578:デフォルトの名無しさん
07/06/05 13:40:27
>>572
eax だってグローバル変数だー (i86系)

579:デフォルトの名無しさん
07/06/05 13:42:30
スマン環境依存スレじゃなかった

580:デフォルトの名無しさん
07/06/05 13:42:38
>>578
いくらなんでもスレ違い。どっか他所でやってくれ。

581:デフォルトの名無しさん
07/06/05 13:53:48
レジスタはスレッド切り替わる時に退避されるからスレッドセーフで、
グローバル変数なんかとは格が違う。

582:デフォルトの名無しさん
07/06/05 14:01:55
>>581
>580

583:デフォルトの名無しさん
07/06/13 23:07:43
スレリンク(prog板:758番)

char *data = 30000;
↑これに対して↓を行うと
gcc -fsyntax-only -x c -std=c99 -pedantic -Wall -Wextra

:1: warning: initialization makes pointer from integer without a cast

と警告は出るけどエラーにはならない。あれ?と思って規格を見た。

6.7.8 Initialization p11 に
"the same type constraints and conversions as for simple assignment apply"
とあったので 6.5.16.1 Simple assignment の Constraints を見たけど、
左辺ポインタで右辺が整数というのは認められないように見える。

規格ではエラーになるべきなんじゃないの?
ちなみに C++ では思ったとおりエラーになった。

584:デフォルトの名無しさん
07/06/13 23:09:15
暗黙の・・・

585:デフォルトの名無しさん
07/06/22 04:01:03
ファイルサイズの取得方法って、「ftell」を使用するのが常道なんでしょうか。

Cでファイルサイズを取得する場合、自分は「fgetpos」を使用すのかなーと漠然と考えていて【B】のようなソースを考えていたんですが、
>>402がファイルサイズの取得方法として「ftell」を利用してるとのことだったので、【A】のようなソースも考えてみました。
やはりAのほうがよいのでしょうか。。。

========================
【A】
========================
long size = 0L;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  size = ftell( fp );
  if (size == -1L ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* sizeの値がhogehoge.jpegのファイルサイズ */

586:585
07/06/22 04:01:52
で、Bです。
========================
【B】
========================
fpos_t *pos;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  if ( fgetpos( fp, &pos ) != 0 ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* posの値がhogehoge.jpegのファイルサイズ */
/* fpos_tってキャストできそうだからサイズの値が取れると思ったのですが。。。 */
========================


587:デフォルトの名無しさん
07/06/22 04:02:02
環境依存の方法を使うのが普通じゃないかな。

588:デフォルトの名無しさん
07/06/22 04:04:05
>>586
全然本質じゃない細かいところで
> fpos_t *pos;
これは
fpos_t pos;
だよね。多分わかってはいるとは思うんだけど。

589:デフォルトの名無しさん
07/06/22 04:14:58
fpos_tって別の変数にキャストしたりするとき困らない?

fpos_tって環境依存だからlong long型とは限らないと聞いたことがある。


590:デフォルトの名無しさん
07/06/22 04:19:29
横からすみません。

この>>585って、もしhogehoge.jpegのファイルサイズが巨大だった場合、
どうなっちゃんですか?

591:デフォルトの名無しさん
07/06/22 05:16:26
標準Cでは2GBを超えるファイルのサイズを知る手段はないって結論になる。
fpos_tがキャスト可能であることは保障されていないことだし。

ファイル関連は標準Cだけで書くのを諦めて、64ビット系のstat()相当の関数を使うのが無難じゃない?

592:デフォルトの名無しさん
07/06/22 06:19:36
>>587~のみなさん、ありがとうございました(588さんご指摘ありがとうございます)。
ファイルのサイズが大きい場合のことまで頭が回っていませんでした。
標準Cでは難しそうですね。
stat等の機能を持つ関数使用が無難といったところでしょうか。
一応stat使用時のソースも考えてみましたが…

struct stat fInfo;
if ( stat( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}

あるいは・・・非 POSIX 標準 API インタフェースで(UX上で動作)

struct stat64 fInfo;
if ( stat64( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}









593:デフォルトの名無しさん
07/06/22 07:49:47
相乗り質問ですいませんが
ファイルサイズ自体を知りたいのではなくて
ファイルサイズがある一定値を超えているか否かを判定したい場合も、
やはりstatなりftellなりでバイトサイズを一度取得してから
if文で判定するしかないですよね。

2GBだろうが3GBだろうが、とにかくある値を
超えてるか超えてないかだけわかればいいのですが。。。

594:デフォルトの名無しさん
07/06/22 08:16:12
ファイル開いたらある値まで無理矢理ファイルポインタ動かしてみて
エラーが出るかを拾うってのはどうだろう
やっぱ2GB超えちゃうとダメなのかな

595:デフォルトの名無しさん
07/06/22 08:36:48
そもそもファイルが開けないとサイズが調べられないプログラムはどうかと思うんで、
stat64 なりで調べた方がいいと思うよ。

596:デフォルトの名無しさん
07/06/22 08:45:05
ていうかPOSIX環境だと_FILE_OFFSET_BITS=64が無ければ
2G以上のサイズはのopen/fopen自体が失敗する。
Windows環境だとopenは出来るけど、seekが出来ない(シーケンシャルには読める)。
それぞれ、open64や_lseek64(bccには無い)を使う。
もちろん、_FILE_OFFSET_BITS=64なら、openだけでよい。

また、statも同様に、_FILE_OFFSET_BITS=64ならstatだけで良いが
それ以外はstat64等を使う。

597:デフォルトの名無しさん
07/06/22 09:31:14
そもそもfseek()はエラーを返せない。

598:デフォルトの名無しさん
07/06/22 09:54:27
stat構造体のst_sizeはoff_t型だから、……
long int型になるのかな、
そうするとlong int型に格納しきれないバイト数のファイルは
桁あふれするのかな? 0? 再現させてテストしたいが
環境が手元にないのだが。。。。。。

599:デフォルトの名無しさん
07/06/22 10:00:42
だからoff_t型の大きさは_FILE_OFFSET_BITSや_LARGEFILE64_SOURCEによって変わる。
off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。

600:デフォルトの名無しさん
07/06/22 10:07:58
あ、Windowsだとstatは失敗しないな。たぶん。
で、結果がどうなるかは処理系(ライブラリ)依存。
何故ならstatはエミュレーションしているので、
stat("c:/*", &st)が成功してしまったりする処理系があるから。

601:デフォルトの名無しさん
07/06/22 11:44:19
ファイルサイズというのが何を意味するかによる。
OS上でのサイズのことなら、
そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。
Cの入出力関数で読んだときのバイト数のことなら、
読めないようなものは無視してしまえばいい。

まあ、なんでファイルサイズを知りたいのかってとこまで
一回さかのぼって考えてみるのも一計。

602:デフォルトの名無しさん
07/06/22 22:25:44
サイズは「サイズ」以外ないだろ。
「文字数」とは違う。

603:デフォルトの名無しさん
07/06/23 08:17:34
昔のCP/Mはセクタ数でしか管理してなかったなぁ

604:デフォルトの名無しさん
07/06/23 08:53:01
>>603
今のCP/Mとやらはどう管理しているの?

605:デフォルトの名無しさん
07/06/23 09:23:37
>>603
最終セクタの0x1Aまでがファイルの「サイズ」だろ?

606:デフォルトの名無しさん
07/06/23 09:45:36
でもそれは管理されてない。

607:デフォルトの名無しさん
07/06/23 09:54:38
ん、「管理されているかどうか」という話なの?
「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの?

だったらそれでいいけど。

608:デフォルトの名無しさん
07/06/23 09:57:38
あっと、
「ファイルのサイズとはOSに管理されていなければならない」という
話の流れとは関係ないことを言いたかっただけで
「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。

609:デフォルトの名無しさん
07/06/23 10:25:40
バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。

610:デフォルトの名無しさん
07/06/24 03:19:11
ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、
テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。
統一した「ファイルサイズを得る方法」なんてあるわけがない。

あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。


611:デフォルトの名無しさん
07/06/24 03:23:51
ファイルサイズを取得する関数が標準で用意されなかったのは、
そのあたりが理由なのかな?

612:デフォルトの名無しさん
07/06/24 04:03:56
>>611
そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。

613:デフォルトの名無しさん
07/06/24 04:31:09
MS-DOS 1.0 もディレクトリないんだっけ?

614:デフォルトの名無しさん
07/06/24 04:43:31
汎用機もねーよ

615:デフォルトの名無しさん
07/06/24 22:22:42
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

616:デフォルトの名無しさん
07/06/24 22:24:17
そのネタ飽きた

617:デフォルトの名無しさん
07/06/25 10:05:04
そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな
128バイトのブロック単位だったからファイルの後ろにはゴミがついていた
Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・

618:デフォルトの名無しさん
07/06/25 10:55:57
マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。

619:デフォルトの名無しさん
07/06/25 11:58:13
リソースフォークの話は出してくるやつが出ると思った
リソース/データフォークのサイズもファイルサイズの指定の意味で
書いたんだがわからなかったんだろう


620:デフォルトの名無しさん
07/06/25 15:09:30
>リソース/データフォークのサイズもファイルサイズの指定の意味で
>書いたんだがわからなかったんだろう
これ日本語なの?

621:デフォルトの名無しさん
07/06/25 19:06:14
まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。

622:デフォルトの名無しさん
07/06/25 19:07:17
どうと思う!
いや、どうかと思う、だorz

623:デフォルトの名無しさん
07/07/01 14:39:59
MFCでCString型の変数strにメタ文字の.が入っている場合\記号と連結するのに
str = "\\" + str;
これで全然問題ないのですが、標準のCで
char str[MAX_PATH];
strcpy(str, ".");
starcat("\\", str);
こうするとアクセスバイオレーションが発生します
どうしたらええの?
strcpy(str, "\.");これでも駄目だった
そうそう環境はWinXPSP-2、VC6です


624:デフォルトの名無しさん
07/07/01 14:41:45
>>623
starcat なる謎の関数の仕様をよーく確認しろ。

625:デフォルトの名無しさん
07/07/01 14:42:52
星猫

626:デフォルトの名無しさん
07/07/01 14:46:52
スマンstrcatだったMSDN見ても問題ないと思うのだが?
文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが

627:デフォルトの名無しさん
07/07/01 14:48:00
>>626
じゃぁ strcat の仕様をよーく確認しやがれこのバ

628:デフォルトの名無しさん
07/07/01 14:48:55
そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。

629:デフォルトの名無しさん
07/07/01 14:50:02
それでもstarcatならきっとやってくれるさ

630:デフォルトの名無しさん
07/07/01 14:50:05
MFC 使える環境なら CString か std::string 使えば?
そっちの方が幸せになれるよ。セキュリティ的にも。

631:デフォルトの名無しさん
07/07/01 14:56:52
>>628
ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630
だからMFCなら全然無問題なのだが、Cの事も知りたいからよ

632:デフォルトの名無しさん
07/07/01 14:56:54
>>626
strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。

633:デフォルトの名無しさん
07/07/01 14:59:06
>>631
ならリテラル以外で問題が再現するコードを書いてみやがれ

634:デフォルトの名無しさん
07/07/01 15:00:41
>>631
C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。

635:デフォルトの名無しさん
07/07/01 15:04:06
sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。
しかし、やりたいことがよく判らないからサンプルを書けない。
例えばディレクトリとファイル名を連結したいだけならこうなるのだが。
sprintf(path, "%s\\%s", dir, file)

636:デフォルトの名無しさん
07/07/01 15:08:05
>>631
どうせ初期化してないのに strcat とかしたんじゃないのか?

637:デフォルトの名無しさん
07/07/01 15:12:33
元のCStringを使ったコードはこうなっていると解釈するぞ。
CString str = ".";
str = "\\" + str;

char str[MAX_PATH] = ".";
size_t size = strlen(str) + 1;
if (size >= MAX_PATH)
  abort(); /*好きにしてくれ*/
memmove(str + 1, str, strlen(str) + 1);
str[0] = '\\';
WindowsならTCHAR系使えという気もするが、とりあえずcharにしておいた。


638:デフォルトの名無しさん
07/07/01 15:39:04
BoehmGCのようなライブラリを使えば
char *str = ".", *tmp;
tmp = GC_MALLOC(strlen(str) + strlen("\\") + 1);
sprintf(tmp, "\\%s", str);
str = tmp;
でいいよ

んでも毎回strlen()とかすんのはウザいので、
typedef struct string_t { char *s; size_t len; } string_t;
とかして、string_tに対する操作を関数で一通り作るといいよ

んでもそんなアホくさい作業をするくらいならC++で素直に
std::basic_string<>使ったほうがいいよ

639:デフォルトの名無しさん
07/07/01 15:53:40
MFC使っているならCStringもありさ

640:デフォルトの名無しさん
07/07/01 19:19:12
strcpy -> strncpy
strcat -> strncat
sprintf -> snprintf

641:デフォルトの名無しさん
07/07/01 20:09:50
>>640
残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。

642:デフォルトの名無しさん
07/07/01 21:07:18
結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。
何より楽だし。

643:デフォルトの名無しさん
07/07/01 22:28:15
バッファオーバーフロー脆弱性の話を聞くたびに、
敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。
それができないなら C++ にしる、と。

644:デフォルトの名無しさん
07/07/01 23:19:51
>641
C99は未だ存在しないのか・・・

645:デフォルトの名無しさん
07/07/01 23:22:59
C99 が使える環境では snprintf を使って、
使えない環境なら等価な関数に #define すればいいんじゃない?

646:デフォルトの名無しさん
07/07/01 23:26:40
snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?

647:デフォルトの名無しさん
07/07/01 23:33:00
VC++ には _snprintf がある。

648:デフォルトの名無しさん
07/07/02 00:13:07
char *s;
FILE *fp = fopen("/dev/null", "w");
size_t len = fprintf(fp, ...); /* 長さを数えてもらう */
fclose(fp);
s = malloc(len + 1);
sprintf(s, ...);

勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが
それぐらいならやっぱりC++を使うべきという結論に

649:デフォルトの名無しさん
07/07/02 00:38:37
>>648
必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。

650:デフォルトの名無しさん
07/07/02 00:48:37
>>649
そいつらの代替実装の話だろ。

651:デフォルトの名無しさん
07/07/02 00:48:40
問題は移植性の低さだな
標準とはいえC99未対応のCコンパイラは多い

652:デフォルトの名無しさん
07/07/02 01:00:52
snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?

653:デフォルトの名無しさん
07/07/02 01:09:55
>>652
あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか

654:デフォルトの名無しさん
07/07/02 03:06:17
その場合は自分でラッパ関数を定義すればいいんじゃないかな?

655:デフォルトの名無しさん
07/07/02 21:29:01
*BSD LIBCあたりから掻っ払って来りゃええやん。

656:デフォルトの名無しさん
07/07/04 22:59:02
ねぇねぇおまえらちょっと教えてくんない
ファイルの行数を取得する標準関数なんてないよね
そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数
数えるとかやってんの?
どうよ


657:デフォルトの名無しさん
07/07/04 23:03:13
そうする

658:デフォルトの名無しさん
07/07/04 23:34:14
それ以外の方法があるなら是非とも教えてもらいたいもんだ

659:デフォルトの名無しさん
07/07/04 23:50:13
fp = fopen(filePath,"r");
while(fgets(szBuff, MAX_PATH, fp) != NULL)
{
  maxLine++;
}
fclose(fp);

char szItem[7][maxLine++];

じゃぁこれはどうよ、二次元配列が作りたくてこうやったら
error C2057: 定数式が必要です、MSDNとか調べてURLリンク(support.microsoft.com)

char szItem[7][((const int)maxLine++];
こうしてもなおんないんだよねぇこれってどうよ

660:デフォルトの名無しさん
07/07/04 23:52:13
スマン訂正
int maxLine;
罰char szItem[7][((const int)maxLine++];
丸char szItem[7][(const int)maxLine++];

661:デフォルトの名無しさん
07/07/04 23:59:58
C99じゃない限り配列の大きさはコンパイル時に固定=定数

662:デフォルトの名無しさん
07/07/05 00:07:53
あきらめきれなくて
回避策はないのかと聞いてみる

663:デフォルトの名無しさん
07/07/05 00:09:15
URLリンク(www23.atwiki.jp)
のwikiに載っていたリサージュのプログラムで
x = cos(2 * PI * a * t);
y = sin(2 * PI * b * t);
の2の値を自由に変えられる(自分で入力できる)ように
したいんですけど、どうやったらいいですか?


664:デフォルトの名無しさん
07/07/05 00:10:28
>>662
malloc使えばいいんじゃない

665:デフォルトの名無しさん
07/07/05 00:12:44
>>664
クワシク

666:デフォルトの名無しさん
07/07/05 00:17:10
そこらへんの入門書に書いてある。
残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。

667:デフォルトの名無しさん
07/07/05 00:53:10
>>662
寧ろ、C++でstd::vector使えばいいんじゃない?

668:デフォルトの名無しさん
07/07/05 01:32:50
ドウシテC99ヲツカワナイノデスカ

669:デフォルトの名無しさん
07/07/05 16:48:51
ドウシテC99ガフキュウシテルトオモウノデスカ

670:デフォルトの名無しさん
07/07/05 16:50:55
C99 使うくらいなら C++ 使う

671:デフォルトの名無しさん
07/07/05 16:52:17
んだな

672:デフォルトの名無しさん
07/07/05 23:13:16
単項演算子の+って、どう言ったときに役に立つのでしょうか?
Cだけの話ではないかもしれませんが。

673:デフォルトの名無しさん
07/07/05 23:13:35
メジャーなコンパイラでC99に対応してないのってあるの?
俺趣味グラマでgccしか使わんからわからん。

674:デフォルトの名無しさん
07/07/05 23:16:17
>>673
VC++

675:デフォルトの名無しさん
07/07/05 23:20:05
>>672
桁合わせくらいには役に立つことはあるかも。

676:デフォルトの名無しさん
07/07/05 23:47:34
>>672
-があるから+も装備したらしい

677:デフォルトの名無しさん
07/07/06 00:45:33
昔、
#ifdef xx
# define SYM 10
#else
# define SYM
#endif
のような時に

int num = SYM +0;
というような使い方をした覚えがあるような無いような。

678:デフォルトの名無しさん
07/07/06 01:20:07
マクロ関連で役に立つことがたまにありそうではあるな。

679:デフォルトの名無しさん
07/07/06 01:35:03
正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?

680:デフォルトの名無しさん
07/07/06 01:36:20
単項+のオペランドも式だし、
単項+のオペランドになれない式もあるだろ。

681:デフォルトの名無しさん
07/07/07 03:44:31
#ifdef xx
# define SYM 10
#else
# define SYM 0
#endif
では、何故ダメだったのか教えてほしい。

682:デフォルトの名無しさん
07/07/09 22:11:51
学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。
○×ゲームを作るプログラムを作っていたんですが。
1~9の数字キーでどこのマスを使うか決めるプログラムなんです。
line1[10]=" 789\n",
line2[10]=" 456\n",
line3[10]=" 123\n",
という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが
何故Tabキー使っては駄目なのか教えていただけませんか?

683:デフォルトの名無しさん
07/07/09 22:17:17
>>682
書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな

684:デフォルトの名無しさん
07/07/09 22:37:32
いやコンパイルエラーになるんだろ。
たぶん、構文的に駄目になっているのだろうとしか言えない。
後できちんと規格書に当たってみる。

とりあえず、文字列リテラルの中でタブ文字を表現したければ、
タブを直接入力する代わりに\tを使えばいいと言っておく。

685:デフォルトの名無しさん
07/07/09 22:44:18
>>683
ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。

strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?

686:デフォルトの名無しさん
07/07/09 22:48:07
>>685
やってみたほうがよく分かる

687:デフォルトの名無しさん
07/07/09 23:05:02
>>684
指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686
ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)

688:デフォルトの名無しさん
07/07/09 23:12:54
環境もないのに実習なんて言うのか?

689:デフォルトの名無しさん
07/07/09 23:28:53
>>688
ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。

690:デフォルトの名無しさん
07/07/09 23:30:22
じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。

691:デフォルトの名無しさん
07/07/09 23:32:15
>>689
今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める

692:デフォルトの名無しさん
07/07/09 23:36:48
>>691
今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\

693:デフォルトの名無しさん
07/07/09 23:38:11
とりあえずお前はCの勉強する前にPCの勉強をしろ。

694:デフォルトの名無しさん
07/07/09 23:40:29
>>692
Windows Vista と予想

695:デフォルトの名無しさん
07/07/09 23:49:11
やっぱり聞くんじゃなかったかな。
もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。

696:デフォルトの名無しさん
07/07/09 23:54:59
そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。

697:デフォルトの名無しさん
07/07/09 23:59:16
寿司食いたい

698:デフォルトの名無しさん
07/07/10 09:13:41
基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?

699:デフォルトの名無しさん
07/07/10 10:29:56
スペースをタブにできるなら、スペースを\tにもできるだろう

700:デフォルトの名無しさん
07/07/12 10:53:19
ファイルがテキストファイルかバイナリーファイルかを
Cプログラムで判定したいのだけれど、方法を教えてくれ。


701:デフォルトの名無しさん
07/07/12 11:01:37
>>700
ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。

702:デフォルトの名無しさん
07/07/12 11:23:16
つ[/usr/bin/file]

703:デフォルトの名無しさん
07/07/12 11:33:10
文字データって言ってもいくつかの体系を考慮したら・・・ヘッダとか考えてみたけど
それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。

704:デフォルトの名無しさん
07/07/12 12:26:31
>>702
ここをどこだと思ってるんだ

705:デフォルトの名無しさん
07/07/12 12:27:18
そもそもテキストファイルとは何なのか。

706:デフォルトの名無しさん
07/07/12 12:28:40
SUBをファイルの終わりとして認識すべきファイルのこと。

707:デフォルトの名無しさん
07/07/12 15:25:59
>>706
CP/M の世界から、ようこそ!

708:デフォルトの名無しさん
07/07/13 00:46:50
発注元がどうしても欲しい、というのでフローチャートを書いているのですが
#if を if文とフローチャート上で区別する方法はありますか?
具体的には

#if defined(MODEL_xx)
if (zzz) {
processYYY();
}
#endif

ソフトは MODEL_xx が定義してあるやつとそうでないもの、両方納品します。

709:デフォルトの名無しさん
07/07/13 00:58:46
両方納品するんならフローチャートは2セット要るんじゃないか?

710:デフォルトの名無しさん
07/07/13 09:42:40
>>708
定義してあるかどうかで動作が変わる関数のみ
複数書けばいい希ガス。

711:デフォルトの名無しさん
07/07/13 10:21:15
if文は実行時に働くものだからフローチャートの一部だが
#ifはコンパイル時に働くものだからそもそも異なる実行ファイルができるわけで
よってフローチャートもその数だけ必要になる

っていうかCの話かこれ?

712:デフォルトの名無しさん
07/07/13 16:31:31
char型のcharってcharacterの略で%nのnはnewlineの略ですよね?
こういう略してある語の元の単語が載ってるサイトってないですかね?
探してもこの2つしかわからなくて

713:デフォルトの名無しさん
07/07/13 16:36:42
念のために言っとくが\nな

語なんてそんなに多くないから何がわからないか聞けばここで全部答えてもいいぞ(一回にまとめるなら)

714:デフォルトの名無しさん
07/07/13 18:17:06
\nでしたすいません


stdioとhの意味
printfのprintとfの意味
scanfのscanとfの意味
int型 int
double型 double
%f f  
%c c  
%s s 
\t t 

全部でこれだけなんですがお願いできますか?stdioはstandard input outputかなとも思うんですが

715:デフォルトの名無しさん
07/07/13 18:28:06
とおりがかりだけど、
hはheader、fはformat、intはinteger(整数)、doubuleはDouble Precision(倍精度(実数))、
%f はfloat(floating point 浮動小数点)、%c はcharacter、%sはstring、\t はTAB
あとは想像通り、辞書ひいてもいいし。

まあ誰かまとめてくれるかな。

716:デフォルトの名無しさん
07/07/13 20:07:17
printfはprint formatted

717:デフォルトの名無しさん
07/07/13 20:26:52
stdioはStandard IO(InputOutput)

718:デフォルトの名無しさん
07/07/13 20:42:49
714は挙げていないけど、%gはe、fの次の文字だからという理由。
ANSI C言語辞典にはそう書いてある。

719:デフォルトの名無しさん
07/07/13 22:22:38
>>712
新ANSI C言語辞典って本にたいがい載ってるけど、それだけに買うのはもったいないしな。

720:デフォルトの名無しさん
07/07/14 00:13:43
俺あれもってるけど、一度も引いたことないわ
manかぐぐればいいだけの話しだしな

721:名無し
07/07/14 05:10:14
URLリンク(hpcgi3.nifty.com)

ここの「ファイル入出力」ってやつ分かりません。

助けてください

722:デフォルトの名無しさん
07/07/14 05:18:33
>>721
初心者スレへどうぞ。

723:デフォルトの名無しさん
07/07/16 03:14:46
(a+1)x^2+(b+1)x+(c+1)=0を
解くプログラムがわからないorz
a=1b=1c=1を入れるのだが
#include<stdio.h>
int main(void)
{
int a=1,b=1,c=1,d,x,y;
scanf("a=%f",&a);
scanf("b=%f",&b);
scanf("c=%f",&c);
d=b^2-4*a*c;
if(d>0)
x=(-b+sqr(d))/a;
y=(-b-sqr(d))/a;
printf("x=%d,%d\n",x,y);
elxe
printf("解なし\n");
return 0;
}
ではダメみたいなんよ
よくわからない、たすけておくれ



724:デフォルトの名無しさん
07/07/16 03:37:42
マルチすんな

725:デフォルトの名無しさん
07/07/16 10:19:32
elxe
これなに

726:デフォルトの名無しさん
07/07/16 10:23:46
マルチ先で指摘済み
スレリンク(tech板)

727:デフォルトの名無しさん
07/07/16 21:36:40
C99で、
for(int i = 0; i < 10; i++) /* something */ ;
みたいにforの中で変数宣言できますけど、
while( int i = f() ) /* something */ ;
みたいなことはできないんですね。不便。

728:デフォルトの名無しさん
07/07/16 22:26:34
>>727
C99だとできないんだっけ?
その書き方ができるとどこが便利なのかわからないけど

729:デフォルトの名無しさん
07/07/16 22:27:05
条件判定のところで変数宣言して何の意味があるんだい?



730:デフォルトの名無しさん
07/07/16 22:28:33
判定のたびにブチ壊しては作り直すのであろうよ
おほほほ

731:727
07/07/16 22:49:06
while( obj = nextObj() ) {
// something
}

みたいなことしません?

732:デフォルトの名無しさん
07/07/16 22:55:17
int obj;
while( obj = nextObj() ) {
// something
}

でいいじゃんとか思ったら負け?

733:デフォルトの名無しさん
07/07/16 23:03:09
>>727
for文の第一節はループ開始前に一回だけ実行される。
だから for(int i=0; … は、ループ開始前に変数iを確保して0に初期化し、
ブロック(forループ)を抜けたら破棄することを意味する。

対してwhile文の条件節は、処理がループするごとに実行される。
もしここに while(int i= … と書いたとしたら、
それは処理の先頭にくるたびにiを宣言するという意味になるが、
まだその時点ではブロックを抜けていないから、
前に宣言したiは有効で、これは文法上エラーとなる。
もし while(static int= … と宣言してうまくいくとしても、
それはおそらく何の利益もない。

734:デフォルトの名無しさん
07/07/16 23:04:35
for(i=0;i=f();i=0){

とでも書いとけ

735:デフォルトの名無しさん
07/07/16 23:08:04
そんなにループ内だけで変数を使いたいなら関数にでもしてしまえばよろしい

736:734
07/07/16 23:10:44
まちがったが訂正はしない
わかって
おねがい

737:デフォルトの名無しさん
07/07/16 23:15:49
{
 int obj;
 while( obj = nextObj() ) {
 // something
 }
}

みたいにブロックで囲めばいいじゃん。

738:デフォルトの名無しさん
07/07/16 23:25:36
つーか
for (int obj; obj = nextObj(); ) {
// something;
}
でおk

739:デフォルトの名無しさん
07/07/17 08:18:31
はんのーした香具師らは負け組

740:デフォルトの名無しさん
07/07/17 10:40:12
>>733
>それは処理の先頭にくるたびにiを宣言するという意味になるが
ブロック先頭での宣言と同様に扱えばいいわけですが
規格ではそうはしなかった、ってだけの話では?

741:デフォルトの名無しさん
07/07/17 15:04:07
>>740
そもそもそんな話じゃない。
規格では while に書いたステートメントは値を返さないといけないが、
int i = ... のような変数の宣言は値を返さないので書けないだけの事。

742:デフォルトの名無しさん
07/07/17 15:10:43
>>741
> while に書いたステートメント
> 変数の宣言は値を返さない

現行の規格の話するんなら正確にな。
文法的に while の条件に文は書けない。
式だけ。そして文には値とかないから。

743:デフォルトの名無しさん
07/07/17 16:31:46
なんというマジレスの嵐

744:デフォルトの名無しさん
07/07/17 17:23:12
for (;int i = hoge();)

745:デフォルトの名無しさん
07/07/17 17:32:03
寿司食いたい

746:デフォルトの名無しさん
07/07/17 17:35:08
>>745
ガリでも食ってろ

747:デフォルトの名無しさん
07/07/17 18:50:31
C++でできるんだから、C99でできるようにすることも可能だったとは思う。
どういう経緯があったかは知らないが、結果として制定されたC99では、
できるようになっていないけど。

以下チラシの裏
これは、こういうコード
Tok* ct;
if (ct = gettok()) { /* ... */ }
に対して、条件式のところで変数を宣言できれば、未初期化の変数を減らせ、
ついでに条件文内に変数の有効範囲を閉じ込められるというアイデアだった。
if (Tok* ct = gettok())
{
  // ctはスコープ内
}
// ctはスコープ外
参考『C++の設計と進化』 3.11.5.2 条件文の中の宣言

C++では、C以上に初期化と代入が区別されるので、
>>737-738のような書き換えができないこともある。
それもあって、俺はたまに使うし、C++からは無くなれと思わない。

748:デフォルトの名無しさん
07/07/17 19:06:31
この文でコンパイルできるんだが結果が正しくでません。
どこか誤りありますか?
#include<stdio.h>
void main()
{
int a, b,c;
printf("a = ");
scanf("%d",&a);
printf("b = ");
scanf("%d",&b);
printf("c = ");
scanf("%d",&c);


if( a == b == c ){
printf("%d\n",a);
}else if( a >= b >= c ){
printf("%d\n",a);
}else if( a >= c >= b ){
printf("%d\n",a);
}else if( b >= a >= c ){
printf("%d\n",b);
}else if( b >= c >= a ){
printf("%d\n",b);
}else if( c >= a >= b ){
printf("%d\n",c);
}else if( c >= b >= a ){
printf("%d\n",c);
}
}

749:デフォルトの名無しさん
07/07/17 19:14:43
>>748
「何をやろうとしているのか、また何が正しいのかは
 コードから読みやがれ」ってか。大した奴だ。

…とか思ってたら、ひと目で変な記述が。

>if( a == b == c ){
>if( a >= b >= c ){
    :(略)

そんな書き方できない。
面倒でも

if (a == b && b == c) {
if (a >= b && b >= c) {
    :(略)

と書かないと。

750:デフォルトの名無しさん
07/07/17 19:16:46
>>749
スマソ。そしてありがとう。
そうやったら、できました。

751:c言語初心者
07/07/17 19:38:16
突然すいません!!学校の問題でc言語の問題が3つ出たのですがまったくわからないです。問題書き込むんで誰か解いてもらえませんか?
よろしくお願いします。


752:デフォルトの名無しさん
07/07/17 19:40:08
OKとりあえず宿題スレ逝け。

753:c言語初心者
07/07/17 19:43:22
宿題すれってあるんですか??


754:デフォルトの名無しさん
07/07/17 19:45:11
C言語なら俺に聞け(入門篇) Part 16
スレリンク(tech板)


755:c言語初心者
07/07/17 19:50:54
ここならしていただけるんですか??

756:デフォルトの名無しさん
07/07/17 19:53:03
>>755
>>751
> 学校の問題

C/C++の宿題を片付けます 93代目
スレリンク(tech板)


757:デフォルトの名無しさん
07/07/17 19:55:22
ただし回答者の気が向いたら
気に入られなければスルーされる

758:デフォルトの名無しさん
07/07/18 05:49:19
スレ立てられなかった。誰かキボン。

スレタイ: 【初心者歓迎】C/C++室 Ver.40【環境依存OK】

エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
age 推奨ですが、自己判断で。

◆ 前スレ: 【初心者歓迎】C/C++室 Ver.39【環境依存OK】
スレリンク(tech板)

◆ アップローダー (質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

759:デフォルトの名無しさん
07/07/18 11:05:17
>>758
何故このスレで……

760:デフォルトの名無しさん
07/07/18 13:58:47
もう立ってるね

761:デフォルトの名無しさん
07/07/19 01:02:10
cの入門書とポインタ攻略本を読んでほぼ理解できたんだけど次に何読めばいいかわからん

何かお勧めの参考書教えてください

762:デフォルトの名無しさん
07/07/19 01:05:40
アルゴリズムとデータ構造

763:デフォルトの名無しさん
07/07/19 01:10:14
30日でできる! OS自作入門

764:デフォルトの名無しさん
07/07/19 01:13:03
K&R

765:デフォルトの名無しさん
07/07/19 01:41:38
アルゴリズム辞典

766:デフォルトの名無しさん
07/07/19 10:10:47
>>761
>読んでほぼ理解できたんだけど
本当なら大したもんだけど、
>cの
も少しケースセンシティブになろうね。

767:デフォルトの名無しさん
07/07/19 21:12:03
ケースセンシティブにもう少しもないものだ

768:デフォルトの名無しさん
07/07/20 01:15:22
たしかにw

まぁ、ポインタは理解したんだろう。
面倒なのはポインタよりも、ポインタの絡んだ型宣言の方だから。

769:デフォルトの名無しさん
07/07/20 01:38:29
えーとintの配列へのポインタを受け取って関数へのポインタへのポインタを返す関数・・・

770:デフォルトの名無しさん
07/07/20 11:12:34
typedef って便利だよな。

771:デフォルトの名無しさん
07/07/20 13:33:33
俺は、typedef void (*func)(int)っていうのを見て
何をtypedefしてんだ?と思った時期もありました。

772:デフォルトの名無しさん
07/07/20 16:53:23
void (*const *foo(const int (*p)[10]))(void (T::*)(int (U::*)()));

773:デフォルトの名無しさん
07/07/20 17:03:50
typedef様様だな

774:デフォルトの名無しさん
07/07/20 17:16:19
>>771
それ何をtypedefしてるの?
初めて見た

775:デフォルトの名無しさん
07/07/20 17:29:32
>>774
intの引数が1つで値を返さない関数を func にtypedef
例えば、、、

void foo(int);
func f = foo;
とか

776:デフォルトの名無しさん
07/07/20 17:38:57
なるほどー
自分に使う機会が来るかはわからんけど覚えておこう
thx

777:デフォルトの名無しさん
07/07/20 18:12:25
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

778:デフォルトの名無しさん
07/07/20 18:13:29
typedef int (U::*FP1)();
typedef void (T::*FP2)(FP1);
typedef void (*FP3)(FP2);

const FP3* foo(const int p[][10]);

779:デフォルトの名無しさん
07/07/20 20:18:26
>>777
ビットフラグのクリアとか?

780:デフォルトの名無しさん
07/07/20 20:45:24
>>777
ビットの配列を作るときに使う

781:デフォルトの名無しさん
07/07/20 20:45:55
「作る」じゃなくて「操作する」だな。すまん。

782:デフォルトの名無しさん
07/07/20 21:50:27
>>779-781
ビットシフトはなんの役に立つのでしょうか?
でぐぐれ

783:デフォルトの名無しさん
07/07/20 21:56:19
そういえばどうしてローテートはないんだろ

784:デフォルトの名無しさん
07/07/20 22:20:58
>>777
コレ見るの、3回目か4回目くらいなんだけど、ギャグかなんかなの?

785:デフォルトの名無しさん
07/07/20 23:02:06
不定期テンプレ

786:デフォルトの名無しさん
07/07/20 23:14:02
ただの荒らし
あるいは風物詩
あるいは新参の受ける洗礼

787:デフォルトの名無しさん
07/07/21 00:56:47
>>783
ローテートをサポートしない CPU も多いんじゃね?
知らんけど。

788:デフォルトの名無しさん
07/07/21 01:07:00
>>784
少ないなw

789:デフォルトの名無しさん
07/07/21 02:04:14
&a->bって&(a->b)か(&a)->bかどっち?

790:デフォルトの名無しさん
07/07/21 02:09:29
「演算子 順位」とかでぐぐれ

791:デフォルトの名無しさん
07/07/21 02:19:04
&(a->b)ですね。ありがとう。

792:デフォルトの名無しさん
07/07/21 02:25:36
つか、やってみりゃ分かるだろ。

793:デフォルトの名無しさん
07/07/21 02:39:22
その態度は良くない。
・規格を読んで正しい挙動を把握する
・実際に処理系で実験してみる
・結果が規格と異なった場合パッチを書いてしかるべき所に送りつける(オプション)

794:デフォルトの名無しさん
07/07/21 03:25:22
規格読んで来て、理解して&(a->b)を常に&a->bとか書くように
なる人と仕事組んだら俺泣きそうw

795:デフォルトの名無しさん
07/07/21 04:28:59
&a->b は普通に書くだろw

796:デフォルトの名無しさん
07/07/21 04:41:50
>・規格を読んで正しい挙動を把握する
=「演算子 順位」とかでぐぐれ
>・実際に処理系で実験してみる
=つか、やってみりゃ分かるだろ。

797:デフォルトの名無しさん
07/07/21 04:45:12
正しい挙動を把握してから実験で確認するのと、
実験して結果を見て予想するのは、大きな違いがある。


798:デフォルトの名無しさん
07/07/21 05:26:51
その態度はよくない。
実験して結果を見て法則を導くスタイルが無いと。

799:デフォルトの名無しさん
07/07/21 05:30:11
はいはい、そうですね

800:デフォルトの名無しさん
07/07/21 05:48:50
実験した後に確かめた方がいい。

801:デフォルトの名無しさん
07/07/21 10:00:56
演算子の優先順位は、処理系依存ってことはないだろうから、実験でいいんじゃね?

802:デフォルトの名無しさん
07/07/21 10:02:37
規格読む→実験する→2chで煽りつつ確かめる

803:デフォルトの名無しさん
07/07/21 10:11:19
規格読む前に実験した方が実感しやすいな。

804:デフォルトの名無しさん
07/07/21 10:36:58
その通りだ。実験して、壁にぶち当たって、その壁をぶっ壊せ!
フラグメンテーションエラーで、メモリーもぶっ壊せ!
そして泣きながら規格読んで実感だ!

805:デフォルトの名無しさん
07/07/21 11:26:38
>>804
>そして泣きながら規格読んで実感だ!
お疲れ様です。

806:デフォルトの名無しさん
07/07/21 11:51:31
C++ だが、export は色んな意味で泣ける。

807:デフォルトの名無しさん
07/07/21 12:27:13
俺の胸でなけ

808:デフォルトの名無しさん
07/07/21 13:02:06
俺の下であがけ

809:デフォルトの名無しさん
07/07/21 14:42:57
実験だけじゃ優先順位なのか結合の方向なのか解らない、と。
まぁ、&a->bくらいなら、どっちでもいいけど。

810:デフォルトの名無しさん
07/07/21 16:25:12
&a->b が (&a)->b と見做されるんだとしたら
皆 a.b と書くと思うんだわ。

811:デフォルトの名無しさん
07/07/22 00:30:44
&a.bじゃないか?

812:デフォルトの名無しさん
07/07/22 00:31:41
終電まで仕事してて疲れてた。>>811はお願いだから忘れて

813:デフォルトの名無しさん
07/07/22 10:05:19
CD-R に保存しました

814:デフォルトの名無しさん
07/07/24 03:59:19
石版に刻みました

815:デフォルトの名無しさん
07/07/24 09:46:04
DNAに移植しました

816:デフォルトの名無しさん
07/07/24 10:10:45
アカシックレコードに刻まれました。

817:デフォルトの名無しさん
07/08/01 00:15:00
C++ の STL に感動しました
C言語で STL に似たことをしたいと思ったらどうすれば良いですか?

818:デフォルトの名無しさん
07/08/01 00:16:19
C++に乗り換える。

819:デフォルトの名無しさん
07/08/01 00:17:24
やっぱりそれが確実ですよね

820:デフォルトの名無しさん
07/08/01 00:20:58
マクロを使う。

821:デフォルトの名無しさん
07/08/01 02:11:51
そういえば、templateが使えない時代にはgeneric.hってのがあったな

822:デフォルトの名無しさん
07/08/01 21:08:58
>>817
こんなんあった。かなりSTLに近いんじゃないか?
マクロを使ってるからデバッグがむずかしそうだが


>URLリンク(sourceforge.jp)
>CSTLは、C言語で使えるC++のSTLライクなコンテナライブラリです。
>vector, deque, list, set, multiset, map, multimap, stringを提供します。

823:デフォルトの名無しさん
07/08/02 10:16:24
FILE *t=tmpfile();
で作成したtを
fclose(t);
してもいいですか?
なんか危なくて、こわいです。


824:デフォルトの名無しさん
07/08/02 10:24:04
なんで危ないんだよw
まあ、またその内容を使うことがあるなら閉じちゃだめだが。

825:デフォルトの名無しさん
07/08/02 10:44:31
ええ!
fclose(t)ってやってよかったの?

826:デフォルトの名無しさん
07/08/02 10:56:00
C言語辞典見てみたけど、やっていいみたい。

827:デフォルトの名無しさん
07/08/02 11:09:09
用がなくなったら閉じないとダメだろ。常考。

828:デフォルトの名無しさん
07/08/02 11:52:56
tmpfile()は、そのファイルがクローズされたか、またはプログラムが終了したときに
自動的に削除されるファイルを生成し、そのストリームへのポインタを返す。

何も問題はない。

829:デフォルトの名無しさん
07/08/03 06:35:21
自分ならOOライクにたとえ1行で済んだとしても生成と破棄を対にして両方の関数を作る

830:デフォルトの名無しさん
07/08/03 07:59:09
なら別にC使わないで他のOO使えばいいじゃん。頭かたいね。

831:デフォルトの名無しさん
07/08/03 08:38:00
生成と破棄を対にすることがOOライクだと思うくらいならそれでもいいんじゃね?

832:デフォルトの名無しさん
07/08/03 09:21:23
ぷっ

833:デフォルトの名無しさん
07/08/03 11:09:16
>>830
固いんじゃなく、弱いんだろう。

834:デフォルトの名無しさん
07/08/03 23:43:24
>>822
面白そうなものがあるんですね
GPLじゃないところもイイ!

ただ、著作表示だけはしないといけないようですね

835:デフォルトの名無しさん
07/08/04 00:29:40
>>834
BSDライセンスらしいから緩いでしょ

836:デフォルトの名無しさん
07/08/04 00:34:52
いや修正BSDって中のファイルに書いてるじゃん

837:デフォルトの名無しさん
07/08/05 18:02:02
////(main.h)
#ifndef MAIN_H
#define MAIN_H
int X
#endif
////

////(main.cpp)
#include "main.h"
#include "move.cpp"
main(){
move();
}
////

////(move.cpp)
#include "main.h"
move(){
(Xを操作する処理)
}
////

ゲームプログラミングを勉強中で、大筋で感じな状況になってます。
これをコンパイルすることも実行することもできるのですが
BCCでコンパイルすると、「パブリックモジュール_Xが、main.objとmove.objの
両方で定義されている」と警告されます。
これはどういうことで何が悪いのでしょうか?
グローバル関数を使いながら、ファイルを分割してみたいのですがどうしたらいいのでしょうか?





838:デフォルトの名無しさん
07/08/05 18:03:42
>>837
////(main.cpp)
#include "main.h"
#include "move.cpp"←いらなくね?

839:デフォルトの名無しさん
07/08/05 18:06:54
int X;
    ~

840:837
07/08/05 18:15:40
>>838
それを消したら、未定義の関数moveを呼び出したなどとエラーだ出ます。

>>839
掲示板に書き込む時に簡略化したら忘れてしまいました。

841:デフォルトの名無しさん
07/08/05 18:21:04
>>837
宣言と定義の区別をしっかりと。ヘッダには変数や関数の宣言だけ置くこと。

842:デフォルトの名無しさん
07/08/05 18:23:31
プロトタイプ宣言でググれ

843:デフォルトの名無しさん
07/08/05 20:04:20
////(main.h)
#ifndef MAIN_H
#define MAIN_H
extern int X;
#endif
////

////(main.cpp)
#include "main.h"
#include "move.h"
int main(){
move();
}
////

////(move.h)
#ifndef MOVE_H
#define MOVE_H
int move();
#endif
////

////(move.cpp)
#include "main.h"
int move(){
(Xを操作する処理)
}
////

844:デフォルトの名無しさん
07/08/05 20:05:03
まちがった

////(main.cpp)
#include "main.h"
#include "move.h"
int X;
int main(){
move();
}
////


845:わ ◆V92eIRyEPU
07/08/14 14:48:11


846:拿 ◆J/ZoJAt3T2
07/08/14 14:50:07
テスト

847:デフォルトの名無しさん
07/08/15 23:58:55
>>843-844
俺なら、
extern int X; はmove.h側に入れて、int X; は move.cpp に入れて、
main.hは消すかな。細かいことですんませんね。

>>837
安心しなさい。あなたの方が、うちの元請けより優秀です!
ちゃんと #ifndef使うあたりが。

848:名無しさん@お腹いっぱい
07/08/19 03:09:14
すいません最近c言語を習い始めたのですが、円の半径(double型)をあたえて、円周の長さと
と円の面積を表示するプログラムがどうしてもできません。
どうすればよいのでしょうか?


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