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

C言語なら私に聞け(33)

■ このスレッドは過去ログ倉庫に格納されています
0001ジョブ子NGNG
姉です。30年プログラムを作りつづけて嫁に行きそびれてしまいました。
でもC言語の腕には自身があるので何でも聞いてね。

PS
関連擦れは面倒なのでほかの人に任せます。ウフッ
0153デフォルトの名無しさんNGNG
忘れていたが、はるか昔、俺も16と同じこと考えたことあった。
いまとなってはなんでそんな事考えたのかも思い出せないけど。

メモリの節約しようって発想はなかったけど、使い勝手から結局va_list使った。パスカル文字列風に先頭はデータ数入れて。でも、va_listで自動キャストされる規則をわすれたりして型を間違えると誤動作する。
0154名無しさん@EmacsNGNG
3D ライブラリが無い環境 (Palm 等) で 3D グラフィックを表示する
アプリケーションを作りたいのですが、参考になりそうなソースコード
がありましたら教えて下さい。
今は cbzone のソースを読んでいます。
0155デフォルトの名無しさんNGNG
>>152
こっちで聞け。
http://pc3.2ch.net/test/read.cgi/tech/1014404990/l50

>>151
その程度の書き込みしかできないなら、止めとけ。ヴァカみたいだぞ。
(みたいじゃねーのかもな。ププ)
0156nobodyさんNGNG
もう156.早い.
0157デフォルトの名無しさんNGNG
聞け!
0158デフォルトの名無しさんNGNG
VC買うのと無料のBCCつかうのって、どっちがいい?
0159デフォルトの名無しさんNGNG
>>158
売ってるティッシュ買うのと街頭で配ってるティッシュ使うのって、どっちがいい?
0160デフォルトの名無しさんNGNG
>>159
どっちでも良いってことですか?
0161デフォルトの名無しさんNGNG
ケツの拭き心地が違うということ
0162デフォルトの名無しさんNGNG
>>161
ケツの拭きごこちってどう言う意味?
作業のしやすさ?
0163デフォルトの名無しさんNGNG
>>162
配ってるティッシュ使ってみて不満があるなら売ってるの買えや
0164デフォルトの名無しさんNGNG
>>163
わかりました。
ありがとうございました。
0165デフォルトの名無しさんNGNG
>>163
僕は意味を聞いているのですが!
ケツの拭きごこちとプログラムを作るのと何の関係があるの?
あおりはやめてください。
0166デフォルトの名無しさんNGNG
>>165
騙りやめれ
0167デフォルトの名無しさんNGNG
なんでこれぐらいの事で怒るのか。
0168デフォルトの名無しさんNGNG
BCCでCのソースをコンパイルするとき拡張子を必ず.cにしないと
いけないと聞きました。Cのソースを.cppでコンパイルしたらどんな
不都合があるのですか。「倉薫」の入門本にもそんなくだりがあったが
理由がわかりません。
0169デフォルトの名無しさんNGNG


 ケ ツ 拭 い て み り ゃ あ わ か る だ ろ う が !
0170デフォルトの名無しさんNGNG
うっ・・・
0171デフォルトの名無しさんNGNG
>>168
明らかだろ。オマエがそうやって人に聞いてるの見てると、
もう(。A。)(.Λ.)(:>)(゚∀゚)(<:)(.Λ.)(。A。)って感じだな。
0172デフォルトの名無しさんNGNG
http://www.bloodshed.net/index.html

ここのPascalとC++の統合開発環境はけっこうよかったです。報告まで
0173デフォルトの名無しさんNGNG
>>171

いっている意味がわかりません。Hello,World程度の簡単なソースを
拡張子.cにしようが.cppにしようがコンパイル結果に関係ないと思うのですが。
0174デフォルトの名無しさんNGNG
>>168
> BCCでCのソースをコンパイルするとき拡張子を必ず.cにしないと
> いけないと聞きました。Cのソースを.cppでコンパイルしたらどんな
> 不都合があるのですか。「倉薫」の入門本にもそんなくだりがあったが
> 理由がわかりません。

C と C++ で一部非互換のところがあるからだよ。BCC は、使ったこと無いからわからんけど、VC++ では xxx.c なら sizeof 'a' == 4 となるが、xxx.cpp なら sizeof 'a' == 1 となる。
0175デフォルトの名無しさんNGNG
>>173
全然違う・・・
0176デフォルトの名無しさんNGNG
CとC++ではNULLの意味が異なります。
0177168,172,173NGNG
C++ってCのスーパーセットだから、CのソースをC++コンパイラでコンパイルすると
エラーはでないけど、実行時エラーがでる場合があるということですか?
0178デフォルトの名無しさんNGNG
まぁまぁ。
>>173は未だにトランスレータ式のC++コンパイラ使ってるんだよ。
なのに次からBCC使わなきゃなんなくなって、不安でしょうがないんだよ。
0179裕美子 ◆lIp1b.Ek NGNG
会話についていけないからもう質問はやめにします。すみませんでした。

