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

【ANSI-C】 C言語なら俺に聞け!  Part 129

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/08/27(日) 15:43:44
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け!  Part 128
http://pc8.2ch.net/test/read.cgi/tech/1151282084/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
C/C++の宿題を片付けます 73代目
http://pc8.2ch.net/test/read.cgi/tech/1155355501/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
0449デフォルトの名無しさん2006/09/14(木) 23:30:05
>>448
まず、やりたいことを日本語で詳しく書いてみたらどうだろう?
読みたいファイルのサイズも含めて。
04504292006/09/14(木) 23:40:10
>>449
はい。すみません。

ファイル名 file.name

作者:ねずみ講
猫がねこんだアナコンダ
あめんぼあかいなあいうえお
空と君との間には
紫の薔薇の人
・・・

とまぁ、こんな感じのファイルを
最初の先頭行(作者)の行以外を別の配列にセットして
出力したいのです。
0451デフォルトの名無しさん2006/09/15(金) 02:23:01
上のほうのsigned char*をunsigned cahr*にキャストする話で疑問に思って

#include <stdio.h>
int main(){

int i=-1;
int *ip = &i;
unsigned int *ip2 = (unsigned int *)ip;

printf("i = %d\n",i);
printf("*ip = %d\n",*ip);
printf("*ip2 = %d\n",*ip2);

if (*ip2 > 0) printf("*ip2 は正です");

return 0;
}

と書いて実行してみたら

i = -1
*ip = -1
*ip2 = -1
*ip2 は正です

となってしまったのですが、*ip2 は正と負、どちらなんでしょうか?
0452デフォルトの名無しさん2006/09/15(金) 02:43:42
>>451
printfの書式指定の中で %d とやっているが、これは int用の指定。
unsigned用にするには %uとしなければならない。

そしてunsignedなんだから、0でなければ必ず正。
04534512006/09/15(金) 02:59:38
>>452
%uというのがあったんですね、ありがとうございます
*ip2は正で、iは負のままだから、*で参照される度にiがunsigned intにキャストされてるってことなんですね
0454デフォルトの名無しさん2006/09/15(金) 03:10:09
>>453
正確には解釈が微妙に間違っているのだが・・・・まあそれでいいだろ。
勉強を進めていくうちに別な見方にも気づく事だろう。
0455デフォルトの名無しさん2006/09/15(金) 03:26:54
>>454
ありゃ微妙に違うんですか…精進します
0456デフォルトの名無しさん2006/09/15(金) 03:38:00
微妙にどころか思いっきり違ってるんだが、少し勉強が進めばわかるこったし、気にスンナ。
0457デフォルトの名無しさん2006/09/15(金) 04:25:55
http://portable-c.jugem.jp/?eid=22
> 今回のテーマであるNULLですが、このマクロで表される空ポインタ定数というのは、実は関数へのポインタには代入することができません。

これマジ?
0458デフォルトの名無しさん2006/09/15(金) 16:32:58
cygwin上でfopenするとFILE*が正常に取得できるのに
errno=29(ESPIPE)が設定されてしまいます。気にしなくていいのでしょうか。
open()&lseek()使った方がいいですか?
その後ファイルへの書き込みはできます。

errno=0;
printf("%s:%d:errno[%d]\n", __FILE__, __LINE__, errno);
fp = fopen(filename, "ab");
printf("%s:%d:errno[%d]\n", __FILE__, __LINE__, errno);

04594582006/09/15(金) 16:52:27
すいません、FAQにこうありました。気にしないことにします。

>プログラムがerrnoの中身を調べることは、エラーが報告されたときだけ意味があることに注意
0460デフォルトの名無しさん2006/09/15(金) 22:07:02
データファイルがいくつもあるフォルダ下で
プログラムを実行し、ファイルを読みとるため、
データファイル名を入力するとき、入力補完機能をつけるにはどうすればよいのでようか?
長いファイル名をイチイチうつのが面倒なのですが
UNIX環境みたいにscanfで文字を入力する際に補完とかできないかと思いまして
0461デフォルトの名無しさん2006/09/15(金) 22:17:36
シェルのソースでも読めば?

まあ補完機能の部分だけなら別に読む必要も無いだろうが。
0462デフォルトの名無しさん2006/09/16(土) 00:59:37
ワイルドカードを使えるようにしたら?
0463デフォルトの名無しさん2006/09/16(土) 02:30:08
>>457
つうか厳密には比較もダメみたいに書いてあるね

