今から考えると、僕の人生はvoidだった。 そう、何も作り出すことは出来なかった。 しかし、僕の中のstatic変数にはいろんな思い出がつまってる。 でももうダメだ。 いつの日からか発生したループは、スタックを食いつぶしながら 僕のメモリ領域をどんどん蝕んでいく。 もうダメだ・・・。 僕は決心して窓を開けた。 「このプログラムは不正な処理を行ったため・・・」
5
乙
ほー
namespace {
>>4 ; //翻訳単位に隔離しますた
}
fgetcの戻り値は、EOF以外なら何でもunsigned charに入れていいですか?
12 :
デフォルトの名無しさん :02/07/07 23:50
0〜UCHAR_MAX (一般に0〜255) とあるから (ANSI C言語辞典)
いいのではないかな。
>>11
↑返却値が 0〜UCHAR_MAX ということで↑
なぜか5以下のリンクを張ろうとすると 「名前いれてちょ」 で書けない。 あと上のリンク、重複がいくつかあります。スマソ
19 :
デフォルトの名無しさん :02/07/08 02:01
年配のCプログラマは、なぜ不要なキャストを多用しがちなのでしょうか?歴史的な理由が あれば教えてください。 p = (Pの型 *)NULL; とか、const P* 型の引数を関数内で 必ず・わざわざ P* 型の 変数にキャストして代入して使ってみたり、などです。別のバッググラウンドをもっている 複数人が揃ってこの調子なのでヘナヘナ萎えています。 僕は普段はVC++を使うので、こういうtype safeのタの字も無いコードを書く理由が 思い当たらないのですが…。単にANSI以前にCを覚えたのでconstを知らないとか? だとしたら寂しすぎる。
無能な年寄りなんかに構っちゃいけません。徹底放置が一番
>>20 そいつが考えるAPIにconstがついていなかった場合、呼ぶ側がconst_castしなければいけなくなって大迷惑、
よって徹底放置というわけにもいかない。
…という罠は一応考えられるな。まぁCコンパイラを使うのだったら警告が出るだけだっけか?
ところでMicrosot C/C++なんてあるの? マイクロソット
> 年配のCプログラマは、なぜ不要なキャストを多用しがちなのでしょうか?歴史的な理由が > あれば教えてください。 昔はvoid *が存在せず。それに変わる汎用ポインタとしてchar *が使われていた。 例えば foo *p = (foo *)malloc(sizeof(foo) * n); とか まぁ、10年後C99が普及したら何で年輩の人は foo p[n]; と定義すればいいのに不要なmallocを使うんですか? とか言われるかもしれない。
>>26 それはそうだけど、
>>19 のあげてる例はちょっと違うだろう。
やっぱりポインタとかキャストについての理解がいい加減なんじゃあ。
アセンブラ上がりの人が多いからとか? 変数の型に対する認識が甘かったりするかも知れない。
>>27 > p = (Pの型 *)NULL; とか、
26はここの部分の説明をしてみた。
> const P* 型の引数を関数内で 必ず・わざわざ P* 型の
> 変数にキャストして代入して使ってみたり、などです。
C++ でmutableを使うべき処理の場合、Cではcastで騙さないと同じ処理を実現できない。
他にやり方があったら教えてくれ。
>29 え?26って、「 p = (Pの型 *)NULL; 」の説明やったん? すると、昔は、#define NULL (char*)0 とかやったりしたん? mallocとは違って、どんな時代のC/C++でも、 p=NULL;で済む筈やと思うけどなぁ。
Fortranで書かれた、書式なしの文章を Cで開く事は出来るのでしょうか? write(6) N write(6) (X(I),Y(I),I=1,N) で書かれたらしいのですが………
一応バイナリモードで開けば読めるんじゃないの? ただREAL型とかがどんな風に書き込まれてるか知らないけど。
Fortranではこれで開けたのですが…… なんとかこの操作をCでやりたいのです。 real x(100),y(100) open(10,file='xy.dat',form='unformatted') read(10) n read(10) (x(i),y(i),i=1,n) do j=1,n write(6,*) x(j),y(j) enddo stop end f2cだと #include "f2c.h" なんてなモノをやら無きゃならないので困ってます…。
よくわかんないけど要はフォートランの吐き出したバイナリテープを 読み込んで標準出力に吐き出したいわけ?Cで。 フォートランで書いたサブルーチンをオブジェクトファイルにしてcにリンクとかすれば できるんじゃない? 使ってるコンパイラのリファレンスでも読め。
>>29 いや、mutable的な処理をするときにconst外ししているだけなら そもそも文句言わないって(^^;
36 :
デフォルトの名無しさん :02/07/08 23:28
>>33 fscanf(fp,"%d",&n);
for(i=0;i<n;i++){
fscanf(fp,"%f%f",&x[i],&y[i]);
}
37 :
デフォルトの名無しさん :02/07/09 00:03
return関数っつーのは return(0)やらreturn(-1)とか数値しか返せないの? 例えばmyfuncとかいう自作関数があった場合 エラー時にはmyfuncに戻るという動作をさせたいときには どうすりゃいいのですか??????
if (error) myfunc()
40 :
デフォルトの名無しさん :02/07/09 00:04
関数ではない罠
setjmp()をmyfunc()から呼び出すしかないな。
,
優しく教えてくれるヤシ・・・アリガd 厳しい指摘するヤシ・・・アリガd ミンナミンナアリガd
>>37 は
>myfuncに戻る
というてますが、戻るんだったらreturnでいいじゃん
初めて聞いたよ>return関数 目からうろこが落ちた
@`
>>47 目からうろこが落ちたの使いどころが間違ってないか?
51 :
デフォルトの名無しさん :02/07/09 00:12
エラーが出たら-1でも返して、呼び出し元がさらにmyfunc呼べばいいじゃん。
53 :
デフォルトの名無しさん :02/07/09 00:15
>>37 とりあえず、テストソースでもいいから、ソース出せ。
みんな混乱してるじゃねーか。
我慢できずに見に行ってしまった鬱・・・。
58 :
デフォルトの名無しさん :02/07/09 00:22
なぜか紫になっていた鬱・・・。
59 :
デフォルトの名無しさん :02/07/09 00:32
結構カワイイ社員いるね しかもお好み課(藁
61 :
デフォルトの名無しさん :02/07/09 01:51
すみません、質問いいですか? 構造体についてなんですが・・・ Aのソースで宣言した構造体を、 Bのモジュールで使用することは可能でしょうか? 現在、AとBをコンパイル&リンクしようとすると、 Bのモジュールのコンパイル時に「宣言されていない構造体」ってエラーが出て、 コンパイルできずエラーが出てしまいます・・・。 構造体を、Bで宣言すればコンパイルは通るんですが・・・。 他のソースで宣言してる構造体を、 その別のソースで使用する方法がありましたら教えてください。 よろしくお願いします。
.hに入れて#include
あのー、 rand()関数使って何かおもしろいことできませんか? ゲームでも面白い動作でも何でもいいです。 よろしくおながいします。
*((int*)rand()) = 0;
66 :
デフォルトの名無しさん :02/07/09 02:00
>>64 ランダムなアドレスに0を書き込むってこと?
>>62 構造体自体は、ヘッダーファイルを作って、Aでインクルードしてます。
しかし、問題が解決されません・・・。
Aでも、インクルードして、Bでも、インクルードしろって意味なのでしょうか・・・???
でも、たしか、宣言ってカブって行うと、ダメなんですよね・・・???
>>64 やってみてアクセス違反がでなかったら勝ち。
>>64 VC++じゃ実行できないYO!!
VC++で実行できるものでrandをつかった面白いものをおながいします。
同じ翻訳単位でかぶるとまずい
宣言は被ってもへいき 定義はだめ
そう言えばBASICでもよく POKE RND, RND / 256 ってやってたよ。
走らせてると突然ピタッと止まるんだよな。その瞬間ゾクゾクっとした
快感が体を走り抜けたよ。たまんねえな。
>>67 宣言がダブッたらまずいのは、同一ファイル内のみ。
>>70-72 宣言はOKで定義はダメ!
スペシャルサンクス!
さっそく、テストしてきます!!
つか、かぶってねーじゃん。
レスはかぶりまくりだな。
すいません、めっちゃ初歩の質問良いですか? 昨日初めてコンパイルしてみようとしたのですが、 完了-コンパイル「C:\WINDOWS\PROFILES\SHIN\MYDOCU~1\HELLO.c 1: ファイル stadio.hがオープンできない (No such file or directory)」と出てコンパイルできません。 何が問題なんでしょう?宜しくお願い致します。
>>76 本のサンプル入力してるのか?
もう一度サンプルと同じか確認して見ろ。
ワロタ メッチャレベルヒクイ
まぁ、気がつかなくて悔しがっている>77=79な訳だが・・
>>80 え?なんで俺?
本人からのレスかと思って見てみれば( ;´Д`)
80はちょっとあれなので気にしないでやってください。
>>77 LSI C-86 超簡単セットアップ Ver 1.53を使って
ドラッグ&ドロップしただけなので、入力ミスとかはないと思います。
/* hello.c */ #include <stdio.h> int main() { printf("hello world!\n"); return 0; }
>>78 「stadio」と出てます。
>>84 ソースコードを書いて、Cコンパイラのアイコンに放り込んだだけなのですが…
ソースコードに問題があるのでしょうか?
>「stadio」と出てます。 だから、stdio.hに直してくれよ
それほんとにCコンパイラか?
LCCだろ。そう出るよ
>>90 これでいいんですか?
hello world!と出るもんじゃないんですか?
つーか、そのソースをここに晒したほうがはやいだろ。 stadio.hになっていませんように・・・(-人-)ナムナム・・・
>>91 実行ファイル(hello.exe)ができてないか?
コンパイルはできたのか?
もんの凄い厨発見・・・・・・・・・・・・・・・・・・・・・・
LSICのEXEにソースをドラッグする人って、とっても珍しいと思う。 歴史上10人も居ないのではなかろうか。
>>96 おいらはVC++のcl.exeにD&Dしています。
lcc.exe(だっけ?)は16bit pure dos アプリだし・・・
LSIC を 窓 か ら 投 げ 捨 て ろ
このスレおもしろい
>>101 そのシミュレータをC言語で作ってみます。
できました。 皆さん、ご協力ありがとうございました。 本当に感謝してます!
>105 結局、どうやって解決したの?
どこのスレの221なのかとても気になる
>>108 そこはたった今221になったと思うんだけども。
まさか余因子行列聞いてる212じゃないだろうな。
LSICでも出来るけどなぁ。lld@何タラってのはコンパイル&リンクできたっつーこと。 同じディレクトリにhello.exeがあるはずだが。 あとstadio.hはstdio.hの間違いだったろ?
111 :
デフォルトの名無しさん :02/07/09 11:38
ヘッダーファイルの中で他のヘッダーファイルをincludeするのはいけない行為?
>>111 いけなくないが、そのヘッダに#ifndef #define #endifの、例の
あれが書いてあるといいね。
>>112 #ifndef _HEADER_H_
#define _HEADER_H_
/* 中略 */
#endif
多重インクルード防止用のこういうやつ?
> あれが書いてあるといいね。 > 多重インクルード防止用のこういうやつ? 一応「インクルードガード」という名称がある。
俺も最初の頃はスタジオ.hだと思ってたよ。 ついでに、random関数ってrandだけ良いのね。 これも知らずにリンカエラーでさんざ悩んだよ。
昔、cin(シン)、cout(コート)と読んでたぞ (激鬱
117 :
ツリー構造 :02/07/09 15:40
リスト構造とツリー構造の違いを教えてください。
119 :
ツリー構造 :02/07/09 15:43
えっ? 今回の書き込みが初めてですけど
122 :
ツリー構造 :02/07/09 15:48
学校の問題なので別の人が書き込んだのかも? おねがいします。 教えてください。
つーか情報系の学生ってこんなレベル低い? 普通科行けなかったヤツが行くところとか?
学生なのに普通科?
>>122 大人をなめるんじゃねーぞ。このウソつき。
ツリー構造とリスト構造の違いか・・・ ツリービューとリストビューくらい違うな・・・
木と表くらい違う。
ツーリは分岐するけど リストは分岐する気がしない
>>123から128 別人にだまされたおまえらはDQN! 大人だかなんだかしらんが心の狹いやつらだな、おい!
132 :
ツリー構造 :02/07/09 16:13
ばーか!! 答えなんてソッコーでわかってんだよ!! 早く終わって暇だったから書き込んだだけ。 聞けっていうから聞いてやったのに、 結局だれも答えてねーじゃん。
ネタはけっこうです。
心の狹い大人=カス この方程式は万国共通です。 すぐにネタだといって煽る奴=DQN これもまたしかり
>132 すみません。 ツリー構造について教えてください。
スンマソーン 他スレの543ですが、 「2のべき乗」って、VBAだと 「2^5 とか、2^12」なんすけど、 C(C++、VC++)では違うんですか? さっき2^4とか計算させたらエラーが出たんですけど。
>>134 ネタじゃなくて天然だったのか。
バカすぎるぞ。
ネットで宿題の答え聞いてるガキはDQN。
これは万国共通(マジで)
>>136 エラーはでなくねぇ?
結果はぜんぜん違うけど
>138 もう一度試してみるっす。 ちなみに今VC++でやってます。
>>136 演算子ではべき乗はないっす。
math.hをinclude してpow(2,4)かな
>>136 > さっき2^4とか計算させたらエラーが出たんですけど。
本当に試したのかよ。
エラーにはならないだろ。
>>135 エクスプローラの左を見なさい、それがツリーです。
エクスプローラの右を見なさい、それがリストです。
これでわからないようなドキュは氏んでください。
143 :
デフォルトの名無しさん :02/07/09 16:27
エクスプローラで左に出てる奴がツリー、右に出てる奴がリスト。
XORだ
うるせえ、ばか! くたばれ! Fuck yourself
ネタはけっこうです。
ネタに混じれすするな
>141 ビルドの段階で。
>140 ありがとうございました。 「16」 と出ました。
ちなみにスンマソン。。。 pow(2,128) をやってみました。実行はされたんですけど、 3.40282e+038 となりました。 これを完全に整数の形で表示させる事が出来ないものなのでしょうか?
153 :
デフォルトの名無しさん :02/07/09 16:35
できるよ。 どうせ有効桁数6桁だからその部分と'0'をずらっと並べる。 "3.40282000000・・・・"と
うるせえ!さる! 殺すぞ!おい、543!この野郎邪魔すんな!
155 :
デフォルトの名無しさん :02/07/09 16:36
>>152 完全な整数は無理。
そこまでの精度は無い
げ! もしかして「近似」の結果なんすか??? ちなみに上の 「3.40282e+038 」 の意味を教えていただければと。。。 初心者でスンマソーン。。。
159 :
デフォルトの名無しさん :02/07/09 16:39
3.40282×10^38
3.40282x10^38
161 :
デフォルトの名無しさん :02/07/09 16:39
おい!543! 無視すんな! 真面目ぶってもおもしろくねぇぞ! 笑わせろ!
>>164 おまえが笑わせてみろよ(プ
そうしてみると、ある巨大な整数(紙の上には書けるくらい)が、 「素数か否か」 を判定するプログラムってかなり難しいと考えていいですかね?
>164 おっきい?
Fカップですが何か?
豚なの?
宿題が出来なくて暴れてるヤツをかまうなって・・
>>166 多倍長整数演算のライブラリとか、どっかで拾ってくればいいよ。
ありがとう。
素数か否かを判定するには1から平方根までの素数で試し割りしてみるんだっけ? 割れなきゃ素数。 どおしても大きな値を扱いたいならそれなりに工夫が要る 組込型じゃ扱えない。
そうですか。。。 例えばですね、 全ての1以上の自然数nに対して、 n^2と、(n+1)^2 の間には必ず素数が存在する(リーマン予想) はnが何兆の時まで正しい事が確認されている、らしいんです。 うーむ。。。これをCで動かすには。。。グタ。
やめときなさい。
はい。
C以外でも動かないだろ。 文字列を使って計算すれば? たとえばunsigned shortは65535までしか扱えないけど char num[10]なら"100000000"だぞ。 もちろん四則演算も自分で実装する。 plus(num1, num2);とか あるいは大きな数字は複数のintで表すとか。 12345678= 1234*10000 + 5678だろ? そうすればint num1 = 1234, num2 = 5678で表して 2で割るならおのおのを2で割れば?
>177 アイデアは嬉しいっす。 ありがとうございます。 ただですね、a+bをcで割る時に、 a,b両方がcで割り切れなくとも、a+bがcで割れることが あるんです(例 a=b=1,c=2)。
a+bではなくa*10^x+bですが。 まぁいいか。
考えてみます。 ありがとうございました。 一旦落ちて飯の支度をします。
182 :
デフォルトの名無しさん :02/07/09 17:35
無限ループに陥ったとき、画面上でマウスをダブルクリックするとループはとまりますが、ctrl+cを押した場合と異なった処理が行われているのですか?
> 一旦落ちて飯の支度をします。
>>181 どうしてもCじゃないとだめっすか?
このスレに書いている以上、どうしてもCじゃないとだめなのかもしんないけど。
標準でないライブラリを使ってもいいのであれば、
ttp://www.score.is.tsukuba.ac.jp/~okuma/OpenMath/ なんてどうだろう、って使ったことないんだけども。
bignumのある処理系使うと手軽なんだけど。
scheme (たいていbignum持ってる) とか、Rubyとか(この名前出すと厨房よってくるか?)。
でも処理の規模を考えるとこの辺の処理系使うのは速度に問題あり、かな。
>>184 ええとですね、
俺はCの勉強も兼ねてるんです。
もう直ぐ三十路なのに職も無く、ぷらぷらするのも
なんなので、C(VC++)を勉強してそれ関係の仕事にと。。。
遅い?
>>185 どういう方面に就職希望かわからんけど、
素数の計算とかはあんまり深入りしないで、違うことやったほうが
いいと思う。
>186 サンクス。 当方VBAはそこそこ使えますが、それ以外のプログラムは html言語をちょろっと出来る程度なので凄く不安。。。 はぁ。。。
html・・・
189 :
デフォルトの名無しさん :02/07/09 18:52
>>185 なるほど、そういうことね。
おれも
>>186 の言うことに半分賛成。
でもこういう風に自分で課題を設定して何かやろうとするのはいいことだと思うよ。
ただ、今回の課題は初心者にはレベルが高すぎるような気がする。
やるとすると、
struct bignum {
unsigned int *buf;
size_t len;
};
みたいな構造体を使ってごにょごにょすることになるんだろうけど、
メモリ管理とかややこしい問題が絡んでくるんでかなりきついと思う。
どういった本を読んでます? (この話題も荒れるかも)
とにかくCに関してはクズ本が99%を占めてるんで、
下手な本で勉強するとロクなことにならん。
おれが今まで読んだ中では Practical C というオライリーから出てる本がいいかな。
入門書はそんなに読んでないけど。他にちゃんと読んだつったらK&Rくらいだからなあ。
ttp://www.oreilly.co.jp/BOOK/cpra/ これね。岩谷の粗悪な翻訳も以前出てたのでそれを掴まされないように注意してね。
俺の知り合いに45才で会社を起こして、自分でCのプログラム書いて バリバリ稼いでいる奴がいるよ。 最近はさすがに疲れたのか、学生にアルバイトさせているが。
皆さんありがとう。 今手元にある本は、 「新C++言語入門 ビギナー編」 by 林晴比古 「新VisualC++6.0入門」 by ヾ です。 先にも述べたとおり、これまで組んできた事のある言語は HTMLとVBA。 VBAのほうは(マクロを組むと言うのかな)、ちゃんと金融会社 に勤務中に、ある計算をするためにプログラムを組んでいました (moduleを沢山使いました)。 あとUNIXも使った事はあるんです。 手元にある本は 「UNIX プログラミング環境」 by kernighan and Rob.Pike (石田 晴久訳) です。
本で1から練習するよりも、本を片手に実践の方が 速く身に付くよ。
194 :
デフォルトの名無しさん :02/07/09 21:10
C言語はJavaなどの言語に比べて細かいプログラムが 組めるらしいのですが、 具体的にどのくらい細かくまでプログラミングできるのでしょうか
>>194 細かさの意味がわからんが、大して変わらんかと
#include <stdio.h> int main ( int argc , char * * argv ) { printf ( "Hello " "World.\n" ) ; return 0 ; }
レベル ノ ヒクイ ジサクジエン ニ ワラタ
>>193 どーい。この分野ほど、知っているだけではなにもできない分野はないね。
なんでもひたすら試してみるといいよね。
random randomize って使ってる?
srandやrandなら使わんことも無い
201 :
デフォルトの名無しさん :02/07/09 21:31
malloc free って使ってる?
202 :
デフォルトの名無しさん :02/07/09 21:32
pennis って最近使ってる?
203 :
デフォルトの名無しさん :02/07/09 21:32
NTTコムウェア って知ってる?
房のせいでちゃんとした回答が得られなかった
超亀レス >34 36 ありがとう。
スンマソーン。 再び543っす。 仮に面接で、 「C言語できますか?」 ってきかれたら、俺のレベルで、 「簡単なプログラムなら出来ます」 って答えて問題無いすかね???
208 :
デフォルトの名無しさん :02/07/09 22:02
>>206 「簡単なプログラムなら出来ます」
なんて回答をしている時点で
相手には君のレベルが分かっちゃうからOK!
??? よくわからんです(笑)
>>206 具体的に作ったプログラムを言った方がいいのでは?
2chをフル活用してますな
ええ。
本当に簡単だな
ええ。。。(恥
216 :
デフォルトの名無しさん :02/07/09 22:38
2次元配列の要素数を取得するにはどうすればよいですか?
質問なんですが プログラムは細かく関数化したほうがいいですか? フローチャートを書くことは勉強になりますか? フローチャートって楽しいですか? おねがいしまする
>>217 ・物による。いろんな分割法あり
・まぁ、いい加減に書きまくるよりはイイかと
・俺は嫌い
219 :
デフォルトの名無しさん :02/07/09 22:42
>>216 厳密にはCには二次元配列はないと思った。
で、たとえば、
int ary[10][10];
なんて配列があったとして、要素数を求めるのは
sizeof(ary) / sizeof(ary[0][0])
だろうねえ。
>>218 ありがとうございました
ググルで 関数 分割法で調べてみまする
221 :
デフォルトの名無しさん :02/07/09 22:47
>>219 ありがとうございました。
C++にはあるんでしょうか・・・・?
でもそれはスレ違いになりそうなのでC++スレに逝ってきます
222 :
デフォルトの名無しさん :02/07/09 22:48
>>218 フローチャートは百害あって一利なしだと思う。
あっちゃこっちゃ飛ぶgotoの乱用みたいなチャートになりがちだし。
PADとかHCP(だっけか?)のほうがましだけど、
こういうのって擬似コード使うほうがよっぽどいいと思ってる。
関数内がifばっかりって… やっぱり良くないですよね…
224 :
デフォルトの名無しさん :02/07/09 22:52
>>215 あっちでレスしてみたよ。584ね。
で、このレベルでプログラム書けます、というのは、うーん。
嘘じゃないけどもね(ニガワラ
まあでも仕事でやるとスキルがむちゃくちゃあがるからね。
独習よりははるかにいいと思う。
問題は、採ってくれるところがあるかどうかだけども(w
値が4つあって、その値を大きい順に並べて、その順番を数値に当てはめて返すという 関数なんですが
>>224 どうもです。
あっちのレス読んできました。
ありがとうございます。
とりあえず俺としては、
「プログラムを組む上で最も基本的なことが抑えられていて、
且つ余計な事をしていないか?」
ということが問題だったのです。
といいつつ、気になるので質問させてください。
sm = ((a + b) * (b - a + 1)) / 2;
のほうが計算が速くなるとかっていうメリットはあるのでしょうか?
初心者ですんません。
227 :
デフォルトの名無しさん :02/07/09 23:04
>>226 うーん。まあVC++よりはCの話題だからこっちのスレでいいか(w
で、一般にループまわすよりは速くなります。
ただし欠点もあって、forでまわすよりもオーバーフローしやすいという問題があります。
掛け算してるところでね。
すいません 書き直します 値が4つあって、その値を大きい順に並べて、 その順番を数値に当てはめて返すという 関数なんですが 例 A=2 B=5 C=4 D=1 だったら cbadなので5を返す というのなんですが、 ifとかつかわずに可能でしょうか。 if使うとものすごく長くなってしまったので おながいします
> その順番を数値に当てはめて返すという わからん… >例 >A=2 B=5 C=4 D=1 >だったら >cbadなので5を返す 最大値を返すってこと?
230 :
デフォルトの名無しさん :02/07/09 23:30
bcad?
>>228 今世紀(はじまって間もないけど)最大の難問だ
何が言いたいのか全くわからん・・・
233 :
デフォルトの名無しさん :02/07/09 23:35
>>228 宿題?
A, B, C, Dが0未満じゃないと仮定して、こんな感じかな。
ただし、試してないよ。
#define numitem(a) (sizeof(a) / sizeof((a)[0]))
int max(a, b) {
return (a > b) ? a : b;
}
int foo(a, b, c, d) {
int i, m = 0, ary[4] = {a, b, c, d};
for (i = 0; i < numitem(ary); i++) {
m = max(m, ary[i]);
}
return m;
}
234 :
デフォルトの名無しさん :02/07/09 23:35
素因数分解のプログラムってどうやればいいんですか?
あっと、配列の初期化ってこういう風にはできなかったっけか(汗
236 :
デフォルトの名無しさん :02/07/09 23:39
あ、すいません 例えば abcdという順番で大きければ1を返す bacdならば2を返す でbcadなので5を返すという風にしたいのです。 この数字はなんでもよいです… 何かしら返り血から順番がわかるようにしたいのです おねがいします(;_;)
そこで素直に abcdを大きい順に変数M1からM4に格納して M1が何なら どの値を返すという風に IFを羅列しようと考えているのですが… すいません
>>237 わかた〜よ!!
abcdの順列に番号をつけておいて
大きい順に並べ替えたものに対応する番号を返すんだね!!
>>240 配送です。 おめがいします すいません
242 :
デフォルトの名無しさん :02/07/09 23:55
>>241 return (srt[0]*10000 + srt[1]*1000 + srt[2]*100 +srt[3]);
>>242 誤植ばっかりですいません2ch怖いので… それってひとつの値が10を超えても大丈夫ですか? 引数の値は不定値で桁数がわからないのです。
オレ的にこう #include <stdio.h> int main(void) { int A=2, B=5,C=4, D=1; int values[] = {A, B, C, D }; int result = 0; for( int j = 0; j<4; ++j ) // j 番目に大きい数字を見つけて result に入れる { int min = 0; int minIndex = -1; for( int i = 0; i<4; ++i ) { if ( values[i]>min ) { minIndex = i; min = values[i]; } } result |= (minIndex+10)<<(j*4); values[minIndex] = 0; } printf( "%X\n", result ); return 0; }
メガデモ級のが作れるようになれば一人前じゃないの
>>244 おおすごい なるほど、 たしかにそうなんだな… abcdを数字にすれば返せるし ありがとうございました
>>246 あ、ゴメン
コメント逆だ、j番目に小さい数字を
248 :
デフォルトの名無しさん :02/07/10 01:42
2byte文字がうまくあつかえないのですが、その辺について詳しいサイト知りませんか?
250 :
デフォルトの名無しさん :02/07/10 03:09
C++では#define NULL0;と書きますが、なぜC言語では#define NULL (void*)0; と書くのですか?
251 :
デフォルトの名無しさん :02/07/10 03:11
>>250 #define NULL 0と書かれている場合もあるよ。
それとセミコロンはいらない。
次スレはケイコタンの1きぼんぬ
253 :
デフォルトの名無しさん :02/07/10 03:40
>>250 C では
#define NULL (void *)0
と書きますが、なぜ C++ では
#define NULL 0
と書くのですか?
254 :
デフォルトの名無しさん :02/07/10 03:41
>>250 NULL というマクロを使わないでプログラム組んでみればわかるよ。
>>253 つーか、C++では NULL の代わりに 0 と書けよ。
256 :
デフォルトの名無しさん :02/07/10 03:54
つか、CでもNULLなんか使わんで、0でいいだろ。
>>256 Cではいけなかったのでは?汎用機の一部には、NULL != 0のものが
あったような記憶が。
258 :
デフォルトの名無しさん :02/07/10 03:59
>>257 規格上はokよ。処理系によってはだめなのもあるけど。
いまだにプロトタイプ使えない処理系ある(らしい)のと一緒ね。
260 :
デフォルトの名無しさん :02/07/10 16:37
コメントの所が /* */というのと//というやつの違いは何なんですか? 拾ったexampleソースをCでコンパイルしようとしたら、//が全部エラー出ました。
/*comment*/ はCとC++のコメント //comment はC++のコメント C++を知らないCコンパイラなら上記のコメントしか受け付けないだろうね。
>>261 おお、なるほど。
どうも有り難うございました。
263 :
デフォルトの名無しさん :02/07/10 17:05
265 :
デフォルトの名無しさん :02/07/10 18:03
これは罠ね!
>>266 罠ではなく、マジです(汗
PC初心者板用のアップ板を借りてます。
268 :
デフォルトの名無しさん :02/07/10 18:17
stderrをfcloseしてもいい?
>>265 1Kもないようなソースを圧縮すんなよ。
>>267 Testの中のintやcharまでポインタにする必要はない
>>269 いや・・・癖でして・・・・
>>267 このソースは、抜き出した物でして・・・
どうしても、構造体の中の変数をポインタで取りたいのです。
このソースで、構造体の配列って作れてますかねぇ〜?
#include <stdio.h> #include <stdlib.h> struct Test{ int test01; char test02[2]; }; int main () { int i; struct Test *test; test = (struct Test *) calloc (3, sizeof(struct Test)); test[0]->test01 = 10; test[0]->test02 = 'a'; test[1]->test01 = 20; test[1]->test02 = 'b'; test[2]->test01 = 30; test[2]->test02 = 'c'; for (i=0; i<3; i++) { printf("%d %s", test[i]->test01, test[i]->test02); } return 0; } 試してないが。
274 :
デフォルトの名無しさん :02/07/10 18:31
>>271 test[0].test01 = 10;
test[0].test02 = 'a';
これって、
int *pi;
char *pc;
pi = 10;
pc = 'a';
と同じようなことやってんだけど、どこがおかしいかわかる?
275 :
デフォルトの名無しさん :02/07/10 18:32
>>273 > test[0]->test02 = 'a';
いや、ここは
strcpy(test[0]->test02, "a");
もしくは
test[0]->test02[0] = 'a';
test[0]->test02[1] = '\0';
だろう。
>275 めんご。
>>271 「取りたい」というのは「自分の気持ち」でしょ?
論理的または理論的根拠にはいくらでも拘ればいいと思うけど、
自分の気持ちを拘りの根拠にしてたら上達は望めないと思うよ。
278 :
デフォルトの名無しさん :02/07/10 18:37
>271 構造体配列はできてるが構造体メンバがポインタなのにいきなり 値を代入してるのは間違い。 メモリをアロケートしてそこをポインタに指させるまでポインタは使えない。 つまり test[0]->test01 = (int *)malloc(sizeof(int)); test[0]->test02 = (char *)malloc(n * sizeof(char)); みたくメモリを確保しないと。
280 :
デフォルトの名無しさん :02/07/10 18:43
>>271 どうしても構造体のメンバをポインタでやりたいというのなら、
int t0;
t0 = 10;
test[0]->test01 = &t0;
test[0]->test02 = "a";
または、
test[0]->test01 = (int *)malloc(sizeof(int));
*test[0]->test01 = 10;
test[0]->test02 = "a";
こんなかんじでやれ。
"a"と'a'の違いはわかってるよね。
281 :
デフォルトの名無しさん :02/07/10 19:03
int a=3; int b=2; foat f; f=a/b 以上のように、2つの変数をint型で、その2つの変数の割り算の結果を収めるのにfloat型で宣言した場合、小数部分は切り捨てられ、1.0という出力結果になります。 2つの変数をint型のままでちゃんと割り算の結果を1.5と出力したい場合どうすればよいのですか。方法はありますか。
283 :
デフォルトの名無しさん :02/07/10 19:05
>>281 キャストする。
f = (float)a/b;
284 :
デフォルトの名無しさん :02/07/10 19:13
あ。floatか。283が正解。 てかfloatなんか使うなYO!(逆ギレ)
た・・・沢山のレス、ありがとうございます!
>>273 わざわざ、ソースを書いていただいてありがとうございます。
う〜ん、しかし同じようなエラーが出ます・・・
>>275 さんの修正を入れても、エラーが出てしまいます・・・。
>>274 ええ、どこがおかしいか分かります。
しかし、アローを使うとエラーが出てしまってコンパイルすら通らず・・・
ドットだと、警告は出るものの、コンパイルが通るので、コンパイルして、
実行。 即エラー終了。 この時点で途方にくれてました・・・(汗)
>>277 言葉が悪かったです・・・
「取りたい」のではなく、「ポインタで取る必要がある」です。
すんません・・・。
>>279 はい、試させてもらいました。
しかし、「-> か ->* の左には構造体のポインタが必要」というエラーが出てしまって・・・
>>280 えっと、同じく、「-> か ->* の左には構造体のポインタが必要」のエラーがでます・・・
う〜〜ん・・・
ここまでエラーが出るとコンパイラを疑いたくなります(苦笑)
ごめん。'->'じゃなくて'.'でいいみたい。
#include <stdio.h> #include <stdlib.h> struct Test{ int *test01; char *test02; }; int main () { int i; struct Test *test; test = (struct Test *) calloc (3 , sizeof(struct Test)); test[0].test01 = (int *)malloc(1 * sizeof(int)); test[0].test02 = (char *)malloc(2 * sizeof(char)); *test[0].test01 = 10; test[0].test02[0] = 'a'; test[0].test02[1] = '\0'; test[1].test01 = (int *)malloc(1 * sizeof(int)); test[1].test02 = (char *)malloc(2 * sizeof(char)); *test[1].test01 = 20; test[1].test02[0] = 'b'; test[1].test02[1] = '\0'; test[2].test01 = (int *)malloc(1 * sizeof(int)); test[2].test02 = (char *)malloc(2 * sizeof(char)); *test[2].test01 = 30; test[2].test02[0] = 'c'; test[2].test02[1] = '\0'; for (i=0; i<3; i++) { printf("%d %s", *test[i].test01, test[i].test02); } return 0; } おわび。freeしてません。
ポインタちゃんと勉強したら?
>>265 以下長文スマソ
#include <stdio.h>
#include <stdlib.h>
struct Test{
int *test01;
char *test02;
};
struct Test *
Test3_new()
{
struct Test *test = (struct Test *) calloc( 3, sizeof(struct Test) );
int i;
for ( i = 0; i < 3; i++ ) {
test[i].test01 = (int *) calloc( 1, sizeof(int) );
test[i].test02 = (char *) calloc( 2, sizeof(char) );
}
return test;
}
int main ()
{
int i;
struct Test *test;
test = Test3_new();
*(test[0].test01) = 10;
test[0].test02[0] = 'a';
test[0].test02[1] = '\0';
*(test[1].test01) = 20;
test[1].test02[0] = 'b';
test[1].test02[1] = '\0';
*(test[2].test01) = 30;
test[2].test02[0] = 'c';
test[2].test02[1] = '\0';
for (i=0; i<3; i++) {
printf("%d %s\n", *(test[i].test01), test[i].test02);
}
return 0;
}
291 :
デフォルトの名無しさん :02/07/10 19:35
>>286 >
>>279 > はい、試させてもらいました。
> しかし、「-> か ->* の左には構造体のポインタが必要」というエラーが出てしまって・・・
あ、そうか。testの型はTest*だから、test[0]の型はTestだ。
だから、.(ドット)演算子を使うべきであった。
292 :
デフォルトの名無しさん :02/07/10 19:56
>>290 改造してみた。
#include <stdio.h>
#include <stdlib.h>
struct Test{
int *test01;
char *test02;
};
void Test_new(struct Test *t, int n, char c)
{
t->test01 = (int *)calloc(1, sizeof(int));
t->test02 = (char *)calloc(2, sizeof(char));
if (!t->test01 || !t->test02)
exit(3);
*t->test01 = n;
t->test02[0] = c;
t->test02[1] = '\0';
}
int main ()
{
struct Test *test = calloc(3, sizeof(struct Test));
int i;
Test_new(&test[0], 10, 'a');
Test_new(&test[1], 20, 'b');
Test_new(&test[2], 30, 'c');
for (i=0; i<3; i++) {
printf("%d %s\n", *test[i].test01, test[i].test02);
}
return 0;
}
293 :
デフォルトの名無しさん :02/07/10 20:01
プログラム中でファイルの内容を配列に読み込みたいが、 ファイルの大きさが事前に分らないため配列のサイズを正確に予測できない場合、 どうしたらいいのでしょうか。何か関数とかあるのですか
どなたか知っていましたらレベルの低い質問ですがお願いします。 floatのデータ型を確かめようと下記のソースをコンパイル&実行したところ 0.123457 1234567.000000 1234567.125000 と出力されました。 期待した結果は 「1234567.1234567」 だったのですが何故小数点以下が「.125」になったか超初心者なので解りません。 環境 kernel 2.4.17 + gcc2.95.3 ------------------------------ #include <stdio.h> main() { float a,b,c; a=0.1234567; b=1234567; c=a+b; printf("%f\n",a); printf("%f\n",b); printf("%f\n",c); } ------------------------------
>>293 最初適当な大きさでmallocしておき、足りなくなったらreallocでまた
拡げればよい。
>>287-292 本当にありがとう!
書いてもらったソースをすべて試させてもらいました。
すべて、正常にコンパイルが通って正常処理をしてくれました。
う〜ん、本をもう一度読み返してちゃんと勉強します(汗
本当に、ありがとうございました〜!
>>293 適当に配列を伸ばしながら(大きめに確保してコピーを繰り返す)読み込む
>>294 floatだから有効桁数が足りない。doubleにすればよい。
300 :
デフォルトの名無しさん :02/07/10 20:11
300
>>299 レス有難う御座います。
本で読んだのは有効桁数7桁と読んだのですが
整数7桁と小数点以下7桁の両方が存在した場合にどう再現されるか知りたく
粗探しをしたのですが、ハンパに小数点以下が残っているのが気になって....。
>>293 これでどう?
fp はオープン済みのファイルポインタ。エラー処理省略。
あと、テストしてない
unsigned len = 0;
while ( getc(fp) != EOF ) len++;
char *str = (char *) malloc( sizeof(char) * (len+1) );
fseek( fp, 0L, SEEK_SET );
fread( str, sizeof(char), len, fp );
str[len] = '\0';
ありがとうございます!!
304 :
デフォルトの名無しさん :02/07/10 20:28
a[i] = i++; というコードはうまく作用しないという話を聞きました。 その理由としてi++は副作用をもたらすという理由があるから と聞きましたがどのような副作用なのでしょうか? 解説おねがいします。
>>304 なんかこの質問って定期的に出てくるんで、
本当に知りたいのかネタなのか分からんべ。
SEEK_ENDとftellの組み合わせは? 何か問題があるという話を聞いたような気もしないでもないけど…
>>307 ASCIIモードで開いたときの問題かな?
コンパイルも問題なく済んだけど、 特定の場所で何故かエラーが起きる。 printfをかけまくって、エラーになっているラインは探し当てたけど、 どーーーーしても なんてことないその処理がエラーを出している原因がわかりません。 UNIXgccのCGIで作ってますが、エラーのログとか確保する方法はないんでしょうか? がいしゅつだったらすいません。
310 :
デフォルトの名無しさん :02/07/10 20:48
printfでデバッグ出力してるのだったら、 % ./a.out > err.log でいいんじゃないか。
>>309 stderrをfreopen()するとか、管理者に頼んでhttpdのエラーログ見せてもらうとか。
>>309 あ、ごめん。CGIなのね。デバッグ出力用の関数作って、
えーとたとえば、
#define DEBUG_LOG = "~/debug.log"
void debug_printf(char *format, ...) {
va_list ap;
FILE *fp = fopen(DEBUG_LOG, "a");
if (!fp)
exit(3);
va_start(ap, format);
vfprintf(fp, format, ap);
va_end(ap);
fclose(fp);
}
とかいうので出力しといて、シェルから
% tail -f ~/debug.log
とやっとけばいいんじゃないの。
ビットの 2の補助表現とか浮動小数点表現 についてのっているサイト教えてください
314 :
デフォルトの名無しさん :02/07/10 22:37
>>309 printf("Content-Type:text/html\n\n");
この行はある?text/htmlじゃなくてもいいけど。
>>313 んなこたぁGoogle先生に聞けよ。
ちなみに ×補助→○補数 な。
今日買ってきましたよ のってるのかな?
載っていた。ありがとん。
ポカーン
#include <stdio.h> typedef struct{ char a:2; char b:2; }KOU; KOU k; void main() { k.a=2; k.b=1; printf("%d %d\n",k.a,k.b); } なぜかk.aが-2が表示される。なんで? 00000010 だから2が表示されるんじゃないの?
>>320 ビットフィールドは無条件でunsignedになります。
>>320 じゃなかったスマソ、signed charだからこそマイナスになるんだ。
aには2ビットしか与えられていない。ここに2を代入すると、最上位 ビットが立ってしまう。つまりsigned charからすると、マイナスの値 になってしまう。 printfする時にintに拡張されて、この符号ビットが伸びてしまう。
#include <stdio.h> typedef struct{ char a:2; unsigned char b:2; }KOU; KOU k; void main() { k.a=2; k.b=2; printf("%d %d\n",k.a,k.b); } これだと、bはunsigned charなので、intになる時に符号拡張が起きない。 従って2が表示される。
というよりも、ANSI C ならビットフィールドは signed int か unsigned int のみでは? gcc -pedantic -Wall だと warning が出る。(gcc 2.95.2) char でも long でもよいのは C++ だろう。
326 :
デフォルトの名無しさん :02/07/10 23:57
だれか、ダイ=ワーフ問題について答えられる人いますか?
ありがとん
昨日NULL の話題が出ていたので、前々々…スレから転載 NULL ・定数の "0" は、文脈によってヌルポインタ、または整数の 0 として解釈される。ただし、可変長引数、またはプロトタイプをもたない関数の引数に現れた場合は整数の 0 として解釈される。 また、整数型とポインター型とで多重定義している関数の引数では、解釈は実装依存となる(C++ 限定)。 ・ヌルポインタのビットパターンは実装依存である。 ・条件式にヌルポインターが現れた場合、偽となる。 ・ヌルポインタとヌルポインタとは等しい。 ・ヌルポインタとその他のポインタとは、常に等しくない。 ・ポインタ型によりヌルポインタのビットパターンが異なる場合があるが、コンパイラは(騙されない限り)正しい型を知っているので、比較は正しく行われる。 ・NULL は 定数 "0" がヌルポインタとして解釈される場合のみ、定数 "0" の代わりに使用できる。他の文脈では、結果が実装依存となる。(NULL を整数 0 の代わりに使用してはいけない) ・NULL の定義方法は処理系に依存する。
>>312 > #define DEBUG_LOG = "~/debug.log"
これが示すものは、カレントディレクトリにある"~"というディレクトリの下
の"debug.log"というファイルであって、ホームディレクトリにある
"debug.log"ではない。Cの標準ライブラリで~を展開するものはない。
>>329 そうでした。恥ずかしい。
ちなみに、ライブラリが~をホームディレクトリに展開してくれたとしても、
CGI実行時のホームディレクトリ(普通ない)と
シェルでのホームディレクトリ(/home/login id)の位置は
一般に異なるんで、みられないっすよね(意味のない議論)。
でもいいたいことは伝わったんじゃないかな、と(必死だ)。
>>330 > 一般に異なるんで、みられないっすよね(意味のない議論)。
みられないっすよ(意味のない同意)。
> でもいいたいことは伝わったんじゃないかな、と(必死だ)。
伝わっちゃいるがね。
332
333get!!!!!!!!!!!!!
Pentium333MHz
337 :
デフォルトの名無しさん :02/07/11 19:16
すいません。超初心者なんですけど、 VCのソースをnmakeするとwin32.makがありませんと出てきます。 VC持ってないんで、Bolandか.Netでのコンパイルの仕方ご存じないでしょうか
win32.mak の中に nmake で実行する内容を記述するんじゃなかったっけ? よく知らないけど。
340 :
デフォルトの名無しさん :02/07/11 19:26
>>338 どこで聞けばいいでしょうか
MSDNのサンプルはMakefileに全部
!include <win32.mak>
と書いてあって、先にすすまないんですよ
せめてその辺のことがわかるサイトだけでも・・・
342 :
デフォルトの名無しさん :02/07/11 19:31
どうもです。
#include <stdio.h> typedef struct{ char a:2; char b:2; }KOU; KOU k; void main() { k.a=2; k.b=1; printf("%d %d\n",k.a,k.b); } なぜかk.aが-2が表示される。なんで? 00000010 だから2が表示されるんじゃないの? ↑最上位ビットだから。という事は,0と1を入れたい場合は,2ビットではなく3ビットでなくてはならないんですよね?
win32.makはwindowsの環境とか標準的なマクロを定義してある。 コンパイルしたければ、win32.makをincludeしないで、自分で 必要な分を定義すれば.netで使えるはず。 win32.makって再配布可能とされていないので、内容を書くことは出来ません
343の言ってることがよく分からんのは私だけ?
>>345 安心しろ。俺もだ。
特に最後の行は全く意味が分からん。
>>343 2ビットのchar(恐らくsigned char)がintに型変換される時に
最上位ビットが立ってる=負数だから型変換の結果も負数になったのでは。
typedef struct{
unsigned char a:2;
unsigned char b:2;
}KOU;
または
printf("%d %d\n",k.a & 3,k.b & 3);
でいけると思う。後者推奨。
>>343 0と1だけなら1ビットでいいに決まってるじゃん。ただその値はintに拡張
すると0と-1になるから、unsigned intにキャストして使えば0と1になる。
343は解決済みじゃなかったか?
349 :
デフォルトの名無しさん :02/07/11 20:14
>>344 どうもありがとうございます。
とりあえず、341さん御紹介の
BCCスレの過去ログでwin32b55.makなるものを発見。
それから.Net勉強してみます。感謝!
グルーバル変数をなるべく使うなと,書いているのをよく目にするのですが, ゲームを作っているとどうしてもグローバル変数を使わなければならなくなるのですが。 実際のところどのようにしてる?
ほんとうに、どうしても使う必要があるなら、使うよろし。
Singletonをグローバルと言い張るならグローバルを使うことになるが、 そうでないならSingleton一つ設置しておくだけだな。
353 :
デフォルトの名無しさん :02/07/11 21:40
たとえば、どっかのソースに、 static int hoge; という変数があって、この変数にアクセスするのに GetHoge(), SetHoge() のような関数を使うとするでしょ。 これって、グローバルにアクセスしてるのと大差ないような気が するんだけど、これでいいの?
どっかのソースにstatic int hogeなんて置かないもん。
プログラム全体で通用するようなグローバル変数(errnoとか)じゃなければあまり怖くないな。
357 :
デフォルトの名無しさん :02/07/11 22:25
>>353 呼び出し側(ソースファイルが異なる)でhoge=0;とやっても大丈夫だもん。
でもextern int hoge;と書かなければ大丈夫か・・・
アクセスうんぬんじゃなくスレッドアンセーフ(再入不可能)になることが問題なんじゃなかった? >>グルーバル変数をなるべく使うなと,書いている
>>353 assertと併用するといい感じになる。
>>358 定義側でstaticにしてなかったらダメだろ。
362 :
デフォルトの名無しさん :02/07/11 23:58
public,privateなんて、自分ひとりでプログラム作ってる限り、 そんなに関係ないだろ。 ライブラリや、多人数作業の時は必須だけど。
>>362 それを言ったら個人で使うなら何をやっても良いと思われ。
365 :
デフォルトの名無しさん :02/07/12 00:10
>>363 つまるところ、そうだろ。
公開ライブラリ作るとか、仕事でモジュールを作るとかだったら気をつかうけど、
自分でつかうオナーニプログラムでそんなには気にしないだろ。
とりあえず動けばおーけーで。
>>365 まぁ、同意。
いざ、誰かに見せる段になって恥かくかも知れないけどね。
367 :
デフォルトの名無しさん :02/07/12 00:13
>>365 いや、普段からそうしてると、業務でもコーディングが
荒れてきちゃうよ。
個人的には、其の辺りをプライベートでもきっちりやる
のがアマとプロの違いだと思っておりますですハイ
一人で作っても保守性って問題があるからな。
369 :
デフォルトの名無しさん :02/07/12 00:23
>>353 static int hoge;はヘッダに書く必要はないだろ?
それはつまりhogeの存在を隠蔽出来るってことだ。
規模とか、それを何回くらい使うかによるね。
371 :
デフォルトの名無しさん :02/07/12 01:01
errnoは参照するだけで自分で書き換えたりしない方がよいですか(自作ルーティンのエラー番号を設定する時とか)? というのもPerlの本にerrnoはUNIXシステムコールが返すエラー番号だと書かれていましたので。
基本的にはそうね。
>>371 書き換えていいかどうか自分で判断できるまで我慢しる。
>UNIXシステムコールが返すエラー番号だと書かれていましたので。
これは表現が正確じゃないな。
っつーか、perl の本を読む前に K&R なり企画書なりを読めYO!
374 :
デフォルトの名無しさん :02/07/12 01:32
375 :
デフォルトの名無しさん :02/07/12 01:57
while(1){ for(i=0;i<2;i++){ if((msglen[i] = read(s[i+1],&str[i],1)) < 0){ perror("read"); exit(1); } } if((strncmp(&str[0], &str[1], 1)) == 0){//引き分けの場合 printf("%s\n",buf2); printf("a1"); for(i=1;i<3;i++){ write(s[i],buf2,strlen(buf2)); } continue; }else{ exit(0); } } 以上のwhile文のところで、思うような動作をしてくれません。 ifの条件をみたした時、こっちとしては普通にもう一度はじめから動作して 欲しいのですが、なぜか全部3回繰り返した後、こっちの動作を受け付けるように なるんですけど、なぜでしょうか?
1文字ならstrncmpを使う必要はないと思う。
&str[1]ってみにくいね。str+1にして。
醜い 見難い
>>375 s[0]は使わんの?
> 以上のwhile文のところで、思うような動作をしてくれません。
> ifの条件をみたした時、こっちとしては普通にもう一度はじめから動作して
> 欲しいのですが、なぜか全部3回繰り返した後、こっちの動作を受け付けるように
> なるんですけど、なぜでしょうか?
whileの中にforがあって、その中でcontinueしてるから。
381 :
デフォルトの名無しさん :02/07/12 02:34
>>375 readとwriteのパラメータってこれでいいの?
配列sにはopen(2)で返ってきたファイルディスクプリタが入ってるのかな。
あとcontinueはいらないし。どうせelseせずwhileまで落ちるんだし。
>>380 >whileの中にforがあって、その中でcontinueしてるから。
それはねえだろ。forの中でcontinueしてないよ。
382 :
デフォルトの名無しさん :02/07/12 02:35
>>380 s[0]は親プロセスで使ってます。これは子プロセスなので。
長すぎたので省略しました。
continueをはずしても同じように3回繰り返されてしまいました。
383 :
デフォルトの名無しさん :02/07/12 02:37
>>381 配列s[1]と[2]にはacceptしたファイルディスクリプタが入っています。
384 :
デフォルトの名無しさん :02/07/12 02:46
>>375 その前に「思うような動作」ってなに?
回答者の解釈をあてにするな。
385 :
デフォルトの名無しさん :02/07/12 02:48
>>383 なるほど、ソケットか。
えと、3回繰り返されるってのは、
printf("%s\n",buf2);
printf("a1");
が3回、えーとたとえばbuf2が"hoge"だったとして、
hoge
a1
hoge
a1
hoge
a1
と出ているってこと?
>>385 そうです。本当は、
hoge
a1
だけかかれて、read()に戻ってほしいのですが、そうなってしまうんです。
>>384 すいません。上のような動作をしてほしいです。
387 :
デフォルトの名無しさん :02/07/12 02:57
>>386 なるほど。えと、ソケットの向こう側で1文字送ってるつもりが
3文字送ってた、なんてことは、いくらなんでもないかな(w
printf("%s\n",buf2);
を
printf("%s: %02x: %02x\n",buf2, msglen[0], msglen[1]);
に置き換えたらどうなるだろう。
>>381 > >whileの中にforがあって、その中でcontinueしてるから。
> それはねえだろ。forの中でcontinueしてないよ。
forは二つあるんだが。
>>387 : 01: 01がbuf2の後に三回出力されました
390 :
デフォルトの名無しさん :02/07/12 03:04
>>388 うん。どっちもforの中でcontinueしてないよ。
とりあえず、整形してインデントあわせて見てみたけど。
391 :
デフォルトの名無しさん :02/07/12 03:15
>>389 むー、わからんなあ。コード自体はおかしなところないようだし。
さっきも書いたけどソケットの向こう側で1文字のつもりが
3文字書いていたのでなければお手上げだ。
>>391 3文字書いてはないのですが、さっきのプログラムのwhileの直後に
printf("str[0]:%c\n", str[0]);
printf("str[1]:%c\n", str[1]);
をいれて試してみたところ、やはり2回目と3回目では
str[0]とstr[1]には何も入ってなく、そのままif文にとんで繰り返して
いるみたいでした。
けど3回くりかえすのはなんでなんでしょう・・・?
どのように変なのでしょうか?
>>394 それで期待した値がmsglenに入ってる?
と思ったけど、違うような気もしてきた。スマソ
printf("a1"); を printf("a1\n"); に変えたらどうなるだろう?と言ってみるテスト
3回目までは同じ値が返ってきてるだけじゃないかな・・・ readがどんな値を返してるのか調べてみたら?
398 :
初心者なんですが :02/07/12 05:17
ここで質問してもいいんですか? a〜xまでの順列のパターンを列挙させたいんですが、C言語で どうつくったらいいんでしょうか? 関数とかありますか?ヒントをいただけたらと思うんですが。 例 ABC,ACB,BAC,BCA,CAB,CBA
399 :
デフォルトの名無しさん :02/07/12 05:27
char str[] = "***"; for(str[0] = 'A'; str[0] <= 'X'; str[0]++) for(str[1] = 'A'; str[1] <= 'X'; str[1]++) for(str[2] = 'A'; str[2] <= 'X'; str[2]++) printf("%s\n", str);
>>398 char str[4];
str[3] = '\0';
for(str[0] = 'A'; str[0] <= 'X'; str[0]++)
for(str[1] = 'A'; str[1] <= 'X'; str[1]++)
if ( str[0] == str[1] )
continue;
else
for(str[2] = 'A'; str[2] <= 'X'; str[2]++)
if ( str[0] == str[2] || str[1] == str[2] )
continue;
else
printf("%s\n", str);
もっとスマートな方法ないのかな〜?
401 :
初心者なんですが :02/07/12 06:09
>399-400 ありがとうございます。 >399 すいません、同じ値が出てきてしまいます。 >400 「使用できない文字があります。」となってしまいます。どうしてかなぁ? 自分で探せばいいんですが。 ちょっと説明が足りなかったんですが、順列の値をもとに計算とかの処理をさせて 最小の値の順列を求めるということをさせてみようと思ったんですが、 配列とfor文駆使すればいいのかな?知識がないんで頭が痛いです。
402 :
デフォルトの名無しさん :02/07/12 06:39
>>401 順列生成だったら「c言語による最新アルゴリズム事典」
とかにも書いてあるよ
すいません。 acceptしたファイルディスクリプタからの入力を読みとりたいのですが、 whileで何度も読みとりたいのですが、1回目は読みとれるのですが、 2回目以降読みとらずに、勝手に進んじゃいます。 もしかして、一回ずつacceptしなおさないといけないのでしょうか?
あと、forkとselectって同時に使えますか?
>>390 スマソ。グチャグチャなインデントにだまされた。
>>403 何度もってのが接続ごとにという意味なら当然そのたびにaccept()が必要だが、
どういう風にやってるのかソースを出すべし。
>>404 同時にってどういうことよ? fork()してからselect()は当然可能だが。
407 :
デフォルトの名無しさん :02/07/12 08:39
>>400 スマートかどうかわからんけど、より汎用的なのを作ってみた。
はじめは、[a-x]に24文字あるから、24進数3桁の数字を111から
カウントしていくってコードを思いついたけど、
汎用にしたらオーバーフロー起こしそうな感じだったので
再帰で実装してみた。
#include <stdio.h>
#include <string.h>
void rgenerate(unsigned int digit, const char *seed, char *buf)
{
int i;
if (!digit) {
puts(buf);
return;
}
for(i = 0; i < strlen(seed); ++i) {
buf[digit - 1] = seed[i];
rgenerate(digit - 1, seed, buf);
}
}
int generate(unsigned int digit, const char *seed)
{
char *buf = (char*)malloc(digit + 1);
if (!buf) {
return -1;
}
buf[digit] = '\0';
rgenerate(digit, seed, buf);
free(buf);
}
int main(int argc, char * argv[])
{
generate(3, "abcdefghijklmnopqrstuvwx");
return 0;
}
409 :
デフォルトの名無しさん :02/07/12 08:48
>>408 すまん、emacsからそのままコピペ。
行頭の半角スペースは見えなくなっちゃうのよね…
2chでソース晒すとそうなっちゃうんだよね。 そういう時は、エディタにコピーしてインデント付けながら読むとえ〜よ。
2ch用ブラウザで見るとちゃんと見えるよ。navi2chとか。
書き込むときに連続するスペースを全角にするとか、 にするとかいう機能があるといいかもね。
>>412 ん?>407はかちゅでちゃんとインデント付いて見えたけど
ポップアップだと見えるけど、そうでないなら見えない
416 :
デフォルト名無しさん :02/07/12 16:27
以下のプログラムを実行すると、6文字以上打ち込んでも 返してくれます。 変数"ss"は5文字と指定しているのに。 どうしてなのでしょうか? 教えてください。 int main() { char ss[5]; cin >> ss; cout << ss << '\n' << ss << '\n' ; return 0; }
>>416 単に配列ss[]がオーバーフローしているだけ。関数を呼び出したりしてから
表示するとバグる可能性大。
よくわかんないんだけど4文字じゃなくて5文字なの? ってーかC++だし。
>>418 うむ。4文字までだな。'\0'を入れて5文字まで。
ダメだろうな。たぶん表示した後でコケると思われ。 もっと大量に打ち込むと表示するときにコケるかも試練。
fgetsでええやん
試しに10文字以上適当に打ち込んだら エラーという反応だった。 ところで416に書いたプログラムがC++とどうしてわかったん???
スレ違いと分かっていて聞いたのね。 Cにoperator>>()もstd::cinもない
ふざけんな
426 :
デフォルトの名無しさん :02/07/12 18:53
>>423 おいおいそんなことぐらいわかるよ、 ね。
>424 マジで解らんかった。。。 このレベルならCもC++も同じなんだろうな、くらいの 感覚でここに書き込んだ。 迷惑だったらスンマソン
C言語で,ユーザーに名前を入力させてそれを使っていきたいんだけど(MS-DOSではないです), win32API使わないと入力欄とか作れないのかな?
うん
431 :
デフォルトの名無しさん :02/07/12 21:11
>>429 MS-DOSではないものを作る=ウィンドウズプログラムを作る
つーこと?
ウィンドウズプログラムを作るは、win32APIはほぼつかうです。
432 :
デフォルトの名無しさん :02/07/12 22:06
>>428 違反が起きないこともありうる。
randが返してきた値をポインタに変換したとき、
偶然スタックを指してたとかヒープを指してたとか。
書いた場所がスタックにある関数の戻りアドレスだったり、
レジスタを退避した場所だったりしたら一見関係ない場所で大抵クラッシュするだろうけど、
そうじゃない場合もありうる。
まあ大抵は違反が起きてくれるだろうけど。
だからこの種のポインタの値が腐ってるコードが一見うまく動くように
偶然なってしまった場合、非常に見つけ出すのが困難なバグになる。
433 :
デフォルトの名無しさん :02/07/12 22:27
点 P(x、y)があったとして。 i=0;i<30;i++ というループのなかでちょうどよくその点を中心に横半径RX 縦半径RY の円を描く様な点を求めるにはどうコーディングすればよいのでしょう?
>434 すみません。つまり、 int rx=40,ry=30;//半径40、30の楕円 int x=100,y=100;//中心 int p_x[30];//点を格納する配列 int p_y[30];//同上 for(int i=0;i<30;i++){ //ここで、rx,ryの円を描くように繰りかえし回数と等しい変化の割合で上限30個の点を求めたい。 }
>>435 12度ずつ角度をつけて(cos,sin)で半径rxの正円を書いてから、
縦に(ry/rx)倍して最後に(x,y)だけ平行移動
ちょっといびつになるが。
>436 なるほど!形の綺麗さにはこだわらない部分なので大丈夫です。どうもありがとうございました。
>>378 おいらどっちかと言えば str+1 よりも &str[1] の方が好き。
440 :
デフォルトの名無しさん :02/07/13 00:20
みなさん、関数プロトタイプって書いてますか?
441 :
デフォルトの名無しさん :02/07/13 00:27
>>440 規模の小さいプログラムなら関数の定義の順番を工夫して
書かないで済ませることもあります。
しかしソースを複数に分割するような場合は必ずプロトタイプをヘッダに書いてincludeします。
ちょっとした労力でバグが入る可能性を大きく減らせますから。
しかもプロトタイプがないと、コンパイラは関数の返す値をintと仮定しちゃうので、
いろいろ面倒なことも起こりがちですし。
staticな関数の場合はプロトタイプ書かないことが多いです。
442 :
デフォルトの名無しさん :02/07/13 00:28
ハァ(゚Д゚)?
443 :
デフォルトの名無しさん :02/07/13 00:37
ハァ(゚Д゚)?
444 :
デフォルトの名無しさん :02/07/13 00:39
>>440 当然だ。
externならヘッダーファイルに、staticなら同じファイルに書いている。
445 :
デフォルトの名無しさん :02/07/13 00:42
整数計算の桁数をdoubleより大きくすることはできないんでしょうか? バイト長を指定できたりとかはしませんか?double(=8バイト)では足りないのです。 始めたばかりで何も分からずすいません。
整数計算とdoubleに関係が?
ハイハイ。
>>447 なんかひっかかると思ったら、doubleで整数ってなんじゃ〜
450 :
デフォルトの名無しさん :02/07/13 00:48
longをつけても変わりませんでした。 整数計算なんですが、x^255などというでかい数字を計算するもので、unsignedなどでは桁が全然足りないのでdoubleを使ったのです。 それで、無限桁数であればいいなと思ったのです。
long longとか使えば? 後は文字列にするとか、 多売長にするとか。
454 :
デフォルトの名無しさん :02/07/13 00:56
>451 (^_^;) >452 long long と書いたら蹴られました。 多倍長のやりかたが分かりません…すいません…
多倍長しかないだろ。
456 :
デフォルトの名無しさん :02/07/13 00:58
>>454 C++なら多倍長クラスがあるがどうよ?
458 :
デフォルトの名無しさん :02/07/13 01:01
>>454 このスレか前のスレにbignumについて書いてあるから、それみてみれ。
Cで使えるbignumライブラリについてのポインタがあったと思ったぞ。
459 :
デフォルトの名無しさん :02/07/13 01:03
>456 聞いたことあります。携帯板かどこかで見たような? >457 Cでやってます。何も知らなくてすいません。 >458 探してみます。ありがとうございます。 しばらくいろいろやってみます。ありがとうございます。
>>454 long longが跳ねられる…VCか?
__int64とか。
462 :
デフォルトの名無しさん :02/07/13 01:23
>>460 255乗する必要あるんだから、64bitでは全然足りんのではないか。
2^255でさえ、255bit必要だし。
そもそも^255する必要があるのか?
いったい何をするんだろ?
しらね
466 :
デフォルトの名無しさん :02/07/13 01:41
素晴しい!
468 :
デフォルトの名無しさん :02/07/13 01:44
fopenでファイルを開くときに、exeとは別のフォルダの中にあるファイルを開くことってできませんか? 絶対パス指定とかしてもだめっぽいんですが・・?
469 :
デフォルトの名無しさん :02/07/13 01:46
>>468 まさか\マークを2個重ねてないとかそういうことか?
但しDOS/Windowsの話だが。
471 :
デフォルトの名無しさん :02/07/13 01:54
¥は二つ重ねてるよ。 やっぱ無理かね
じゃあ、やっぱ無理なのかもしれないね
473 :
デフォルトの名無しさん :02/07/13 02:01
もう一度言ってみてください。
わけわからん
絶対パスを指定しても駄目ってことあるのかな。 ファイルが無いとかじゃなく。
476 :
デフォルトの名無しさん :02/07/13 02:09
479 :
デフォルトの名無しさん :02/07/13 09:52
>>477 確かにんなこたーない。
うちでもちゃんと動く。
絶対の話があがってるけど、相対はどうなん?
相対でも絶対でも開けるだろ。 ちなみにVCだとdebugとかreleaseとかのフォルダにexeがあるが、 VC上で動かすときはその一つ上のフォルダにexeがあるようなイメージになっているので 相対パスの指定がそんなかんじ。
481 :
デフォルトの名無しさん :02/07/13 10:18
相対のときはカレントディレクトリがどこに設定されてるかで 結果が変わってきませんか?
482 :
デフォルトの名無しさん :02/07/13 10:23
C言語ってDOS窓で動くんですか?
>>482 いいえ、コンピュータで動きます。
たまたま標準出力がそこにあるだけ。
484 :
デフォルトの名無しさん :02/07/13 10:50
>>482 C言語は動かないです。C言語で作られた実行モジュールが動きます。
ネタはマ板でやってくださいです。。
486 :
デフォルトの名無しさん :02/07/13 11:02
>>482 コンソールモードでコンパイルすれば DOS窓で動くアプリが作れますよ。
>>481 あたりまえだろ。そんなことをここで聞くな。
488 :
わからない :02/07/13 16:39
どう説明していいかわからないのですが、「a^63をコンピューターに計算させようとしたとき、最低何回乗算すれば求まるか」という問題で、僕は答えが8回だと思ったのですが、解答を見ると10回になっていました。 ↓具体的に考えた例を挙げておきます。 a^3 = a^1 * a^1 * a^1 a^7 = a^3 * a^3 * a^1 a^21 = a^7 * a^7 * a^7 a^63 = a^21 * a^21 * a^21 ↓模範解答ではこうなっていました。 a^1 * a^1 = a^2 a^2 * a^2 = a^4 a^4 * a^4 = a^8 a^8 * a^8 = a^16 a^16 * a^16 = a^32 a^32 * a^16 = a^48 a^48 * a^8 = a^56 a^56 * a^4 = a^60 a^60 * a^2 = a^62 a^62 * a^1 = a^63 一体僕の解答のどこがおかしいのか教えてください。
>>488 6回でできるよ。
a^3 = a^1 * a^1 * a^1
a^9 = a^3 * a^3
a^7 = a^3 * a^3 * a^1
a^63 = a^7 * a^9
7回だった。逝ってきます・・・・・・ a^3 = a^1 * a^1 * a^1 a^9 = a^3 * a^3 * a^3 a^7 = a^3 * a^3 * a^1 a^63 = a^7 * a^9
491 :
デフォルトの名無しさん :02/07/13 17:02
とりあえずツッコミ・・・ a^7 * a^9 は a^16 っす・・・
・・・・と思ったけどやっぱり6回でできるね。 a^3 = a^1 * a^1 * a^1 a^6 = a^3 * a^3 a^9 = a^6 * a^3 a^7 = a^6 * a^1 a^63 = a^7 * a^9
494 :
デフォルトの名無しさん :02/07/13 17:05
Cとなんの関係があるのだろうか。
495 :
わからない :02/07/13 18:54
あ、すいません。すれ違いでした。 宿題スレに行って来ます。
496 :
わからない :02/07/13 19:01
みなさんありがとうございます。でもやっぱり分かりません。僕の答えと模範解答の違いがよく分からなかったのです。
497 :
デフォルトの名無しさん :02/07/13 19:29
1回できますよ. a^63 = a ^ 1 * a ^ 1 * (中略) * a ^ 1 です.↑でa ^ 1は63回出てきます.
500 :
デフォルトの名無しさん :02/07/13 21:10
C言語って、どのくらいで習得できるん?
カイジっておもしれーな。
>503 天才なら3日
505 :
デフォルトの名無しさん :02/07/13 23:09
Cって乱数発生の関数ないの?
506 :
デフォルトの名無しさん :02/07/13 23:11
習得って?
509 :
デフォルトの名無しさん :02/07/14 00:17
510 :
デフォルトの名無しさん :02/07/14 00:51
あのぅ、fork()とpipe()をつかってnkfに漢字変換をさせたいと考えて ますが、nkfにデータを渡す際、パイプを閉じているにもかかわらず、 nkfがデータの終わりを待って、デッドロックが発生します。 どのようにすればいいんでしょう?
511 :
デフォルトの名無しさん :02/07/14 01:00
経験がものを言う世界だからな。本だけ読んでもどうにもならない。
513 :
デフォルトの名無しさん :02/07/14 01:05
>>510 親プロセスが、ちゃんと EOF まで nkf の出力パイプを読みきってあげていますか?
514 :
デフォルトの名無しさん :02/07/14 01:15
>>513 親プロセスのwait()でひっかかっていて、nkfの出力パイプを読めるところまでいっていません。
nkfの出力パイプを試しに標準出力にしてみてみると、入力待ちをしているようです。
nkfへの出力パイプにはwriteして、最後にclose()を呼び出しています。なので、パイプは切れているはずですが、なぜに待ち続けるnkf・・・。
515 :
デフォルトの名無しさん :02/07/14 01:38
ゴメソ。できた。 パイプは2個つかうのね・・・ドキュソぶりを発揮してしまった罠。
516 :
デフォルトの名無しさん :02/07/14 05:00
(a)^=(b), (b)^=(a), (a)^=(b) どうしてこれが置換になるのですか?
1番目の式でaに aとbの違い が代入される。 2番目の式でbに aとbの違い とb の違いが代入される。これはもとのa。 3番目の式でaに aとbの違い とa の違いが代入される。これはもとのb。
GUI処理と内部ロジックは,分けろといわれたんですが GUI処理って画像の表示とかでしょうか?
>>519 グラフィカルなユーザインタフェースとかでしょう。
「コメントがなくてもわかるようにかく・・・」 ゲーム作っていればむりぽなのだが
xorってこんなことにも使えるんだ。ビット反転くらいにしか使わなかったが・・・
それでいいって・・
1の補数とか2の補数って何の考えで使うんだろう? みんな覚えている? 覚えていた方がいい?
swapなら
a=a+b-(b=a);
もアルネ。
>>525 引き算に使うというか。CPU内では
10 - 5 は 10 + (-5)
と処理されます。
引き算の命令なんかほんとは無いんですよ。
その正の数を負にするのが2の補数。
知ってて得したことは無し。
でもビット反転~は知っとこう。
負の整数は2の補数で表現される。 でもって、2の補数は1の補数+1だ。 1の補数は全部のビットを逆にしたやつ。
実数型には通用しない事が多いからそこんとこヨロ。
>>527 わかってるとおもうけど、ないのは減算命令じゃなくて減算器。
なお、普通は整数演算は加算とビット演算はひとつの演算器になってる。
たまーに、負数の内部表現が2の補数であることを(無意識に)仮定して、
ワードの全ビットを1にするのに-1と書いてあるコードがあるけど、
正しくは~0(うるさくいうと~((unsigned)0))。
どっちもおなじやん
>普通は整数演算は加算とビット演算はひとつの演算器になってる。 おれはこの日本語が分からん。不定形だ。 ところで型接尾子u、UはANSI規格内じゃなかった気が するんだけど、どうなん?
整数演算は→整数の
537 :
デフォルトの名無しさん :02/07/15 11:00
入門書で、copy コマンドのようなもの を作るといSAMPLEがあってコンパイ ルしてみたんですけど、.exeファイル がコピーできません。 なぜでしょう?? テキストファイルしかCOPYできないん です。
538 :
デフォルトの名無しさん :02/07/15 11:21
ファイルをバイナリモードで開いてないから
539 :
デフォルトの名無しさん :02/07/15 18:50
fgetsからintを使うfgetcにしたら解決しました。
>>539 もしかして copy のサンプルがその本ではfgets()で書いてあったのか!?
そんな本捨てろよ。
VC++で聞こうか迷ったんですが、 とりあえずVC++6.0の環境で、 #include "stdafx.h" #include <iostream> using namespace std; int main() { char value; value = 1042*1042*1042; printf("%d\n",value); return 0; } をビルドすると警告のみで済み(エラーなし)、 実行すると「-56」と出ます。 何故??? コンパイルの時点でエラーが出ない事がそもそも不思議ちゃん。
ロリは帰れ
543 :
デフォルトの名無しさん :02/07/15 19:05
scanf("%d",&a); で数値を入力させるといちいちEnterキーを押さないといけませんよね。 なんとかEnterキーを押さずに数字入力したいのですが どうすればいいのでしょうか?
>>543 難しいですね
1 と
12 と
120 をどうやって区別するんでしょうか
低レベルなボケ(プ
547 :
デフォルトの名無しさん :02/07/15 19:32
死ぬまで
549 :
デフォルトの名無しさん :02/07/15 19:34
551 :
デフォルトの名無しさん :02/07/15 19:36
>>551 標準ライブラリでは無理(なはず)。
windowsならgetcheでできたような・・・
553 :
デフォルトの名無しさん :02/07/15 19:41
554 :
デフォルトの名無しさん :02/07/15 19:56
cygwinでncurses使ったらどう?
>回線で首つって逝って来ます。 意味わかってんの?
557 :
デフォルトの名無しさん :02/07/15 20:22
下手に通ぶるのも痛い罠。
563 :
デフォルトの名無しさん :02/07/15 23:14
ioctl()をラップする関数ってどうやって書くの ...の部分をどうしたらいいかわかりません
564 :
デフォルトの名無しさん :02/07/15 23:19
みなさん、こんにちわ。 C言語を勉強中なんですけど分からないところがあります。ぜひ、教えてください。 MS VC++6.0でCのソースを開いてコンパイルして使っています。 配列を多く使うとエラーになってしまうんですがどうしてでしょうか? char ss[1024][1024][1024]; ←これだと大丈夫。 char ss[4096][4096][4096]; ←これだとだめ。(c2133エラー)サイズが不明です。が出てしまいます。
36bit個だぞゴルァ!
>564 なんのために、そのような暴挙を?
1024*1024*1024 = 0x40000000 4096*4096*4096 = 0x1000000000 なっ
そういうもんだから。
すいません、 >char ss[1024][1024][1024]; ←これだと大丈夫。 これでは、エラーは出なかったけど実行出来ませんでした。 ータル イメージ サイズ -2147278848 が最大値 (268435456) を越えています;
多く配列が欲しい場合どうすればいいのでしょうか? 出来れば char ss[16384][16384][16384]ぐらい欲しいのですが…。 無理でしょうか?
まじで、なにをするのよ?
>>570 Cとしては正しいよ。
あと50年くらいすれば実行できるんじゃない?
>>564 そのタイミングでそのネタは、アレだよ…
>570 それってテラバイトいってないか?
つーか、汎用機でもそんなにメモリ積んでない
メモリを400TBもつかって何するつもりなんだか…。
>>574 4TBだね。流体シミュレーションでもしようってのかな。
間違えた…ウワァァァン
( ´,_ゝ`)
580 :
マグマ大便 :02/07/15 23:54
64ビットCPUと対応するコンパイラがないと無理じゃないの?
OSから必要と思われ。
(´-`).。oO(きっと地球趣味レータで動かすんだよ)
あのー、俺は double [100000][100000][100000][100000] 必要なんですけど どうすればいいですか?逝ってよしですか? 超対称性理論を実証するのに必要なんですけど・・・・・
整数でやれば? char[100000][100000][100000][100000]
585 :
デフォルトの名無しさん :02/07/16 00:37
>583 心配しなくても、計算が終わる頃にはそれくらい当り前にできるようになってるよ。
ああ、前スレ読んでなかったよ。。
これでもオーバーフローするんだね。(鬱
>>583 あらためて。
PS3買ってグリッドコンピューティングでもすれば?
PS3はcellを搭載しませんが、何か?
64bit対応コンパイラでも無理なのかな(sparcとかalphaとか) アドレス空間は64bit,longも64bitでもintが32bitだと無理かも
589 :
デフォルトの名無しさん :02/07/16 01:01
char ss[2][2][2][2]でもオーバーフロウします。。。
char ss[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1]; で代用してください。
あのー、ほんとに基本で申し訳ないんですけど、 標準入力からの文字と数字の見分け方ってどうすればいいんですか? ほんとにすいません。 でもとりあえず教えてくださいお願いします。 教えてもらったらキーボードのカドに頭ぶつけて二度と来ないんで、 これだけは教えてください。
>>591 なぜそんなに謝るんだね?
ん?何をしたんだい?言ってみなさい。
大丈夫、秘密は絶対誰にもしゃべらないから。
593 :
デフォルトの名無しさん :02/07/16 04:02
int main(void) int main() main() などがありますが、どれを使ったほうがいのですか?
>>593 void main(void)
が正解です。
>>594 それは環境による。大概のOSは int main(void) が正解。
>>591 標準入力から流れてくるのは文字列だけ?
そうなのだったら、ctype.hの各関数(マクロ)を調べるとよい。
>>593 規格上はint main()が正解。int main(void)は同じ。プロトタイプだと話は変わってくるけど。
スレとしてはvoidが正解
FILE *main()
600 :
デフォルトの名無しさん :02/07/16 04:29
>>595 つか規格上は、mainはintを返さないとまずい。
まずいというか、intを返さなければならない。
>>596 標準入力からは、文字列のみ、または数字のみです。
文字列と数字が混ざることはありません。
この場合、どんな関数で受け取るのが都合がいいのかも
あわせて教えてもらえるととてもありがたいです。
602 :
デフォルトの名無しさん :02/07/16 05:14
いろいろな返答ありがとうございます。 とりあえず、 int main() int main(void) のどちらかをつかっておけば、無難ということでOKですか?
604 :
デフォルトの名無しさん :02/07/16 05:25
>>603 うん。あとは、
int main(int argc, char **argv)
も使う。とにかくmainはintを返しとけ。
>>602 それだ!!
ありがとうございます。
ではお約束通りキーボードのカドに頭ぶつけて逝ってきます。
>>601 お前の定義じゃ数字は文字列に含まれないのか小一時間
608 :
デフォルトの名無しさん :02/07/16 07:20
はい、唐突に質問です。パスワードを暗号化して記録しておくためにハッシュを行いたいんです。 crypt()を用いてDESハッシュはできたのですが、暗号文が短いのでちょっと不安。 そこでmd5ダイジェストを実装しようとしたのですが、コンパイルが上手く行きません。 現在Vine Linux環境で、コマンドラインの指定が間違ってると思うのですがアドバイスをお願いします。 エラーメッセージは↓(次に続く)
必要なやつをリンクさせる気がするのですが… $gcc -o main.c md5_crypt.o /usr/lib/crt1.o: In function `_start': /usr/lib/crt1.o(.text+0x18): undefined reference to `main' md5_crypt.o: In function `md5_crypt': md5_crypt.o(.text+0x45): undefined reference to `MD5Init' md5_crypt.o(.text+0x64): undefined reference to `MD5Update' md5_crypt.o(.text+0x83): undefined reference to `MD5Update' md5_crypt.o(.text+0x93): undefined reference to `MD5Final' collect2: ld returned 1 exit status
失礼、↑ちょっと訂正。 $gcc -o md5 main.c md5_crypt.o
>>609 そのmain.cとmd5_crypt.oはどっから持って来たもの?
> $gcc -o main.c md5_crypt.o
もしかして、本当にこうやってmain.cを壊したとか。
さっきのはここに書くときに間違えただけなのでmainは無事です。 main.cは関数を呼ぶだけでmd5_crypt.c、md5_crypt.hはmd5暗号化処理を行う関数の実体を記述してます。 で、MD5Init、MD5Update…とかはjman md5で調べたら<openssl/md5.h>を インクルードして使うらしいので全部ライブラリを流用しました。 なんか、これらmd5関連の関数の実体をリンカで結べばいい気がするのですが、どこにある何をもってこればいいのかワカリマセン
-lcrypto
>>613 試してみたけど先程と同じエラーがでます。うーむ
$gcc -o md5 -lcrypto main.c md5_crypt.o
md5_crypt.o: In function `md5_crypt':
md5_crypt.o(.text+0x45): undefined reference to `MD5Init'
md5_crypt.o(.text+0x64): undefined reference to `MD5Update'
md5_crypt.o(.text+0x83): undefined reference to `MD5Update'
md5_crypt.o(.text+0x93): undefined reference to `MD5Final'
collect2: ld returned 1 exit status
>>614 $ gcc -o md5 main.c md5_crypt.o -lcrypto
-lオプションは順序を考えないと。
何度も申し訳ない。順序を換えても変化なしです…。 うおお、謎ッ!
$ gcc -print-file-name=libcrypto.so でlibcrypto.soを確認して、 $ rpm -qf /path/to/libcrypto.so とか $ nm /path/to/libcrypto.so | grep MD5 ってやったらなんか出て来る? (/path/to/libcrypto.soはgccで表示されたファイル名)
618 :
デフォルトの名無しさん :02/07/16 14:28
>>616 手元のマニュアル見ると、
MD5_Init
みたいにアンダーラインが入ってるようだけど?
gcc に -Wallオプションつけて未宣言関数を呼び出そうとしてないかチェックしてみたら?
>>618 > みたいにアンダーラインが入ってるようだけど?
あ、気づかなかった…。伐つ出汁。
ド素人な質問はここでいいんでしょうか…?
621 :
デフォルトの名無しさん :02/07/16 15:23
>>621 即レスしていただきありがとうございます。
でも聞く前にもうちょっとがんばってみようと思いますので。
どうしようもなくなった時はまたお願いします。
まあただ単に、配列に関数どかどかならべて順番に実行したいだけなんですが。
623 :
デフォルトの名無しさん :02/07/16 16:26
int型の変数aとbがあったとして、このaとbの符号が異なっている場合にtrueを得るにはどうすればスマートでしょうか? if文で比較するような、泥臭い方法しか思い付きませんでした... (TT)
最上位ビットの排他的論理和をとる
つか、すなおにif文つかうのが、スマート。
627 :
デフォルトの名無しさん :02/07/16 16:40
>625 オーバーフローは大丈夫か?
どっちかが0だとダメ。
>>623 その部分がボトルネックになることが分かってから考えたら?
うーん、自分があふぉなんだと思ってたんだけど...
スマートな方法が思い付かないんじゃなくって、そんな方法は無いのかな。
>>624 int型のサイズを決め打つような方法は採りたくないんですよ。
最上位ビットのマスクを求めるようなコードを書くのなら、if文の方がマシなような...
>>625 おぉ、プラスになれば符号は同じ、マイナスになれば符号が違ったって事ですね。
思い付かなんだ... (恥)
>> 627
オーバーフローしても、符号自体は保持される筈ですね。
今はif文で書いてあるんですけど、ちょっとテストしてから書き直してみます。
ありがとうでした。
>>629 確かにボトルネックになる部分ではありますが、それよりは「このコード格好悪いなぁ」という方が問題かも... (w
if( is) {
a = 1;
} else {
a = 2;
}
と書くよりは
a = is ? 1 : 2;
って書きたいですよね? 漏れだけかな...
>>628 ご指摘の通りです、書くときに考慮します。
4バイトだとして 0x80000000 * -1 = 0x80000000 じゃなかったっけか
本当にボトルネックになってるのなら、そういう基本操作はアセンブラでやったほうが速くなるかも。
うーむ。個人的には624に結構感動したのだが。一番速いと思うし。
>>633 この程度なら、まともなコンパイラならちゃんと最適化してくれるから、
自分でアセンブラ書くのはやめといたほうがいいかと。
int f(int a, int b) { return ((a & (1<<(CHAR_BIT*sizeof(int)-1))) ^ (b & (1<<(CHAR_BIT*sizeof(int)-1)))) != 0; } int g(int a, int b) { return ((unsigned)a >> (CHAR_BIT*sizeof(int)-1)) ^ ((unsigned)b >> (CHAR_BIT*sizeof(int)-1)); } int h(int a, int b) { return (a < 0) != (b < 0); } クリティカルな部分に使うなら、gを使ってhの内容をコメントに書いておく
ん? return (a^b)>>(CHAR_BIT*sizeof(int)-1); の方が良くない?
だんだんトリッキーになりつつある
鳥ッキー
640 :
デフォルトの名無しさん :02/07/16 17:30
>>631 無理にif文を使わないようにする方が格好悪い。
まあ三項演算子のほうが生成される実行ファイルが小さくなりやすいだろうが。
>637がベストだ。気がつかなかった。 あと、(a^b)をunsignedにキャストしないと、 結果がうまく0or1にならないかもしれないね(処理系依存)。 0と比較するなら構わないけど。 個人的には、普通に(無理に)ifや?:を使うより、 (a < 0) != (b < 0) の方がよっぽど見やすいと思う。
>>642 コメントは書いておいた方がいいと思う。
あと、関数じゃなくてマクロにするといいかも。
(a^b)<0は間違い?
645 :
デフォルトの名無しさん :02/07/16 17:39
Cのビットシフトってsignedの値にやった場合は算術シフトに、unsignedの値にやった場合は論理シフトになるんでしたっけ?
>>644 gcc -O2 -S でコンパイルしてみたが一緒。そっちの方が分かりやすくて良いかも
>>645 同じくコンパイルしてみたが一緒だった
>>644 素直なコンパイラだと分岐命令に展開される
>>645 signedだろうがunsignedだろうが、実装依存
>>645 悪い。違った。
signedだと sarl (算術シフト)
unsignedだと shrl (論理シフト)
でした
>>646-647 情報ありがとう。
実装依存か。じゃあCから算術、論理を選択してビットシフトする(標準的な)方法はないんだ。
てゆーか、まあ、最初から負数が2の補数表現であることに依存してるわけで。 面白かったけど。
651 :
デフォルトの名無しさん :02/07/16 18:12
>>650 (a < 0) != (b < 0) のどこが依存しているの?
2の歩数だろ
>>645 unsignedおよびsignedで正であるときにのみ
a<<b⇔a*2^b
a>>b⇔a/2^b
であることが決まっている。(ただしbはaのビットサイズ未満かつ0以上)
その他は未定義や実装依存
便乗質問ですが、 整数をqsort()でソーティングするときに渡す比較関数は、 みなさんはどのように実装してます? とりあえず、 int compar(int *a, int *b) { return *a-*b; } は良くないということなので、私はif分岐でしてるんですが、 何か良い方法ありますか?
良くないことはないとおもうが
md5に悩んでいた608です。問題の箇所は"MD5_Init"のアンダーバー入れ忘れでした。 アンダーバーを書いて(↓)でうまくいきました。 カラアゲうまうまさん、名無しさんありがとうございました! $gcc -o md5 main.c md5_crypt.o -lcrypto
>>656 オーバフローするので大きい数字扱えません
659 :
デフォルトの名無しさん :02/07/16 19:38
無名共用体って合法かつポータブルですか?
Cでは非合法
>655 オーバーフローの可能性があるなら return -(*a < *b) + (*b > *a); にでもしといたら
やはりCではサポートされていないんですね。
>>661 struct{
union{
struct{
...
} C;
struct{
...
} D;
} B;
} A;
のような構造体を定義した場合、
A.B.C, A.B.Dというように毎回Bを指定するのは冗長です。
無名共用体使ってA.C, A.Dと書けば多少すっきりするので
たまに使います。
664 :
デフォルトの名無しさん :02/07/16 20:40
age
>659 union { struct{... } C; struct{... } D; } A; じゃだめなのかな?
666 :
デフォルトの名無しさん :02/07/16 21:18
>>663 grep 'define.*addr.*\.' /usr/include/netinet/*
667 :
デフォルトの名無しさん :02/07/16 22:17
C て、変数を漢字で記述できるのですか
669 :
デフォルトの名無しさん :02/07/16 22:22
お、これは、できるツールツクッチャエ ビジネスチャンス 既にあったりして
671 :
デフォルトの名無しさん :02/07/16 22:30
いい、m(._.)m
>>667 英字と数字と_のみ。先頭は数字であってはならない。
673 :
デフォルトの名無しさん :02/07/16 22:36
674 :
デフォルトの名無しさん :02/07/16 22:38
675 :
デフォルトの名無しさん :02/07/16 22:38
VBでは(Javaも?)変数名に2バイト文字を使えるけど、使う人はいないよね。
677 :
デフォルトの名無しさん :02/07/16 22:39
デバッグ用に識別子を戻すフィルタを急いでつくったので、よかったら お試しください。失礼いたしました。
sprintf(str,"<html>\n<head>\n<title>うんこですがイ可か</title>\n</head>\n
<body>\n<h1>うんこ画像</h1>\n<br>\n<img src="
http://www.unko.com/img/unko.jpg ">\n</body>\n
</html>") ;
当方VC++6.0
こんな感じでstrにhtml記述をぶち込みたいのですが、やり方が激しく分かりませんです
まず <img src="unko.jpg"> のダブルクォートでsprintf(str,"…"unko.jpg"…")
となってしまうのは問題なのでしょうか
さらに
http://www.unko.com/ … の//以降がコメント扱いされるくさいので、
\\\ に変えてみたところ、「不要な箇所に、エスケ-プシ-ケンスが付いています。」とVCに吐き捨てられますた。
どなたか解説おながいします(;´Д`)
<img src=\"unko.jpg\"> みたいにしてみそ。 そうすれば // があっても無問題。 src=" の部分で文字列が終わってしまうのね。 で、// で C++ 式のコメントが始まってしまうというわけ。
>681さん 即レスあがとうございます ものごっつ普通に実行出来ますた(;´∀`) 心の底からありがとうございます
>>676 どっちかというと、これが気になる。
> まあ、水谷カスタムとはいっても、flex win32用実行バイナリ内の
> 文字列リテラル( 多分 .simpleファイルか何かに相当 ) を
> 直接 ほんの十数バイト書き換えただけなので、簡単な
> わずかの修正で対応できると思います。
質問です。 メモリ関数と構造体を使用して、簡易データベースを作りたいのですが 構造体にメモリを割り当てるにはどうすればいいんですか? 構造体宣言を struct main_deta{ int deta_id;//データID char deta_name;//データネーム int deta_value;//データヴァリュー(数値) }*p;//確保したメモリのアドレス。データの格納先 このように書いて p = calloc(w, sizeof(struct main_deta)); printf("データIDを入力してください。 :"); scanf("%d",&p[i].deta_id); printf("データネームを入力してください。 :"); scanf("%s",&p[i].deta_name); printf("データヴァリューを入力してください。:"); scanf("%d",&p[i].deta_value); この形で入力して表示させようとすると 「"0x0040832c"の命令が"0x00000031"のメモリを参照しました。 メモリが"rezd"になることはできませんでした」と、でてきます。 このエラーは何なんですか? よろしくお願いします。
とりあえず、%sをcharで受けるのは無謀
どうでもいいが、data?
>>684 char data_nameはchar data_name[n]の間違いか?
>>689 %sが間違っている意味ではない。
deta_nameに&をつけているし、charに名前を入れる気なんだろうなぁ
と思って。
691 :
first time :02/07/17 15:09
初めての仕事で、Warning 除去を行っているのですが、なかなか時間がかかってしまいます。勉強にはなるのですが・・。
692 :
デフォルトの名無しさん :02/07/17 15:11
693 :
デフォルトの名無しさん :02/07/17 16:24
695 :
timer :02/07/17 17:29
PC-9821Xa10 TCC4 でタイマー(割り込み)を500ms以下にしたいんですができますか? 500msはできました。
696 :
デフォルトの名無しさん :02/07/17 18:53
構造体の名前が長くて書くのめんどくさいときに defineみたいなやつありませんでしたか?
>>695 自己レス。できますた。
timerの仕組みをもう少し勉強しなきゃ。
>>696 #define s struct long_long_long_name_struct
typedef struct long_long_long_name_struct s;
699 :
デフォルトの名無しさん :02/07/17 19:06
Xa・・・懐かしい響きだ。
701 :
デフォルトの名無しさん :02/07/17 19:18
dosのプログラミングにも飽きたので、 そろそろwindowsアプリにも挑戦しようかなって思ったんだけど コンパイルがうまくいきません ソースが間違ってるのかな?…↓ #include <windows.h> int WINAPI WinMain(HINSTANCE Inst, HINSTANCE Prev, LPSTR Cmd, int Show) { int hoge; hoge = MessageBox(NULL, (LPCSTR)"逝ってよし?", (LPCSTR)"2ch", MB_YESNO); if(hoge = IDYES){ system("rundll user.exe,exitwindows"); } return 0; } 誰かうまく逝った方教えてください
>702 なにがしたい?
>>702 実行しちまったがな
GUIプログラムとしてコンパイルしないと
(WinMainを呼ぶライブラリをリンクしないと)
だめだよ。それから
#include <stdlib.h>
とif(hoge = IDYES)は
==の間違い
レスありがd でも僕包茎なので リンクって何か分かりません どうやってやるんですか? module2つ以上作ったことありません
コンパイラが何か知らんが 例えばborland c++ならば bcc32 -tW hoge.c とか
>>707 コンパイルできたんだきど
パソコン止まります。
その名前を変えてくれ。 なんか見ていていやだ。 #俺が、って突っ込みはなしの方向で(ちがうけどw
>>694 遅レスすいません。
何とか解決しました。
変えてみましたン
>>708 の答え教えてほしいです。
なんでおとなしくメッセージループを作らないの?
>>712 意味がわかんないです。
教えてください♥
レベルが高すぎてついていけませんでした。 ヽ(`Д´)ノ ウワァァァン
>>716 returnの前に付け足すってことですか?
DOSは基本的に入力を受け付けるプログラムは同時にひとつしか 動いていなかったけど、windowsでは複数動作することがあるので、 メッセージドリブンというか、メッセージと呼ばれる要求をいったん 蓄えておいてそれを取り出して処理を行わなくてはならない。 最後のreturnの前のwhileやGetMessageは、そのメッセージをとりだして Dispatchで処理するルーチンに送る。
720 :
デフォルトの名無しさん :02/07/17 22:53
>>702 こんな感じ?
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR s,int nShow)
{
int rc = MessageBox(NULL,
TEXT("逝ってよし?"),TEXT("(* ゚Д゚)"),MB_ICONQUESTION | MB_YESNO);
if(rc==IDYES){
// 以下 NT,2000の処理
TOKEN_PRIVILEGES tp;
HANDLE hToken;
// アクセストークンを開き、遮断特権のLUIDを得る
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)
&& LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tp.Privileges[0].Luid)){
// 遮断特権を使用可能にする
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL);
}
// ここまで NT,2000
// 遮断 user.exeを使わず、自力で逝く
if(! ExitWindowsEx(EWX_SHUTDOWN | EWX_POWEROFF,0)){
MessageBox(NULL,TEXT("逝けませんでした"),NULL,MB_OK);
}
}
return 0;
}
721 :
デフォルトの名無しさん :02/07/18 00:23
質問です。 gcc で作ったオブジェクトファイルと、 g++で作ったオブジェクトファイルはリンクできませんか? よろしくお願いいたします。 たとえば、 gcc -c aaa.c g++ bbb.cpp aaa.o とかできませんか?
722 :
デフォルトの名無しさん :02/07/18 00:24
やったことないから知らんが、できるんじゃないかな? ていうか、やってみたらいい
なじぇか、シパーイします。 aaa.oを見てくれません・・・
g++のかわりにgcc -lstdc++は?
>>725 ありがとうございます。
なるほどー
やってみますね。
gcc でちょっとしたwarningで済んだものが
g++では厳しくなってますから・・
Cで書いた関数をC++で使いたいってときは、
いい方法があるのでしょうか・・・
>>727 、728
おぉ、ありがとうございます。
extern "C" 調べたら載ってましたー。
調査が足りませんでした・・・
ある時刻(例:2000年05月10日14時02分45秒を入力)から ある時刻(例:2001年10月03日06時10分10秒を入力)までの 経過時間を、○年○月○日○時○分○秒の形式で出力する プログラムを作りたいんですけど、どうしたらいいでしょうか? お願いします。
作ればいいんじゃない?
>>730 mktimeで秒にしてから差を取ってlocaltimeで・・・・・
という方法ではうまくゆかないな(鬱
関数やアルゴリズムについて教えて下さい。
734 :
デフォルトの名無しさん :02/07/18 14:27
>>732 助言ありがとうございます。
その方法でやってみます。
739 :
デフォルトの名無しさん :02/07/18 15:01
Cでファイルを開く時、fopenを使いますよね? 使い方がよく解らないのですが…教えていただけませんか?
>>730 ふつーに差を60で割って、60で割って、・・・とやればいいのでは?
では入出力を○時○分○秒形式で、どなたか作れませんか?
>>742 うるう年とか2月は28日までとかをいれると面倒だな。
mktimeの値の差分に2000年1月1日のmktimeの値を
足して、localtimeに放り込めばできるだろ。
年からのみ2000を引いておけ。
>740 ヘルプ…持ってないです。 BCCを使ってるので…以下無いとダメですか?
>746 ありがとうございます! こんなページがあったんですね。
つか、出力の○年○ヶ月方式やったら、 一ヶ月30日方式で計算するんと違うん?
>>749 うむ、そう思った。
時刻の差のうるう年とか大の月小の月っていったい何なんだよと不思議な気分(w
30日だと30*12=360、で5日足りないのは(゚Д゚)マズーくないか?
752 :
デフォルトの名無しさん :02/07/18 16:07
Cに環境変数は無いのか? 自分(EXE)の場所とかの。
無い
>751 12ヶ月->1年に繰り上がらないならいいのでわ? 1年は365.24日で、31556736秒として、そのあまりを 30で割って、ヶ月にする。そのあまりを、、、と続ければ。 >752 そういうのは環境変数っていうのか?
755 :
デフォルトの名無しさん :02/07/18 16:10
1/1と2/1と3/1は一ヶ月ずつ違うが 日単位でいえば等間隔ではない このあたりを定義してくれ と皆は言っている
2001-2000で1年 2001/09/10-2001/05/10で4ヶ月 2001/10/02-2001/09/10で22日 翌06:10:10-14:02:45で16時間7分25秒 ってことじゃないか?
「地球衝突まで後1235日!」
とかいう記述はあるけど
「地球衝突まで後3年4ヶ月と20日!」
とかいうのはあまり聞かないな、実際・・・。
>>754 それやると、1日が23時間58秒、とかにならない?
実のところ正しいやり方はないのでわ?
じゃ、 2002/2/28 〜 2005/1/1 までは?
759 :
デフォルトの名無しさん :02/07/18 16:55
ちと教えて。 extern int hogehoge( void ); extern int hogehoge( void ) { return( 0 ); } ってコードって、どう解釈されるの? externで外部参照宣言しておいて、自分の中にexternで関数を書くのって C言語的には普通に問題なく解釈されるものなの? もう会社から消えた先輩のソースを見て、疑問でまくりの1つです。
760 :
デフォルトの名無しさん :02/07/18 17:03
>>759 大馬鹿者のコード。かもしくはソースファイルがひとつだけのプログラム。
761 :
デフォルトの名無しさん :02/07/18 17:06
>>752 自分自身のファイル名やコンパイルした日時を表す定義済みマクロならあるけど。
762 :
デフォルトの名無しさん :02/07/18 17:06
文字列入力について教えてください。 void main() { char c; /*c=getchar();*/ ←これを入れると ms(); } void ms() { char ss[10]; gets(ss); ←文字列入力が出来ません。 printf(ss); printf("なんで出来ないんだよ〜"); ←これは表示されます。 } この場合、どうすれば文字列入力飛ばされずにすむでしょうか?
>>762 getcharで一文字取り出したあとに改行コードがバッファに残るから、getsでそれを呼んでしまい、getsで入力待ちにならない。
getsなんて使うな。printf(ss)はやめろ。printf("%s",ss)にしろ。
getcharのところでEnterキーだけ入力してみな。
>>760-761 どうも。
あるドライバの複数のソースファイルの1つです。
ドライバなので、おそらくドライバ起動時に外部から呼び出されているはずなんですが・・・
以前作られたドライバを組み込もうとしたら起動しないので、原因調べてくれっていわれて
既に存在しない先輩のソースを見てたんですけど、今までこんな記述見たことないので
おかしいな、と思ったんですよ。
結果として、ライブラリの関数でこういう記述をしておいて、外部からちゃんと呼び出せるんでしょうかね?
766 :
デフォルトの名無しさん :02/07/18 17:12
winでbccでWinAPIの勉強をしようと、 「猫でも」の「SDK1」を見に行ってコンパイルしてみているのですが、 うまくいきません。 何かbcc32にひきすうを渡さないとだめですか? もうひとつ。 bcc32ではC++はコンパイルできませんか?
×getsでそれを呼んでしまい ○getsがそれを読んでしまい
>>766 bcc32は元々C++用コンパイラ。
それとここではスレ違い。
770 :
デフォルトの名無しさん :02/07/18 17:15
>>765 あ、
>>759 は間違いじゃないぞ。
ただ、こういうものはヘッダーファイルに書いてインクルードする。
だいたい、「うまくいきません」と書いてあるだけで 何故うまくいかないのかわかったら超能力者だ。 どんなエラーになるかぐらいかけや。
次スレは圭子たんでよろしこ
関数はデフォルトでexternだってつい最近見たような 逆に、関数内でローカルに宣言することもできるけどね int main() { char buff[100]; int strcpy(char *p, const char *dst); int a = strcpy(buff, "abc"); } とかの矛盾した宣言でも
ん。
そのhogehogeという関数が呼び出せないか呼び出し時にエラーが起きる、という話でした。
ドライバ起動時の初期化関数なんすよね。
>>770 そうなの? ありがとー。
でも、思いっきりソースファイルに書いている。
そのソース(init.c)内の関数は、このexternか
static int ahya(void);
static int ahya(void)
{
/*処理*/
return( -1 ) ;
}
みたいなのばっかり。
775 :
デフォルトの名無しさん :02/07/18 17:19
>>773 K&Rのサンプルに局所的なプロトタイプ宣言があったよ。
思った通りその関数の中でしか通用しないね。
>>774 staticならプロトタイプはヘッダーファイルに書いてはならないけど、
他のファイルから参照するexternな関数ならプロトタイプはヘッダーファイルに書くべき。
いちいち書いても間違いじゃないけどね。
それと、変数宣言時につけるexternとはちょっと意味が違うよ。
変数宣言時じゃねーよ。外部参照を宣言するときだよ(鬱
778 :
デフォルトの名無しさん :02/07/18 17:24
>>768 後半部分は特にすれ違いだった。スマソ。
で、前半部分は、Cで書いたのでそれをやろうとしているのですが、
すれ違い?
>>778 特定のコンパイラの使い方についての質問は一応スレ違いということになっているみたいだけど、いいんじゃネーノ?
俺は分からないけど。。。。
>>778 エラーメッセージを貼った方がいいよ。
リンクエラーな気がする。
>>779 奴の言いぐさはそれはC++のコンパイラだから駄目って話では?
>>776 externの書き方はわかってるつもりです。
気にしてんのは、extern切ってる関数が自分自身にあり、
その宣言部分にexternが付いていることなんですが・・・
・外部参照宣言している関数が自分自身にあり、他のソースにはない
・extern int hoge(void) という書式から始まる関数の宣言は可能なのか
ということでした。
>>773 さんの言うとおりなら、可能ではあるようですが、なんか普通と違うような。。
783 :
デフォルトの名無しさん :02/07/18 17:29
おい!おまいら教えやがれ。 gethostname()を使わないでIP取得するにはどーすれば良いんだ。 てゆーか、教えてください。 スレ違いならスマソ。
自分自身?
785 :
デフォルトの名無しさん :02/07/18 17:31
>>782 関数の場合はいいんだってば。
ちなみにデフォルトでexternだから、int hoge(void)とextern hoge(void)は同じだよ。
>783 OS依存になると思うのだが。
gethostname() を gethost*by*name() と 混同しているのでわ……
792 :
名無し783 :02/07/18 17:50
>>787 そのとーりデス。スマソ
>>788 OS依存??
gethostname()が使えない環境なので・・・
VC++暦2週間なので、もう少し簡単におながいします。
gethostnameってUNIXのシステムコールじゃん・・・
>>785 サンクス!
これで落ち着いて残業できます(T-・ノ
でもその先輩、やるならやるで徹底しろよ・・
ソースによってコーディングルールむちゃくちゃだ。
>792 gethostname()はWinsockに有りますが何か。 >The gethostname function retrieves >the standard host name for the local computer.
>>795 えーと説明不足でした。
win98以降では、gethostname()で自機のIPを取得できるのですが、
win95でgethostname()を使うと、”プログラム開始エラー”で起動出来ないのです。
ので、gethostname以外で、取得方法がないモノかと・・・
797 :
デフォルトの名無しさん :02/07/18 18:04
>>796 それって単にWINSOCK.DLLが入っていないだけでは?
あちきの手元のヘルプ(bcb4付属の古い奴)だとgethostname()は WindowsNT Yes Win95 Yes Win32s Yes Import Library ws2_32.lib となってるんで、多分Winsock2が入ってないんだね 解決法は知らん
ネットワークのスレで聞くよろし
>>797 いえ、バージョン違いで・・・。
>>798 依頼者が、「winsock2をUpしたくない。」と。
>>799 逝って来ます。
みなさま、ありがとうございました。
ネットワークに逝って来ます。
strtokじゃ物足りなくなってきたので これを改良したものを作りたいのですが、 strtokのソースってどこにあるんでしょうか
何をする関数かわかっているなら、自力で作って、そこから改良するべし
>>801 って言うかスタティック変数使う関数なんぞ使うなよ・・・。
>>802 >>803 ありがとうございます。頑張ってみます。
>>804 それに不満があるから自作しようとしているのですが…。
(他にもありますが)
>>801 strtokよりもperlのsplitを流用した方良いかも。
807 :
デフォルトの名無しさん :02/07/18 20:58
ちょっと質問。 C で文字列の値渡しってできるの? int testfunc(char args[2][10]){ return 0; } int main(){ char s[2][10] = {"string1", "string2"}; int retval; retval = testfunc(ここがわからない); return 0; } ここでsをtestfuncに値渡しすることは可能? 「するな」とか言わないで。
sを構造体にしてしまうのがはやいとおもう。
809 :
デフォルトの名無しさん :02/07/18 21:02
>>807 > C で文字列の値渡しってできるの?
Cでは配列の値渡しを行うことはできません。
よって、文字配列である文字列の値渡しは不可能です。
ただし、構造体の値渡しは可能なので
文字配列だけをメンバにもつ構造体を定義し、
それを値渡しすることは可能です。
>>808 いや構造体にすればOKなのはわかるんだけど
ふと疑問に思ったから。
>>809 やっぱり不可能?
こんな感じね typedef struct { char s[2][10]; } Test; int testfunc( Test a ) { return 0; } int main() { Test a; strcpy( a.s[0], "string1" ); strcpy( a.s[1], "string2" ); testfunc( a ); }
813 :
デフォルトの名無しさん :02/07/18 21:17
お(=^o^=) や(=^O^=) す(=^。^=) みぃ(=^-^)/~~
はやっ
>>812 普通に書くときはそうやるんだけど
試しにtestfunc(char args[2][10])を書いて
コンパイルしたら通ったから
呼び出す方法があるのかな?と思ったの。
す な お に ポインタで受け止めろ。
>>815 それはchar (*args)[10]と同じ。
す な お に Pascalに移行しろ。
819 :
デフォルトの名無しさん :02/07/18 21:20
す な お に Perlに移行しろ。
す な お に VBに移行しろ。
こうして並べてみるとそういうことができる言語にはろくなのがないね。
>>821 じゃあほとんどの言語はろくなもんじゃなくなるじゃん。
>>822 ああそうだ。
C以外は糞だ。アヒャヒャヒャヒャヒャヒャ
す な お に Rubyに移行しろ。
>>823 Cプログラマってみんなこんなやつ?キモッ
なんか煽られてる?(w
>>816 sをポインタで渡したいときはどうするの?
なんか俺 どんどん厨な質問になっていくなぁ。
829 :
デフォルトの名無しさん :02/07/18 21:29
char [10]を要素にもつ配列へのポインタ。
831 :
デフォルトの名無しさん :02/07/18 21:36
もしコンパイラをつくったとして、それに付けるライブラリを作成するとき、qsortを再帰を使って書くのはまずい?
もう混乱してよーわからん。 char s[2][10] = {"string1", "string2"}; retval = testfunc(s); を受けるようなtestfunc()ってどう定義するん?
>>800 gethostnameはws2_32.dllにもwsock32.dllにもあるみたいだから
wsock32.dllのgethostnameを呼べばwin95でも動くかも(もちろん未確認)
834 :
デフォルトの名無しさん :02/07/18 21:41
>>832 void testfunc(char (*_807)[10])だっていってんだろうが。
835 :
デフォルトの名無しさん :02/07/18 21:42
>>832 testfunc(char (*p)[10])
testfunc(char s[][10])
testfunc(char s[2][10]) /* 2はコンパイラに無視される */
どれでも可です
char s[2][10] = {"string1", "string2"}; の時、sの「型」が何なのか、よく考えればわかると思うけど。
試しに書いてコンパイルしてきた。 int testfunc(char (*args)[10]){ printf("%s:%s",*args, *(args + 1)); return 0; } してみたらちゃんと表示されてた。 なんか頭の中だと(*args)が10個並んでるイメージだったから。 元のイメージではchar [10]が2個並んでるイメージで。 すまんな。
>>807 int testfunc(char **p)
>>763 さん
ありがとうございます。
>>getcharで一文字取り出したあとに改行コードがバッファに残るから、
>>getsでそれを呼んでしまい、getsで入力待ちにならない。
c=getchar();
printf("%c",c);
gets(ss); ←ボツ
printf("%s",ss);
両方使いたいんですけど残った改行コードをクリアする方法を
どうかみなさん教えてください。m(_;)m
>>838 > なんか頭の中だと(*args)が10個並んでるイメージだったから。
それはchar *args[10]
>>842 int c;
while((c=getchar())!='\n')
;
845 :
デフォルトの名無しさん :02/07/18 22:02
>>842 c=getchar();
printf("%c",c);
gets(ss);
gets(ss);
printf("%s",ss);
846 :
デフォルトの名無しさん :02/07/18 22:07
念のため int c; while((c=getchar())!='\n'&&c!=EOF) ; の方がいいか。
>>845 さん
わーい。
ありがとうございました。
おかげで文字列入力出来るようになりました。
俺は無視か(鬱
>>848 おれのほうは一行コピペするだけで簡単だからな。
気にすんな、ブラザー。
850 :
デフォルトの名無しさん :02/07/18 22:47
C言語の関数って、printfやscanfやせいぜいfopenくらいしか知らん。 関数を自作しまくり。 関数のリファレンスって、何かいいやつないかな。
>850 man
>851 manて何だよ。man womanかよ。
man printf って入力してみろ
>853 man 3 printf
>>855 だな。セクション1にもprintfがある。
fopenしてfcloseしない人ハケーン
>>850 www.holomorphy.com/~wli/doc/ANSI+ISO+IEC+9899-1999.pdf
859 :
デフォルトの名無しさん :02/07/18 23:03
多謝(ワラ
861 :
デフォルトの名無しさん :02/07/18 23:22
ねーねー。みんななんて読んでる? for フォー strcpy エスティーアールコピー malloc エムアーロック hoge ほげ
863 :
デフォルトの名無しさん :02/07/19 01:16
時刻Aと時刻Bの差の時間を、時・分・秒にするプログラムを教えてください。
865 :
ここは素敵なインターネット :02/07/19 01:37
みんなこれ理解できるかい? #include <stdio.h> char* hello(void) { return "hello"; } char* (*f1)(void) = **hello; char* (*f2)(void) = *hello; char* (*f3)(void) = hello; char* (*f4)(void) = &hello; /* char* (*f5)(void) = &&hello; これはエラー */ int main(void) { printf("%s\n", f1()); printf("%s\n", f2()); printf("%s\n", f3()); printf("%s\n", f4()); return 0; }
f1 と f2 はエラーにならないの? 環境は?
>>865 2つ疑問がある。
stdio.hをincludeしているのはなぜか?
helloの戻り値の型と、実際の戻り値で型が違うのはなぜか?
868 :
ここは素敵なインターネット :02/07/19 01:50
>>866 エラーにならないのだよ。どの環境でも。
>>867 >stdio.hをincludeしているのはなぜか?
printfを使うために必要ね。常識。
>helloの戻り値の型と、実際の戻り値で型が違うのはなぜか?
うーむ。もっと勉強しなさい。
>>866 &hello==hello (Cの関数ラベルに対する仕様)
hello==*&hello (当然)
よって
hello==*(&hello)==*hello
*hello==*(hello)==*(*hello)==**hello
同様にして
&hello==hello==*hello==**hello==***hello==****hello==(以下略
何故同じようにして hello==&hello==&(&hello)とはならないの?
&helloにおけるhelloと(&の付かない)helloは評価が違う。 (前者はLバリューで後者はRバリュー) だから&helloのhelloについてhelloから&helloへの置き換えは出来ない。
>>869 だから void (*pf)(void);
なんて関数へのポインタがあった時、
pf();でも(*pf)();でも(**pf)();でも(**********************pf)();でも
同じ関数を呼べちゃうんだよね(w
エキスパートCだっけか、あの本に出てて笑っちゃったよ。
そうだったのか……勉強になりますた。
>>872 でないと古い形式で書かれたソースが通らない。
昨日も書いたのですが、 C言語のプログラムのWARNING除去を行っております。 環境はGNUです。 ほとんどが、コメントアウトなのですが、 他のWARNINGの対処法がいまいち読み取れません。 参考になるサイト、本などはございますでしょうか?
コメントアウトして除去したら、 機能を果たさなくなるんじゃない?
ワーニングメッセージを書いてください
878 :
デフォルトの名無しさん :02/07/19 12:25
テキストファイルを開いてその内容を表示させるサンプル書いて下さい。
ワーニングメッセージは、 "suggest parentheses around + or -in operand of &" *(byPtr1 + 4 + 15) |= ((((BYTE)(U_HANDLE & 0x0f)) << 4) & 0xf0)
>>878 #include <stdio.h>
main(int argc, char** argv)
{
freopen(argv[1], "r", stdin);
while ( putchar( getchar() ) != EOF);
}
>>879 > *(byPtr1 + 4 + 15) |= ((((BYTE)(U_HANDLE & 0x0f)) << 4) & 0xf0)
*(byPtr1 + 4 + 15) |= ((((BYTE)((U_HANDLE) & 0x0f)) << 4) & 0xf0)
これでも消えるとは思うが、
おそらくマクロと思しきU_HANDLEを()で括った方がいいと思われ。
つーか加算式そのまんまマクロにするようなヴォケは逝ってよし。
>875 コメントアウトしてるって何を?
ありがとうございます。 もうひとつ! "array 'name' assumed to have one element"
ソースの関連する部分出せよ。
inttp_keiyu_tbl[]; これなんです。 ところで>881さん どういうワーニングメッセージなんですか? 直訳とは違うような・・・。 みなさんすみません。
886 :
デフォルトの名無しさん :02/07/19 14:20
誰か教えてください。 for(i1=0 ; i1<50 ; i1++) { printf("<%d>", data[i1]); } で、data[0]からdata[49]全体の値(つまり50個の値)とある一つの値とを 比較する方法ってありませんか? よろしくお願いします。
for (i1=0;i1<50;i1++) { if (data[i1]==比較したい値や変数) { break; } } if (i1==50) { 全部一致; } どこかが不一致;
>885 どーゆーって、つまりだな。 600+5&0x0f という式があるとするわな。 これは演算子の優先順位からいって(600+5)&x0f なんだが、ひょっとすると、優先順位を間違えてて、 ホントは600+(5&0x0f)とやりたかったのかもしれない。 だから、紛らわしい式には()を付けて明らかにしろよ、 ちゅうことなわけよ。
昔は無駄な括弧を付けるなと怒られた物だ…
890 :
デフォルトの名無しさん :02/07/19 14:36
>>887 ある値を50個の配列リストに入ってるかどうかです。
だから、1つずつ比較するのではなくてってことです。
誤解をまねいて申し訳ありません。
そんな方法ありますかね?
>>887 は==じゃなくて!=な。
>>890 それは単なる探索の問題じゃないか。
一つずつ比較して、一致があった時点で終了すればいい。
lnl.batを押して、 修正したファイルだけをコンパイルかけているのですが、 DOSプロンプトにエラーがいっぱい表示されてしまいます。 1画面ずつ表示したい場合、どのような手順を とればよろしいのですか?
>>889 そりゃお前んとこだけだよ。BASIC って言うなら話はわかるが...。
895 :
デフォルトの名無しさん :02/07/19 16:37
896 :
デフォルトの名無しさん :02/07/19 17:01
この条件式を短くできないものか? if(data[x][y]!=41 && data[x][y]!=42 && data[x][y]!=51 && data[x][y]!=52 && data[x][y]!=6)
>>896 他の変数にdata[x][y]を代入しておいてそれと比較する。
>>894 余計な括弧を付けると、演算子の優先順位をしっかり覚えていない証拠だとか言われて、
括弧を省くように言われていたんだが。10年近く前の話だけどね。
899 :
デフォルトの名無しさん :02/07/19 17:24
>>898 なんか、もうだめぼな会社/先輩としか思えない。
いずれにしろ、そう言うこと言ってんのはお前んとこだけだから、もうで
てくんなよ。
900 :
デフォルトの名無しさん :02/07/19 18:00
for( red = 0 ; red <= 255 ; red++ ) { printf("#%X0000\n",red) ; } redが15以下の時でも%Xが二桁になるような変換文字はないのでせうか
>901 どうもです
>>902 おまえはヘルプとかmanとかを見る習慣は無いのか。
904 :
専門士 ◆.t4dJfuU :02/07/19 21:50
C言語だけで、パチ屋にあるようなスロットゲームって作れますか?
このサイトにはトヨゾウの被害はありませんか
906 :
デフォルトの名無しさん :02/07/19 22:03
>>903 うるさいボケ。
ちゃんとここのヘルプの奴らを利用してやったじゃないか
役に立ってよかったと自己満足でもしてろ
ヘルプの奴らか。
909 :
デフォルトの名無しさん :02/07/20 00:17
>>896 if (!strchr(")*34\6", data[x][y]))
911 :
デフォルトの名無しさん :02/07/20 01:23
8進数は3桁だよな・・・
>907 絶対出てくると思った(ワラ >903 マジレスすると、ヘルプファイル無い&man知らんかったです とりあえずmanが何かは分かったので気付けます つーか漏れが持ってる本には%02Xとか載ってなかったんだypヽ(`Д´)ノ
914 :
デフォルトの名無しさん :02/07/20 01:57
>>913 初心者過ぎる本には載ってないことが多い。
さらにいうなら、formatは
%<<digit>><<l or h>>type
という形を覚えておくといいかモナー。(ほんとはもっと複雑だけど)
>>908 スマソ、ワロタ。
哀愁漂ってる(;´Д`)
あのー、質問なんですけど、 以下のファイルがありました。 @カンマ区切り(CSV形式)のデータが格納されているファイルで、 Aレコードの区切りに改行コードがなく、全レコードが物理的な1レコードで構成 このようなファイルを、固定長の構造体に格納するには、 どうしたら良いのでしょうか? 以下の2点を考えてみましたが、どちらもイマイチです。 案1)レコードの区切りが無いから、一定サイズずつ読み込んで、 ごりごり構造体に格納して、格納しきれなかった分は、 領域の先頭に持ってきて、その後ろ分のデータをまたreadする。 (これは効率悪そうだし、テストが面倒だし、バグ多そう) 案2)fscanfを使って、カンマ区切ごとに構造体の各要素にreadする。 (これも、1項目の内容に空白があった場合、次の項目としてみなされ てしまうので名称等の項目はNG。) なれないC言語で、しかも開発要因が一人で、期限も厳しいのでどうか お助けください。
全部読みこむかmapして memchrなどで区切りを探し memcpyでコピーする ただし、ファイル全体が読みこめるアドレス空間があることが確実な場合のみ
要素数が決まっているのならfscanfでいいと思うけど。
919 :
デフォルトの名無しさん :02/07/20 08:56
1から99の乱数を生成したいんですけどどうやるんでしょう?
rand()*99+1
rand()%99+1
srand(time(NULL)); rand() * 99L / (RAND_MAX+1L) + 1
x = rand_from_1_to_99();
>>885 > inttp_keiyu_tbl[];
これはexternもついてないし、関数の引数でもないんだよな?
Cでは空の配列ってものは定義できないから、
「とりあえず要素が一個あるものとみなすよん」
という警告。
>>879 の意味は
>>888 氏の解説してくれた通り。
で、
>>881 の後半の意味は、たとえば
#define U_HANDLE 1+0
なんてなってたときに U_HANDLE * 100 とかを考えてみれば分かるだろう。
基本的に、マクロ式やマクロの引数は、式のどこに置かれても意味が変わらな
いようにカッコをつけるべき。
925 :
デフォルトの名無しさん :02/07/20 10:49
(rand() >> 8) % 99 + 1
99面のサイコロをほうり投げる。( -∀-)ノ ◆
◆←6面ダイス ●←99面ダイス
>>927 100面ダイスってまだ売っているのだろうか?
懐かすぃ。
int kaesuyo_ransu(void) { getchar(); return (time(NULL)%99)+1; }
static unsigned Ransu; void initRand(unsigned u){ Ransu = u; } unsigned uRnd(void){ Ransu = Ransu * 0x343fdL + 0x269ec3L; Ransu &= 0x7fff; returnRansu; } main(){ int x; initRand(1 | time(NULL)); x = 1 + 99 * uRnd() / 0x8000; }
VC++6.0のrandはRAND_MAXが小さすぎ。
>>928 100面ダイスってほとんどジョークグッズだよな
10面ダイス色違いで2ケ振ったほうがよっぽど実用的だと当時から思った。
% 演算子ってdoubleには使えないの?
使えない。
残念。ってよく考えたら当然か・・・ 最下位の桁を得たいときみんなどうしてるのかな? 整数なら%10で簡単に得られるよね。 普段小数使ってなかったから学校の宿題困ってます。
(int)でキャストしる。
938 :
デフォルトの名無しさん :02/07/20 15:46
>>935 char s[32];
double f;
int result;
f = 123.45
sprintf(s, "%f", f);
result = *(strchr(s, '.') - 1) - '0';
本気にすんなよ(w
939 :
デフォルトの名無しさん :02/07/20 15:54
void main (void)と main はどう違うんですか?
>>936 doubleの範囲で値がとれるようにパワーアップせよ、みたいな問題だったので・・
>>937 さすがCライブラリなんでもあるなー。車輪の再発明するところだった。
>>938 あはは。いいですね。全部標準関数だし。
937さんの方法でやってみます。みんなありがとー!
>>939 void main(void)とmain()では?
意味はいっしょだと思うけど、なんか古い人は前者の書き方するみたい。
私がCを始めた頃はちょうどvoidって導入されて
void使う方がいい書き方って本で習ったけど・・・
>941 そんなクソい本は投げ捨ててしまえ。
>>941 voidが導入されたのってANSI draftあたりからだろ?
> void使う方がいい書き方って本で習ったけど・・・
なのにこれか? そんな本捨てちまえ。つーか書名/著者は?
>>941 いや、全然違うよ。
戻り値を省略するとintになる。
だからmain()はint main()と同じこと。(奨励はされないだろうけど)
void main(void)はダメでしょ。引数のvoidはともかくmain()は値を返すべき。
>>942 , 943
ああmainの話じゃなくて引数です。省略しないでvoid書いた方がいいと。
>>944 , 945
そうなんですか。省略したことがないので知らなかった(w;
もちろんmain()はいつもintかえしてますけど。(make とか困るので)
こことかニュースグループとか、niftyのFCなんかも含めて、ネット上で これだけ言われてるのにいまだにvoid main()と書いてる本があるという のはある意味すごいな。
void main()なんざ知ってるかどうか、の問題だろ。 本質にはまったく関係ない。 こんなので初心者呼ばわりするのは正直カコワルイ
初心者呼ばわりしてるんでなくて、本の話でしょ?
main関数の構文は以下の通り。 int main(int argc,char **argv); もしくは int main(int argc,char **argc,char **envp); 多少とも意味のあるプログラムを造るのに、argcやargvを使わないことは考えられない。 また、main関数は、終了ステータス(正常終了、異常終了)を返す必要があるため、 戻り値を必要とする。以上。
>>950 >argcやargvを使わないことは考えられない。
どうします?これ。
953 :
デフォルトの名無しさん :02/07/20 17:41
>>950 envpは規格外。
int main(void)かint main(int argc,char *argv[])。
>>952 ほっとけば? 必要ないときだってあるんだし。
とりあえずうちのエディタは main C-l と打つと
int main(int argc, char **argv)
{
}
まで入力してくれるんで、argcとargvがいらないときでもつけてる。
あっても害はないしな。
warning levelあげたら文句言ってくるコンパイラがあるかもしらんけどな。
そんときははずすわ。
Cから勉強したいんですけど とりあえずボーランドC++ビルダー6購入しました。 インストールしたまではいいんですけど #include<stdio.h> main() とかやるには一体どうしたらいいんですか? 教えてください。
>>957 6は持ってないからわからないけど、新規作成でコンソールウィザードって無い?
IDE使わないでbcc32使ってもいいけど。
それより、くれ。
959 :
デフォルトの名無しさん :02/07/20 18:51
960 :
デフォルトの名無しさん :02/07/20 18:54
処理の高速化とメモリーの消費量(使用量)削減はどちらを優先すべきですか? ものにもよるでしょうけど、一般的にということで。
961 :
デフォルトの名無しさん :02/07/20 18:55
>>955 新規作成にある項目すべて試せばわかるよ。
>>955 まだユーザー登録していなかったら、アンインストールして俺にくれ。
一般的には、dでもなく遅かったり、 dでもなくメモリ喰ったりしないかぎり、 好きな方を選べばいい。
>>962 あふぉか、俺は質問に答えたし最初にくれと言ったのも俺だ。
>>955 お れ に く れ
>>963 そうですか。
今、ある機能を持った関数を書いていまして、2つ書いたんですけどどちらを取ろうか迷っていたんです。
じゃあ消費目盛りの少ない方を取ろうかな・・・コードもすっきりしているし。
両方とも満たすコードをかければいいんですけどね(^_^;)
目盛りじゃないメモリー(^_^;)
970の人、次スレよろしくね
>>959 あっ、メモ帳に書くんですか!?全然知りませんでした。
>>961 そすですよね。でもそれはかなりめんどくさそうです。
>>962 もうユーザー登録してしまったと記憶しています。
>>964 もっと教えてください。
なんで市販のBCBなんて買っちゃうかな〜
970 :
デフォルトの名無しさん :02/07/20 19:10
>>965 一般的には早い速度もメモリ消費もさほど考えずに、
すっきりとしたコードを書くことを心がけたほうがいいと思うぞ。
勿論あまりにもメモリを消費しすぎたり
(今現在だと100MBの配列をどんと取るのはよした方がいいと思う)
非常識に遅いアルゴリズムを使ったり(バブルソートとか)
するのはよくないけどな。
プログラムはまず正しく動くことが重要で、
それから性能に問題があれば最適化していくとよい。
すっきりとしたコードは大抵最適化しやすい。
悪くない選択だ
>>970 次スレよろぴく〜。ビシっとしまる名前で頼むよ
974 :
デフォルトの名無しさん :02/07/20 19:14
>>973 逝ってくる。
びしっとしまる名前か。どんなのがいいだろうか。
>>969 やっぱりフリーコンパイラを使うべきですか?
でもダウンロードしたんですけど
パスの設定でつまづいて購入に至りました。
>>970 購入しても、捜査がわからず、
ボラれた気分で日々を過ごしています。
>>975 よし!元は取らにゃぁな。
今から本屋で「やさしいボーランドC++の使い方」とかいう本を買ってくるんだ。
それでも駄目だったら「初心者でも分かる『やさしいボーランドC++の使い方』」を
買ってくる。それでも駄目だったら・・・
979 :
デフォルトの名無しさん :02/07/20 19:21
980 :
デフォルトの名無しさん :02/07/20 19:24
1000ゲトー\ \∧_ヘ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧∧ ≡≡.\ / \〇ノゝ∩< 1000取り合戦、いくぞゴルァ!! (゚ー゚*) 、 ≡≡\ /三√ ゚Д゚) / \__________ O┬Oc )〜≡≡\/三/| ゚U゚|\ \オーーーーーーーッ!!/ (*)ι_/(*) ≡≡\ ∧∧∧∧∧――――――――――― ――――――――――< 予 合 千 > __〃 ヽ lv い、今だ1000ゲットォ!! < 感 戦 取 > ヽ\ .ノノノ)ヘ))〉ヽ' / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ .∧ ∧ =- <. !! の り >_!(0.)! (┃┃〈リ / < はわわー。1000げっとです〜 (゚Д゚;) ≡=- /∨∨∨∨∨\ Vレリ、" lフ/ ./ \ \________ ⊂┯⊂) ≡=- / 1000 ∧_∧\――――――――――― (ヽ\ ヽ ) ≡=- / ゲット ( ´Д` ) \今だ!1000ゲットォォォォ! し\J =- / しますた /, / \ ∧∧ ) ズザーーーーーッ (( ̄(◎) ≡=-/ (ぃ9 | \⊂(゚Д゚⊂⌒`つ≡≡≡(´ ;;;≡
>>976 マニュアルは決して初心者に向けたものでは
ありませんネ。
やっぱり苦労して読むべきでしょうか?
>>977 じゃあ明日本屋へ行ってきます!
記念パピ子川-_-川
記念パピ子川-_-川
__stdcall とか _cdecl とか、関数呼び出し規約が一つの規約に統一 されていないのは何故なのでしょうか。逆に言うと、なぜ規約が複数 存在するんでしょうか。
効率とか互換性とかいろいろ。 WINDOWSにおいて__cdeclが標準でないのは、 コードサイズの縮小のため。 わざわざ処理系に__cdeclが用意されているのは、 可変長引数を実現するため。
>>985 _cdecl 可変個の引数を取り、呼び出し側でスタックを回復する。
_stdcall 固定個の引数を取り、呼び出された側でスタックを回復する。
1つの関数が何回も呼び出されるケースでは、_stdcallの方が全体のサイズが
小さくなり、動作も速い(だったはず)。
WindowsのAPIの場合、おおかた_stdcallで wsprintf() などの可変個の引数をとるものだけ、
_cdecl だったはず。
985
>>986-987 さん
可変長引数を実現するのが _cdecl だったんですね。
呼び出し規約がサイズに影響することも知りませんでした。
ご解説ありがとうございました。
あと11!!
余裕の990get
埋め立てると見れなくなるのでコソーリ沈ましておこう・・・しばらくは。
992 :
デフォルトの名無しさん :02/07/21 17:35
ヽ(´ー`)ノ埋め立てないと間違ってこっちに質問する人が居る罠
>>992 つってわざわざアゲて間違えたらどうすんだ、ホゲ
994 :
デフォルトの名無しさん :02/07/21 20:12
>>993 ヽ(´ー`)ノ言ってる間に埋めろヴォケ
1000
100
10
1
1000 :
デフォルトの名無しさん :02/07/21 20:27
aye
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。