参考までに、使用コンパイラは 試食版とBCCです。
0180デフォルトの名無しさんNGNG
>>179
あんただれ
0181裕美子NGNG
>>180
痴漢が話しかけないで!
0182デフォルトの名無しさんNGNG
char *c = malloc(128);
C++ではエラー出ます。
0183デフォルトの名無しさんNGNG
http://pc3.2ch.net/test/read.cgi/tech/1032421426/l50

ここの女の子だよ>>180
0184デフォルトの名無しさんNGNG
かといって
char* c = static_cast<char*>(malloc(128));
にするとCでコンパイルできなくなる罠
0185デフォルトの名無しさんNGNG
Cのソースを*.cppでコンパイル必要があるのかと問い詰(ry
0186デフォルトの名無しさんNGNG
まあ、まあ、これでも見て落ち着けよ

          /:::|:::::::|:::::::::::::/::::::/::::::::::::::/:::::::/`\_
       / ̄\::::::|:::::/:::......-―――--..........__/:::::::::::::::\
   ┌ー ̄::::::::::::ヽ::|:::..-^ ̄            ^ ヽ、:::::::::\
   ヽ::::::::::::::::::::::::::::/                  \::::::::ヽ
    ヽ:::::::::::::::::::::::/             ::::       \:::::ヽ
    ヽ::::::::::::::::::/              ::::::::        \::::|_
     ):::::::::::::::|              ::::*:::::        ヽ:|::::ヽ
     /::::::::::::::::|              ::;;;;:          l::::::::ヽ
    /::::::::::::::::::|             ノ::ii:ヽ::          l::::::::::|
    |::::::::::::::::::::|            /::::;リ:::l::::         |::::::::::::|
    |:::::::::::::::::::::l           ...l::::;リ:::/::         /:::::::::::::|
    .|::::::::::::::::::::::l          . /:ア/:::        /:::::::::::::::i
    l:::::::::::::::::::::::::l          ./::`^:::::        /:::::::::::::::::/
    ヽ::::::::::::::::::::::::l         /::::::::::        /:::::::::::::::::::/
     /:::::::::::::::::::::::l        /:::::::::::::      /::::::::::::::::::::::/
     /::::::::::::::::::::::::i __-ー--=;;;::::::::::::::  ....::::/:::::::::::::::::::::::/
0187デフォルトの名無しさんNGNG
裕美子脱ぐなよ汚ネェ
0188デフォルトの名無しさんNGNG
>>186
リリアたん・・・ハァハァ
0189デフォルトの名無しさんNGNG
charはなんと読むの?
0190デフォルトの名無しさんNGNG
sageちまった
0191デフォルトの名無しさんNGNG
>>189
> charはなんと読むの?
もうこの話題はいいよ、「キャー」でも「シャー」でも何でもいいよ。
0192デフォルトの名無しさんNGNG
茶
0193デフォルトの名無しさんNGNG
>>191
ぷっ、
シャーだって
ぷぷぷぷぷぷぷ
くっくっくっ
0194デフォルトの名無しさんNGNG
勝俣
0195デフォルトの名無しさんNGNG
>>189
友人の飼っていた犬が「ちゃる」だったので、
charも「ちゃる」になりますた。
0196nobodyさんNGNG
キャッだろ。
キャラクターの略だからな。
キャルかなぁ。
0197デフォルトの名無しさんNGNG
友人の飼っていた子が「ゆみ」だったので、
charも「ちゃー」になりますた。
019816 ◆Ms2nrv3c NGNG
ちょっと気になったのですが、
>>70と>>81で出てるdefineではどうやってやるのでしょうか
0199デフォルトの名無しさんNGNG
>>198
#define VAL_ 0
0200デフォルトの名無しさんNGNG
200get
020116NGNG
とっとと答えんかいっ!!!
糞どもがーーーーっ!!
0202デフォルトの名無しさんNGNG
#define UZEE 16
0203デフォルトの名無しさんNGNG
#define 16 メモリケチケチ厨
0204デフォルトの名無しさんNGNG
#define _16 -1
0205デフォルトの名無しさんNGNG
#define ANSWER "これ以上メモリ節約なんて考えるなタコ"
0206デフォルトの名無しさんNGNG
warning C4305: 'argument' : 'const int' から 'char' へ切り詰めます。

#define FLG_AGE 1

void a( char b );

a( FLG_aGE );

どうすればいいんでしょうか?
キャスト?
0207デフォルトの名無しさんNGNG
#define 206 16
0208デフォルトの名無しさんNGNG
#define FLG_AGE '\1'
0209デフォルトの名無しさんNGNG
>>208
間違い
#define FLG_aGE '\1'
0210206NGNG
放置?
0211デフォルトの名無しさんNGNG
>>210
> 放置 ?

はぁ ? >>208-209 を見てんのか ?
0212デフォルトの名無しさんNGNG
別にキャストでいいんじゃないの

a( (char)FLG_AGE );

0213デフォルトの名無しさんNGNG
FLG_AGEを常にcharにしたい(理由はあえて聞かない)なら、
#define FLG_AGE ((char)1)

あと、C FAQに
   文字リテラル('\1'とか)は実はint型な罠
ってのがあったような気がするのだが、どうか。(C++ではcharだという話も)
0214デフォルトの名無しさんNGNG
>>213
間違い
#define FLG_aGE ((char)1)
0215212NGNG
>>214
いや>>206の聞いてる人が既にミスしてるからw

>>#define FLG_AGE 1
>>void a( char b );
>>a( FLG_aGE );
↑ここねw
0216 NGNG
楽しそうですね
0217デフォルトの名無しさんNGNG
>>206
void a(char b);をvoid a(int b);にする。char型の引数ってあまりみないな。
0218デフォルトの名無しさんNGNG
>>217
charにしても別にメモリの節約にはならないし(w
0219デフォルトの名無しさんNGNG
>>218
プ
0220デフォルトの名無しさんNGNG
unsigned char 型の定数を32ビット右シフトすると、
元の値とまったく同じになるんだけど、何故?環境はVC++6.0SP5
0221220NGNG
ちなみに31ビット右シフトすると0になります。
もうわけ分かりません。
0222必要なくね?NGNG
っていうかなんで
8bitの unsigned char 型のデータを
32bit右シフトしてるの?
0223デフォルトの名無しさんNGNG
全然シフトについての構造とかは知らないけれど、
隣との、xorを取るようなことを繰り返して、
シフトをしているのであれば戻るのかもね。
0224223NGNG
全然的外れな事書いていたらご免ね。
0225デフォルトの名無しさんNGNG
数の決まっていない数値データの文字列からタブなどを判別してdouble型の配列に値を代入するにはどうしたらよいのですか?
0226デフォルトの名無しさんNGNG
ま た 未 定(略
0227デフォルトの名無しさんNGNG
数の決まっていない数値データの文字列からタブなどを判別してdouble型の配列に値を代入すればいいです。
0228デフォルトの名無しさんNGNG
ヒントだけでも教えていただけないでしょうか?
0229デフォルトの名無しさんNGNG
strtokですか?
0230デフォルトの名無しさんNGNG
分かるとこから書いていけばいいです。
それでも詰まったらコードを晒す。
0231220NGNG
>>222
こんな感じの文を書いてる。

unsigned char *p;
unsigned long a;
    :
a |= *p >> (32 - s); // 0 <= s <= 32

s=1〜32のときは期待通り動くのが、s=0のときだけ0にならず驚いた。

>>223
こんな夜中にレスつけてくれただけでも有難う。

いろいろ検索してるうちにこの症状について書いてあるページを見つけた。
どうやらこれは処理系依存らしいが、ANSI Cでもそう定められてるのだろうか。
ttp://www.biwa.ne.jp/~chu0296/laboratory/cpp.html
0232デフォルトの名無しさんNGNG
さて今日もいってみようか

>>231
それは処理系依存ではなく未定義です
0233デフォルトの名無しさんNGNG
>>231
これ試してみたら多分、まずunsigned charをシフトするときでも
32bitレジスタに値を入れてそれをシフトする命令を出してるらしい。
で、それをシフトするとき何ビットシフトするかを入れるレジスタ
の値が31以上だったとき下位5bitだけ使うっぽい。
だから33bitシフトとすると1bitシフトする。
0234デフォルトの名無しさんNGNG
ちょっと脱線。

x86形の話だけど、コンパイラはシフトをアセンブラレベルの
シフト命令(shr/sar)に展開するのね。
で、8086の頃は、シフト命令は1ビットだけシフトする命令か、
CLレジスタに数値を入れてシフトさせるしかなかったのね。
で、ハードウェア的には、本当に繰り返しで処理してたのね。
80186(かな?)以降は、直接nビットシフトする命令が出来たんだけど、
これもハードウェア的には(マイクロコードで)繰り返し処理してたのね。
で、386になってから、多ビットシフトのハードウェアが導入されて、
ようやくシフトが"軽い"命令になったわけ。

で、たしか、386からだと思うけど、clレジスタに32以上の数値を指定しても、
下位ビットだけがマスクされて、実際には31ビット以下のシフトしか
行われないようになったわけ。
だから、16bitコンパイラを使って、32bit以上のシフト命令を使ったプログラムを作ると、
むかーしのCPUと今のCPUで結果が異なるわけ。
この結果を、CPU種別の判別なんかに使ってたりしたんだな。

コンパイラは、CPUの判別なんかしない(実行環境は別だし、以降に生まれたCPUにも対応できない)から、
効率重視のC言語において結果が異なる(未定義になる)のは
ある意味仕方がないとも言えるんだろうね。
0235nobodyさんNGNG
>>234
私、初発言の初心者ですが、>>234さんの説明は目から鱗でした。
なるほど、機種依存ってのはここに根本原因があったのですね。
ありがとうございました。久しぶりに濃い文章だっだなぁ。
0236220NGNG
>>233-234
235氏と同じく目から鱗でした。
アセンブリ言語の知識はZ80〜8086時代で止まってるからなぁ。
まさに、内部でシフト演算をn回ループしてるものだと思ってたよ。
0237デフォルトの名無しさんNGNG
double i=0;

for(i=0;i<10;i+=0.1){
printf("%1.1f ",i);
}

表示するとなぜか最後に10.0が入るのはどうしてなんですか。
0238デフォルトの名無しさんNGNG
  ま た 浮 動 小 数 点 か ( 藁


って、昨日見たのはJavaスレだったか。
0239デフォルトの名無しさんNGNG
二進数の世界だから、0.1はあらわせなく、誤差が生じて
判定されてしまうって言うのが一般的な回答なのでは?
for(int i=0;i<100;i+=1){ //i++で充分
  printf("%1.1f ",i/10.0);
}
こういうふうにしなさいと言うのもあると思う。
違ってたらご免。
0240デフォルトの名無しさんNGNG
>>233
2^5(2進5bit)で割った余りか。なるほど。
0241デフォルトの名無しさんNGNG
>>237
10.0?なんかソースのコピペミスってないか?
最後だけじゃなく、途中経過も書いてみな。
0242デフォルトの名無しさんNGNG
>>241
ウチだと10.0も出た。たぶん
0.1が0.09999..とかで、
10.0も9.99999...なんだと思われ
0243デフォルトの名無しさんNGNG
9.99999999999998050000
0244デフォルトの名無しさんNGNG
>>241
> 10.0?なんかソースのコピペミスってないか?

既に、>>239 で答えでてるよ。初心者が良く陥りやすい罠のひとつ。

0.1 って言うのが本当の 0.1 じゃないから10回めのループの判定の時に i が 10.0... にならなくて、9.9... とかなっているため、もう一回余分に回るだけ。解決策は、>>239 のようにやるのが普通。

ちなみに、最後に i が 10.0... になって無いのに表示が 10.0 となるのは、出力時に四捨五入しているから。
0245デフォルトの名無しさんNGNG
(0.1)10 = (0.00011001100110011〜〜)2
2進表現内での循環小数になる。=>まぁこれが誤差などの原因かな
0246デフォルトの名無しさんNGNG
double i=0;

for(i=0;i<10;i+=0.1){
printf("%.20f ",i);
}

http://www.google.com/search?q=%95%82%93%AE%8F%AC%90%94+%8C%EB%8D%B7&ie=Shift_JIS&hl=ja&lr=lang_ja
0247デフォルトの名無しさんNGNG
#include <stdio.h>
void main()
{
printf( "%f\n", 1 );
}

表示するとなぜかアプリケーションがクラッシュするのですがどうしてなんですか。
0248デフォルトの名無しさんNGNG
http://www.catnet.ne.jp/kouno/c_faq/c15.html#3
15.3:
解けなくてイライラしていた問題が実は、

        printf("%d", n);

で起きていることがわかった。ANSIの関数プロトタイプは上のような 引数の型
の不一致から守ってくれると思っていたのだが。

A:

関数が可変数個の引数を取るとき、プロトタイプは可変数個の引数の 数やその
データ型についての情報を与えない(そもそも出来ない)。よっ て通常の保護の
仕組みは、可変数個の引数リストの可変長の部分には あてはまらない。コンパ
イラは暗黙の変換も(通常の)データ型の不 一致も警告もできない。

質問5.2, 11.3, 12.9, 15.2も参照のこと。
0249デフォルトの名無しさんNGNG
>>247
main()の型がvoidだからです。
標準Cではmain()の型はintと決まっています。
0250デフォルトの名無しさんNGNG
>>249
ネタにマジレスするが
そんなOS依存環境依存なことをどうどうと正論ぶるのはやめにしませんか?
0251247NGNG
>>248
レスありがとうございます。
しかし、浮動少数点が正しく表示されないのならば
まだ分かるのですが、なぜクラッシュするのでしょうか?

>>249
int main() にしてもダメでした。
0252デフォルトの名無しさんNGNG
>>251
sizeof( double )!=sizeof( int )だからでないの?
■ このスレッドは過去ログ倉庫に格納されています