今まで
if(f!=NULL){
f();
}

とかさんざんやってきたんだけど・・・
0464デフォルトの名無しさん2006/09/16(土) 03:55:35
>>463
いや、比較は大丈夫らしいぞ。
それで代入がダメってのは、なんかおかしい気がするが。
0465デフォルトの名無しさん2006/09/16(土) 16:13:09
NULLポインタのビットパターンがすべて0とは限らないが、
0とNULLポインタを比較すると真になる。

http://www.kouno.jp/home/c_faq/c5.html#2
0466デフォルトの名無しさん2006/09/16(土) 21:16:00
質問です。

条件
AさんとBさんがいます。AさんとBさんは通信ができます。
AさんとBさんが通信を開始し、終了すると、その間の記録がログファイルとして
記録されます。
通信の開始は、キーボードからスタートと入力することにより開始されます。
終了は、キーボードからエンドと入力することにより、開始されます。

言語はC++。コンパイラはVisual C++

要求
通信を自動的に1時間ごと切り、1時間ごとのログファイルを作成したい。


よろしくお願いいたします。
0467デフォルトの名無しさん2006/09/16(土) 21:16:14
ぬるぽ代入できないのにぬるぽと比較して意味あるのかな
0468デフォルトの名無しさん2006/09/16(土) 21:20:06
          _
      ミ ∠_)
         /
         /   \\
 ウイーン  Γ/了     | |
  ウイーン  |.@|    | | ガッガッガッ
       | / | .     人
       |/ |    <  >_Λ∩
      _/  | //. V`Д´)/←>>467
      (_フ彡           /
0469デフォルトの名無しさん2006/09/16(土) 21:21:09
>>466
宿題は宿題スレへ行け。
C++のことはC++スレへ行け。
0470デフォルトの名無しさん2006/09/16(土) 21:21:25
とりあえずぬるぽと言ってる香具師は該当スレにカエレ(・∀・)
0471デフォルトの名無しさん2006/09/16(土) 22:13:51
>終了は、キーボードからエンドと入力することにより、開始されます。
難しいな、いつになったら終わるんだ?
0472デフォルトの名無しさん2006/09/17(日) 19:11:10
ビット演算についてなんですけど、
unsigned char型で11111011みたいな一つだけ0で残り1にしたいのですがどうすればいいのでしょうか?
上の場合だと255を入れてやれば全部1になりますが、その状態でシフトさせると0が入ってしまうと思います。
アルゴリズムだけでもいいので御願いします。
0473デフォルトの名無しさん2006/09/17(日) 19:12:26
ANDとかORとか
0474デフォルトの名無しさん2006/09/17(日) 19:26:16
>>472
~(1 << n)
04754722006/09/17(日) 19:34:36
>>474
あ、反転がありましたか
反転はあまり使った事がなかったので思いつきませんでした。
ありがとうございます。
0476デフォルトの名無しさん2006/09/17(日) 19:58:22
なんだかさっぱり分からないんだけど、質問の意味分かった人いるの?
0477デフォルトの名無しさん2006/09/17(日) 19:59:45
馬鹿には分からないだろ
0478デフォルトの名無しさん2006/09/17(日) 20:14:36
俺もわからんかった。
nビット目を0その他を1にする方法を教えてくれということなのか>>472の質問は?

>>474の回答で納得したからそうなんだろうな。
0479デフォルトの名無しさん2006/09/17(日) 20:51:13
なーんだそうだったのか。最初からそう言ってくれよ
0480デフォルトの名無しさん2006/09/18(月) 02:25:43
ライブラリの質問もこちらでしょうか?
先日無償公開された某TurboC++でコンソールアプリを入門しています。

読み込んだバイナリを1バイトずつ頭に0xを付けて16進数で書き出す・・・と言うのを作ろうとしているのですが、ヘルプで見付かりません。
atol()やstrtol()みたいに文字列からの数値変換は見付かったのですが。
ltoa()やltostr()みたいな、変数を指定基数で文字列化する関数は無いのでしょうか。

無ければ自作するし、見落としていたら関数名を御教授下さい。
0481デフォルトの名無しさん2006/09/18(月) 02:30:37
sprintf()
04824802006/09/18(月) 02:38:40
>>481
あああああ、そうですね!
応用の利かない自分が恥ずかしい。
速攻返答、有難う御座いました。
0483デフォルトの名無しさん2006/09/18(月) 07:45:50
質問です(学習者ではなく、一応本職です)。

ANSI Cの原典に当たろうかとansi.orgを調べてみたけど、
どうも見つからない。
調べ方が悪いのか、そもそもWebからは閲覧できないのか教えてください。
0484デフォルトの名無しさん2006/09/18(月) 12:56:28
現在のCの国際規格は、ISO/IEC 9899:1999
0485デフォルトの名無しさん2006/09/18(月) 13:29:28
>483
ANSIやJISは規格書で利益(財源)を確保しているので無理だったようなきがする。
0486デフォルトの名無しさん2006/09/18(月) 14:04:24
>>483
ISO のドラフトがダウンロードできるぜ。
http://www.open-std.org/jtc1/sc22/wg14/
0487デフォルトの名無しさん2006/09/18(月) 16:30:35
>>484-486
サンクス!
「ANSI C」っていうのは近年では「国際規格に則ったC」くらいの意味になってるのかな。

提示してもらった先にあるC99RationaleV5.10 あたり(C99の方針まとめ?)、
俺の求めてたものに雰囲気が近くて良い感じです。
0488デフォルトの名無しさん2006/09/18(月) 17:01:27
スレタイにISOとJISも入れようぜってずっと言ってるんだけどなあ
0489デフォルトの名無しさん2006/09/18(月) 17:02:25
>488
なんで却下され続けてるんだろうな?
単に忘れられてるだけなのか?
0490デフォルトの名無しさん2006/09/18(月) 17:12:12
>>489
いや、入れたら、C99についてのFAQスレになっちまうからだろ。
C99を完全サポートした処理系がもっと一般化するまでは非現実的だ。
0491デフォルトの名無しさん2006/09/18(月) 17:18:32
>>490
なんでそうなるの?関連がわからん。
0492デフォルトの名無しさん2006/09/18(月) 17:19:59
ISO/IEC 9899:1999ってのはつまりC99のことだけど
「ANSI C」である限りC99は含まないから?
0493デフォルトの名無しさん2006/09/18(月) 17:25:32
実際問題、C99のFAQスレになって何が悪いのかって気がするが。
0494デフォルトの名無しさん2006/09/18(月) 17:26:37
restrictとか_Complexとかコンパウンド・リテラルとかを見るのがウザイ。
0495デフォルトの名無しさん2006/09/18(月) 17:27:33
また随分と私的な。
文句はC99に言ってやれ。
0496デフォルトの名無しさん2006/09/18(月) 17:28:24
だって俺C99を使える処理系持ってないもん。
安く手に入る完全準拠の処理系はどっかにないの?
0497デフォルトの名無しさん2006/09/18(月) 17:29:52
完全準拠かどうかは知らんが、CodeWarriorあたりなら安いだろ。
つーか学生の私怨なのかよorz
0498デフォルトの名無しさん2006/09/18(月) 17:31:36
完全準拠のC99処理系を持っている人の絶対数が少ない現状、
C99のFAQスレになる事にどんな意義があるのだろう。ただのオナニースレに
なるのでは。
0499デフォルトの名無しさん2006/09/18(月) 17:42:39
別に完全である必要はないだろう
VCみたいなメジャーどころも
C++完全互換じゃなくてもC++として扱ってたんだし
0500デフォルトの名無しさん2006/09/18(月) 18:02:00
VC6はメジャーだったからね。
C99部分準拠でメジャーというとgcc位か?今の所。
0501デフォルトの名無しさん2006/09/18(月) 18:41:30
C90ことISO/IEC 9899 : 1990のことも忘れないで。
0502デフォルトの名無しさん2006/09/18(月) 21:27:57
iccもSunのccもc99準拠。
0503デフォルトの名無しさん2006/09/18(月) 21:29:25
今のところC99の新機能は__func__しか使ってない俺が来ましたよ
0504デフォルトの名無しさん2006/09/18(月) 21:36:16
俺はブロック先頭以外の変数の宣言と//を使っているぜ。
というか意識していないと気が付くと入ってるw
0505デフォルトの名無しさん2006/09/18(月) 21:48:07
>>504
c99ってgoto でローカル変数宣言を飛び越えられるの?(C++だとエラー)
0506デフォルトの名無しさん2006/09/19(火) 01:06:21
>>503
vsnprintfも使ってる俺の勝ち。
0507デフォルトの名無しさん2006/09/19(火) 01:08:15
C99の拡張の何割かは、それまでもベンダーが独自拡張で対応してた機能が
仕様に取り込まれた様なもんだったりするし、各処理系の対応も需要の割には早めだよな。
つーことで次スレからはISOとJISもスレタイに入れるってことで。
0508デフォルトの名無しさん2006/09/19(火) 01:47:48
こんなかんじ?
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130 【C89/C90/C99】
0509デフォルトの名無しさん2006/09/19(火) 01:50:03
永杉
BBS_SUBJECT_COUNT=48
0510デフォルトの名無しさん2006/09/19(火) 01:55:14
じゃ後ろいらないや。こんな感じ?
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
0511デフォルトの名無しさん2006/09/19(火) 10:23:13
C99のFAQや話題を取り扱ったスレを新たに作ればいいだけじゃん。
スレ進行は亀かも知れんけど。
0512デフォルトの名無しさん2006/09/19(火) 10:24:58
>>510 それでいいんじゃないか?
C99のたいていの機能が使えるコンパイラは、dmc, gccぐらいしか知らない。
ほかに、無料なのあるの?
0513デフォルトの名無しさん2006/09/19(火) 10:50:16
なんで、ビットローテートが無いんだ!
あと、整数演算でキャリーとかボローが発生したときの
振る舞いについて、言語としての既定がないのが痛い。
結局はキャリーフラグとか調べなきゃならんじゃないか。
0514デフォルトの名無しさん2006/09/19(火) 10:55:11
>>513
多分機械固有に依存する面が多いからだろう。極端な場合、キャリーフラグが
存在しない機械も考えられる。それに、いざとなったらインラインアセンブラなど
を利用すればいいし。
0515デフォルトの名無しさん2006/09/19(火) 11:00:13
まぁそういうプロセッサの場合は事前に二項の値を調べるしかないよな。
しかし言語としての既定がないとポータブルに書けないのがつらいな。
C++ でも整数演算クラスがあって例外を投げてくれるとかもないしな。
0516デフォルトの名無しさん2006/09/19(火) 12:08:38
for (i=0;i<10;i++) {
fp = fopen( "i.txt", "w" );
}

上のようなニュアンスで、
0.txt, 1.txt, 2.txt, ・・・
ファイルを書き出したいのですが、どうすれば良いでしょうか?
よろしくお願いいたします。
0517デフォルトの名無しさん2006/09/19(火) 12:20:10
char buf[100];
...............
for (i=......... {
sprintf(buf, "%d.txt", i);
fp = fopen(buf, "w");
}
0518デフォルトの名無しさん2006/09/19(火) 12:25:35
ニュアンスコンパイラ・・・
究極のコンパイラか。
0519デフォルトの名無しさん2006/09/19(火) 16:12:19
ソースファイルAで
foo[]={a,b,c};
のように初期化されてる配列を別のファイルBでextern参照し
sizeof(foo);
のようにするとincomplete type と言われていまいます。
同一ファイルだと上手くいくのですが、どうしても分割したいです。
どのようにすれば良いのでしょうか
0520デフォルトの名無しさん2006/09/19(火) 16:20:44
extern foo[3];
0521デフォルトの名無しさん2006/09/19(火) 16:21:12
Aの中でsizeofして得た値も一緒にextern
0522デフォルトの名無しさん2006/09/20(水) 00:27:21
>>513
それは思った事がある。
もしかして、PDP-11にはローテート命令とかCフラグがなかったのか?
あと、010進/0x10進表現があって0b10進数表現がないのも腑に落ちないなあ。
0523デフォルトの名無しさん2006/09/20(水) 02:22:13
>>522
昔ッから言われてるけど、こりゃ一生放置プレイだろうな。
遅きに失したというか、入れるタイミングを見失ってる感じだ。
05245222006/09/20(水) 05:05:38
>>523
そうなのですか。
コミュニティなどとは疎遠なので知りませんでした。
C99の次に更新があるとも思いにくいし、一生放置かぁ。
自分で代替関数書いていて空しくなる(^^;
0525デフォルトの名無しさん2006/09/20(水) 08:34:59
コンパイラ内部の文字コードがASCIIではないCコンパイラって結構あるものなんですか?
0526デフォルトの名無しさん2006/09/20(水) 08:54:32
トライグラフ文字
0527デフォルトの名無しさん2006/09/20(水) 09:29:40
>>513
RISC型プロセッサだとローテート命令がなかったりするし。
0528デフォルトの名無しさん2006/09/20(水) 09:57:31
ねえんだよなー。
まあ、困らないんだけどさ。
0529デフォルトの名無しさん2006/09/20(水) 10:58:36
ローテートはあってもどのみちレジスタの幅に依存した使い方になるからな
0530デフォルトの名無しさん2006/09/20(水) 11:09:12
シフト命令だってプロセッサによっては固定長でしか
動かすことが出来ず、変数でシフト数を指定したら何行かの
命令コードで対応するようなコンパイラもあるから、ローテート
だって、C言語で演算子と動作を決めてやればコンパイラが
がんばったと思う。

<> でローテートとかあっても良かったなあ。
0531デフォルトの名無しさん2006/09/20(水) 11:30:09
インラインアセンブラじゃ役不足なのか?
ローテート・シフト・ビット演算なんてどうせカリカリにチューンしたい
時だけだろ。
0532デフォルトの名無しさん2006/09/20(水) 12:06:37
Cで書ける方がスマート。機能を削ろうって議論じゃないんだから、
使う側からすれば反対する理由はないでしょ。
まあ搭載されることは無いとは思うが。
0533デフォルトの名無しさん2006/09/20(水) 16:25:38
ファイルがいつ(年月日と時刻)作成されたかを取得する方法はありますか?
0534デフォルトの名無しさん2006/09/20(水) 16:36:17
>>533
スレ違い。環境を明記してこっちで。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
0535デフォルトの名無しさん2006/09/20(水) 18:48:07
質問させてください。

構造体
typedef struct {
  int x;
} TEST;

void set( TEST **test )
{
  *test = ( TEST * )malloc( sizeof( TEST ) * 2 );

   // ここは代入できる
  test[0]->x = 1;

  // ここが出来ない
test[1]->x = 2;
}

int main()
{
  TEST *test = NULL;

  set( &test );

  return 0;
}

// ここが出来ない
で書き込み違反エラーが出てしまいます
これはやはり領域の確保が出来ていないという事でしょうか?
どうすればいいのか、よろしく御願いします。
0536デフォルトの名無しさん2006/09/20(水) 20:09:18
>>535
よく見直せ。
set関数ではtest[0]に確保したポインタを入れてるが
test[1]には何も入れてないじゃないか。アクセス違反が
出て当たり前。
0537デフォルトの名無しさんNGNG?2BP(200)
これでどうか。
test = ( TEST ** )malloc( sizeof( TEST ) * 2 );
0538デフォルトの名無しさん2006/09/20(水) 20:53:14
それだとtest[0]->xからして吹っ飛ぶ気がする
0539デフォルトの名無しさん2006/09/20(水) 22:10:01
このソースだけだとTESTをポインタのポインタにする意味が無いんだけど、
void set( TEST *test )
{
  test = ( TEST )malloc( sizeof( TEST ) * 2 );
  test[0]->x = 1;
  test[1]->x = 2;
}

int main()
{
  TEST *test = NULL;
  set( test );
}
これじゃ駄目なの?
0540デフォルトの名無しさん2006/09/20(水) 23:23:53
それだと、引数自体必要無くなるな。書くとしたらこうか?
(*test)[0].x = 1;
(*test)[1].x = 2;
0541デフォルトの名無しさん2006/09/20(水) 23:27:33
>>537
>>539
せめてポインタくらい理解して書けや
それならローカル変数でいいだろボケが
0542デフォルトの名無しさん2006/09/20(水) 23:30:57
基礎が足りてない。

図を描いて箱の中にアドレスが入っている場合と
実体が入っている場合を明確に区別して、今回の
ケースに割り当てれば何が悪いのかすぐに分る。
0543デフォルトの名無しさん2006/09/20(水) 23:54:30
いちいち、毎回、図を書かないと分からない低脳の集まりはここですか?
0544デフォルトの名無しさん2006/09/21(木) 00:41:58
図を描いて理解するのと
図を描かないと理解できないのは違うわけだが
0545デフォルトの名無しさん2006/09/21(木) 00:52:45
図を書かずに理解できる程度のおもちゃコードしか書いてないカスに低脳よばわりされるおまえらって・・・w
0546デフォルトの名無しさん2006/09/21(木) 01:06:49
それはやはり、図を書かないと理解できないコードこそが本物だと思い込む方が阿呆だな。
0547デフォルトの名無しさん2006/09/21(木) 01:23:03
ここか、噂の世界一レベルが低いスレは
0548デフォルトの名無しさん2006/09/21(木) 01:38:44
すぐ、世界一だとか宇宙一と言う、厨がいる低脳スレはここですか?
■ このスレッドは過去ログ倉庫に格納されています