1 :
デフォルトの名無しさん :
03/02/25 01:41
保守
DLL化した関数の返り値ってreturnで返す値でいいんですか?
>>9 DLLはスレ違いかもしれんが・・・
それで良いと思われ。
//.|
//./.|. / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
//./ | | | すんません。すぐ処分しますんで・・・・・。
//./|/.| .| \_ ______________
□/ / //| |. |/
| |/.;;;;//. | ||. ☆
| | ;;;;;;// | ||| l⌒)=|ニ二フ
| |.;;;// | |.|| ∧.|.∧
. ∧ ∧ | |.//☆. | | ||. ( ・∀・)
( ・A・).| |/. | |. || | ) ワイワイ ガヤガヤ
__( ).| |___. | | || __.| | |____
| | | | |. //.| ̄ (__(__). /.| ∧_∧ ∧_∧ ∧ ∧
(__)__)| |. // |. //| (´-`;)(@・ )(;´∀)
| |.//∧ ∧|<ぬるぽォァァ / | ∧∧ ∧ ∧ ∧_∧ ∧∧
(..| |/ (;´A`) ←
>>12 .// | (∀・ )(ー゚* )( )(´∀`
(⌒ .| | / ̄ ⊂.⊃. .// / ∧_∧ ∧ ∧ ∧ ∧. ∧_∧
∧ ∧ | | / └─┘// / (´・ω)(д゚` )( )(
( ・A・) | |/ .// / ∧_∧ ∧ ∧ ∧_∧ ∧_∧ ∧
( ) ~~ // / ( )( ゚∀゚)(` )( )(゚д
. | | | // / ∧_∧. ∧_∧ ∧_∧ ∧_∧ ∧_∧
(__)__) // / (д- )( )(*゚ー゚)(TдT)(∀`
∧_∧ ( ´∀`)< ぬるぽ
キョウハタイリョウダナ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >.__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>14
18 :
デフォルトの名無しさん :03/02/25 07:58
long double と long float はどうちがいますか?
20 :
デフォルトの名無しさん :03/02/25 09:17
struct bitset { unsigned int flag1 : 1; unsigned int flag2 : 1; unsigned int flag3 : 1; ... }; というようにビットフィールドをセットしたとき、 変数iをインデクスにしてi番目のflagにアクセスすることってできますか?
#define setbit(a,i) (a.flag##i = 1) #define clrbit(a,i) (a.flag##i = 0) #define testbit(a,i) (a.flag##i == 1) ただし、iは定数。 ...要求条件を満たさないようだな。 変数でアクセスしたいなら、素直に #define setbit(a,i) ((a)|=1<<(i)) #define clrbit(a,i) ((a)&=~(1<<(i))) #define testbit(a,i) ((a)&(1<<(i))) とか。
つーか、各ビットに名前をつけたいのでなければ、 ビットフィールドを使う意味って無いでしょう。
お前らいい加減にC++に移行しろ(-_-;)
未だにCにとどまっているヤシは、多分Cを覚えたてで、他人に 教えてみたくてしょうがないんだろう。
>>24 >>25 Cで書かれたオープンソースのプログラムは腐るほど有るわけだが、
そいつらに云ってみたら?
取りあえずLinus, RMSあたりからでも。
適材適所
わざわざCスレに来て自分がC++を知っているという取るにも 足らないことを話したがるようなヤシは、多分C++を覚えたてで、 他人に教えてみたくてしょうがないんだろうね。
c++に移行しろって言っている奴に限ってクラスの設計が小汚いんだよな。 優秀なcプログラマはそれなりのc++プログラマになれるけど 使えないc++プログラマは似ても焼いても食えんぞ。
てか、他所でやれや
言語よりもパラダイム。
くそっC++スレがイマイチ盛り上がりに欠けるのは、ユーザーの 絶対数がまだまだ少ないからだ。
馬鹿ユーザー増やしてもしょうがないから、このままで良いよ。
C++ で Cライクにプログラミングすればいいのでわ。 無理してクラスや STLを使わなくてもいいわけだし。
>>36 そうそう、それで structキーワードは忘れずにつける、これ最強。
CコンパイラでコンパイルできるようなプログラムはC++で書いたとはいわん。
ソースの形式だけC++で内容はCってことが多い
C++の機能は関数のオーバーロードだけ使っています。
C++で書いたと宣言する必要はないよ。Cで名前の衝突考えたり 甘い型チェックでふらふらしたコードを書くよりメリットある んじゃないかということ。
(´-`).。oO( スレ違いとわかっている雑談を何故続ける? )
>>42 多分そろそろCからC++に移行したがっているヤシが少なからず
いるからと見た。
そして失敗してCに戻ってきたヤツも何人かいると見た。
じゃ、ベターCも取り扱い対象にしよう。
>>45 それ(・∀・)イイ!!
C++スレでベターCについて書くとスレ違いと叩かれるからね。
>>45 それ(・∀・)イイ!!
専用スレ立てると糞スレ立てるなと叩かれるからね。
早速で悪いんだが、C++ではプロトタイプ宣言は必須になったが、 Cでも必ずするべき?
49 :
デフォルトの名無しさん :03/02/25 15:29
>>48 しなければならないわけではないけど、するべき。してくれ。しろ!
>>49 サンクス。必ずするようにするよ。
ところでベターCの質問なんだけど、C++ではvoidのreturnが
許されている。こういうコードは書いても精神衛生上大丈夫
だろうか?
void func1()
{
}
void func2()
{
return func1();
}
うーん。 C++ではなくCを「敢えて」選ぶ理由は ・ツールやデバッガのサポート。 ・移植性。組み込みだの古い環境だの。 ・ぐちゃぐちゃなABIがいや。asmやFORTRANともリンクしたいんだい。 ・今だに標準に追いついてないコンパイラがゴロゴロしてる状況で 一々対応状況までおっかけてコーディングしてられない。 ・何となく禿が嫌い(w。ガーベージコレクトもサポートせず コンパイル時に型が決まっちまうような半端なオブジェクト指向言語 なんぞ使ってられるか。 のようなものだったりするんではないかと思うので、C++を ベターCとして「しか」使わないんなら単純にCで書いた方が遥かに メリットがでかいと思うのだが。
やれやれ・・・
MFCがC++だから、嫌々ながらC++に移行した。まだまだC++を 「使いこなせて」いるわけではないが、もうCには戻れない。
Cも大した事無いのにね。
お前等いい加減 Ruby に移行しろ(^ε^)-☆Chu!!
>>51 典型的なCの”信者”だな。
C++にもいい点はあるのに・・・・・
新しい言語を学習する事を嫌がる怠慢なプログラマの言い訳のための 言葉になってしまっている気がするのは筆者だけでしょうか。
>>57 別にC++を否定してる訳でもなんでもないよ。C++をベターCとして「のみ」
使うのは無意味(それぐらいならCで書いた方がよっぽどいい)と
云ってるだけ。
C++のメリットを(ほとんど)享受できず、負債のみを負うことになるからね。
> ・移植性。組み込みだの古い環境だの。 コレと > ・何となく禿が嫌い(w。ガーベージコレクトもサポートせず〜 コレを同列に置かれても
>>60 まあ下のは筆がすべっちゃっただけということで。
つい、いつもの煽り癖が...(w
>>59 えーと、stringは?舐め空間は?関数のオバーロードは?ディフォルトパラメータは?
cを長く使ってきた私にとっては、 ・構造体とアクセス関数をクラス化したい。 ・構造体を同じように取り扱うことが多いのでテンプレートも使いたい。 ・特殊なクラスには演算子オーバーロードしたい。 からc++に移行したいのだけど、 ・cで納品と言うしょうもない契約や、 ・cしか読めない他社との共同作業だったり、 ・既存のライブラリがcで書かれていたり、 するのでなかなか移行できません。 #でも一部ライブラリは内部をc++で書いて、cから呼べるラッパを作ったけど。
64 :
デフォルトの名無しさん :03/02/25 16:26
Cを初めて2日くらいなのですが、とりあえず超初心者はこれを作っとけっていうのってありますか? BCCでCpadっていうのを使っています、エディタはお勧めのものとかあれば教えていただきたいのですが…
edit.com
>>62 チミは一体どこからどこまでを「ベターC」と云っとるのかね。
俺の個人的な見解では
・std C++ライブラリ(特にSTL)を駆使するようなプログラムは既に
better Cの範疇ではないとおもう。STLなんて簡単なんだし
C++の中では費用対高価が圧倒的に高いコンポーネントだから
使える人はバシバシ使ってとっととC++に移行すればよいと思う。
・後ろの三つは「あれば便利」程度の物であって、C++化によって
発生する負債(
>>51 参照)をカバーするには足らないと思うね。
無論
>>51 のものが全て負債とは感じない人であれば、何も問題
ではない。
・ABIだけを気にする人であれば、extern "C"である程度解決する
ことは書いておこう。ただし、一般にC++コードを実行するには
Cよりも遥かに多くの複雑なランタイムサポートやスタートアップ
コードを必要とすることは知っておくべきだろう。
例えばDLLを例に取ると、libcに一切依存しないものの方がいいに
決まっている。Cでそのようなものを書くことは簡単だが、
C++でそれをすることは困難だ。ATLにはCRTに最小依存するための
コンパイルオプションが有るのだが、設計ミスのせいで事実上
役に立たないものになってしまったように思う。
>>65 飛んだのですが、わかりませんでした、ごめんなさい
>>64 Windowsでお勧めはPeggyかXyzzyかVivi。
#これでemacs派もvi派も安心w
Cを始めて2日でも、プログラミングの経験が豊富なら構造体やポインタを
多用するプログラムでも作ってみればいいと思う。
プログラミングも始めて2日なら……先ずはプログラミングの勉強だね。
はああ、ウンチク君の登場か。
>>68 ありがとうございます、peggy使ってみます。
プログラミングは、VBしか触ったことがないので…
>>51 いちいち細かい事グチグチ言うな。
stringくらい使わせたっていいじゃねいかよ。禿。
流石にCスレでわざわざC++の話を持ち出したがる奴は低レベルのが多いな....
取り合えず
>>28 が真実をついてるってことで。
具体的な、こんなプログラム作れって言ってもらえると嬉しいのですが・・
さいたまがダンスするプログラムを作ってくらさい。
>>64 方向は二つ。
・GUIをバリバリ書きたい。
私は門外漢なのでノーコメント。
・GUIはどうでもいいからプログラミング技術を磨きたい。
標準入出力を使った、簡単な集計プログラムはどうだろうか。
デバッグも楽だし、テストデータはテキストファイルが使えるし。
最初は行数のカウントし出力、次に行から数値を読んでその合計を出力、
計算系に進化するなら平均を出すとか標準偏差を出すとか。
データ処理系に進化するなら単語数を数えるとか行をソートするとか。
#unixで言う、wcとかsortだね。
>>64 テキスト(ソースファイル等)を読み込んで、行を逆順に出力
するプログラムを作ってみれ。
俺は初心者だった頃、いかに効率よく実装するかでいろいろ
試した記憶がある。
>>76 Cだけでグラフィックできますかね?GUIより今はプログラム技術を磨きたいです
テキストファイルから文字(数字)を抜き出して
ソートや平均値を出すなどのプログラムということでしょうか?
やってみます
>>64 「Software tools(ソフトウェア作法)」のプログラムをCで
書いてみるとか、もいいかも。
例がRatforというFORTRAN用プリプロセッサ言語で書かれているんだが
FORTRANなんぞ知らなくても読める。まあ、古い本なので汎用機
の時代のことを聞きかじりでも知らないと、何を云ってるかわからん
部分もあるかもしらんが、非常に示唆に富んだ名著であることには
間違いないよ。
81 :
デフォルトの名無しさん :03/02/25 18:01
MS-DOS上で動くフリーのCコンパイラってありますか。
LSI-C 試食版、djgpp
peggyってインストール必要だから敬遠してたけど、どのへんが使える?
edit2.exe 最高
>>76 ,77,80
すみません、まだポインタすら使えませんでした
勉強しなおしてきます
>>86 釣りだったのか?(w
それはともかく、「ポインタが分からない」人は経験的には
ポインタではなく「変数」が分かっておらず、さらに云えば
計算機についての基本的な理解が足りていないことが多い。
その辺から見直してみ。
89 :
デフォルトの名無しさん :03/02/25 19:23
char a[2]; a[0]=100; a[1]=200; (100=16h,200=C8h) これをshort型として16C8hみたいな感じで取り出すにはどうしたらいいですか? お願いします
sprintf(s,"%X%Xh",(short)a[0],(short)a[1]);
shortにキャストしても、可変個の引数リストだからintにされちゃうけどね。
あ、もしかしてcharの配列をshortとして見たいの? じゃあ short sh; char *a=&sh; a[0]=200; a[1]=100; こうすれば?ビッグエンディアンなら代入する値を逆にして。 (sizeof(short)==2とは限らないんだけど・・・)
>>89 ((short)a[1])<<8 | a[0]
こういうの unsigned でない char のまま計算するの気持ちわるいな
どうせ環境依存だし、いいじゃん
>>93 境界あわせの問題とか大丈夫?
shortならいいのかな・・・
CCLemon飲まないの?
98 :
デフォルトの名無しさん :03/02/25 20:00
今までVBをしていました。 今度、Cを覚えようと本を買い勉強を始めました。 コンパイラをボーランドからDLしましたが 無償のコンパイラは、MS−DOS上しか使えないんでしょうか? ボタンとかテキストBOX等の使用は、全てソースを書かないと だめなのでしょうか。 もし、同じプログラムを組むとしたら、VBの何十倍のステップが 必要ですよね。 visualC++で勉強したほうがよいのでしょうか?
え〜とっ、VB教えて下さいw
>>98 Cの勉強にGUIプログラミング(?)はやめた方がいいよ。。。
>>98 おいおい、VBやってるナウなヤングならC#だろ?
102 :
デフォルトの名無しさん :03/02/25 20:08
a[100]="abcdefg"; を b[]="abcde"; //(先頭からn文字) c[]="fg"; //(残り) みたいに分割するのに,一番負荷の小さい方法はどうすればよいですか?
>>102 strncpy(b,a,5);
b[5]=0;
strcpy(c,a+5);
104 :
デフォルトの名無しさん :03/02/25 20:23
>>101 98ですが、C#を覚えたいのですが、いきなりするより
Cをある程度覚えてからC#に移行しょうと考えたんですが
遠周りでしょうか?
>>104 C++はともかく、C#ならC#から勉強した方がいいよ。
名前欄に「C#知らないけど(ワラ」と書いたらトリップになっちゃった(鬱
ふむ?
>>103 恐れ入りました m(_ _)m
strcpy(c,a+5)
が思いつかなかったです。
test
これでいいだろ
112 :
デフォルトの名無しさん :03/02/25 21:23
すいません教えてください。 例えばなんですが、配列を動的に取る場合などに 関数を使ってサイズを取るのと一回数値型に代入してからサイズを取るのって プログラム的にはどちらがスマートなんでしょうか? ex1. int length=strlen("length"); char str[length]; ex2. char str[strlen("length")];
>>98 ボーランドの無償コンパイラをMS-DOS上で動かす方法を教えて下さい
DOSモードとはまた。
>>112 文字列リテラルならsizeofを使えば?
つーかどちらもコンパイル通らないだろ(C99はしらん)。
コマンドプロンプトとかをMS-DOSとか言う奴の発想だと、 LinuxやらPC-UNIXもMS-DOSになるのかな?
んなわけねーだろ MS-DOSプロンプトじゃ長いから略してMS-DOSって言うんだよ。
どぷろん
121 :
デフォルトの名無しさん :03/02/25 22:30
コマンドプロンプト(MSーDOSプロンプト)だよ。 MS−DOSって何? 117さん。
分かりやすくて、キーボードで瞬間的にシステムをオペレートできる 世界最強のOS
「超漢字」のことか。
PC-DOS >>> MS-DOS
これが ゼネレーションギャップ というやつか…
おまえら そ ろそろアセンブラに移行 しろ や。
HTTP/1.1 304 Not Modified (・∀・)新着ナシ
>>128 この板に来る奴がそんな厨房ツール使うなよ。
いいじゃん。便利なんだから。
65816 のCコンパイラはありますか?
72289のCコンパイラってある?
804860のCコンパイラってある?
7401のCコンパイラってある?
お前らいい加減に6943に移行しろ(@_@*)
3.14159265358979のCコンパイラってある?
ある
65816(SNES?)以外判らないけど、なんのCPUですか?
やはりモトローラの68000系が最高だろう。
やっぱDEC Alphaだろう。
0x00を含むバイト列を文字列として操作(strlen、strcpy等)することは不可能ですか?
ううん。
いってみれば通常の文字列も0x00を含むバイト列だな。
∧_∧ ( ´∀`)< ぬる
ぽ
文字列の「途中に」含む場合。
ニヒキマトメテ
| | ガガッ .
( ・∀・) | |
と ) | |
Y /ノ .人
/ ) .人 < >__Λ ∩
_/し' < >_Λ∩Д´)/
(_フ彡 V`Д´)/ / ←
>>145 / ←
>>146
キーボードからの入力モードが挿入か上書きかのアレはアプリケーション毎に管理するものなのですか?
NULLPOinter
文字列の途中にナルキャラ('\0')を挟みたくても
ナルキャラでターミネートされてしまって文字列として取り扱えなくなる罠。
>>142 ってことで、0x21 0x22 0x00 0x23 0x00 なるバイト列があったとして、
その先頭をpが指していたとする。その場合、
strlen(p)は2を返すし、strcpy(どこか, p)も2バイトしか転送しない。
つか、「文字列」という言い方をしたら'\0'までを指すと思われ。 '\0'以降にも有効値がある場合は文字(型)配列値。
lpsz?
SZって何の略?
String terminated by Zero の略らしい。 こんな情報変数名に要らない。。
いや、いるません!
unsigned long ul; として 何処かで if( ul == -1) が真になることってある?
>>157 ハンガリアン記法だったかな?
MFCとかで多用される表記法で、変数にsz_hogehogeとか名前つける。
漏れは、こんなの嫌いだからやらんけど。
>>158 なったよ!
ul=0xffffffff;
if( ul == -1)
printf("aaa");
unsigned long ul = -1; if (ul == -1) { puts("ul == -1"); }
ああ、もう、ハンガリアンダンスは余所でやってね。
ポンターはハンガリアンだろ
狸がどうしたって?
>>160-161 てぇことは、
unsigned long と -1 を比べた時に
やばいことになるのかな?
unsigned long ul = 0xfffffffe;
if(ul < -1)
printf("んなアホな!");
あっ ポインターでした。
-1 が unsigned long に格上げされて正の値になって ul と 比較されるからそうなってしまう。
>>166 ポンターさんという有名なハンガリー人がいるんだろうな、きっと
などと勝手に納得していたおれの立場はどうなる。
ハリー・ポンターと雲の王国
キーボードが挿入モードか上書きモードかを知るにはどうしたらいいて゛すか?
>>170 それはCの問題ではない。OSの問題だ。
綱引きOS! OS!
オーエスオーエス オーエスってなんやー?
Oh! Yes!
>>171 それはOSの問題ではない。アプリケーションの問題だ。
scanfやgets等の標準入力(リダイレクトしない場合)のキーボード入力の仕様は標準で決まっているのですか? カーソルキーは対応無しで^H(BS)で1文字削除のみ、編集機能無し、ですか?
>>176 少なくともCの仕様にはキーボードなんてものはない。
標準入力は規定されているけど、それがなんなのかまでは規定されていない。
標準入力とは、キーボードを指す言葉ではない。 それがどこに繋がっているかは(ハード的には)全く頓着しない。 なので、キーボードではなくシリアル回線で外部に繋がっていても全く問題がない。 また、ファイルから入力する場合も多いだろう。 ファイルから入力する場合、カーソルキーやBSキーにどんな意味があるというのだ。
kbhit
>>136 πの小数点以下の14桁って麻雀であれば上がっている形なのですねw
11 234 555 678 999
(3.)14159265358979
なんでこんなこと考えてしまうんでしょ
>>21 遅くなったけどありがとうございます。
じゃ、やっぱり普通の論理演算の方が柔軟性があるわけですね。
基本的にマクロは引数を複数回評価するように書いてはならないんだよね。
185 :
デフォルトの名無しさん :03/02/26 10:53
「Windows起動と同時(できれば)にパスワードを要求し、 それが間違いならあるプログラムを自動的に起動する」 っていうプログラムってCで作れますか? ご教授お願いします
多次元配列を動的に確保したいのですが、 自分で作ったやつはちゃんと動くものの確保に時間がかかりすぎて困ってます。 要素数分だけmallocを実行しているのですが、そんな必要はないと思いつつも、 適切なアルゴリズムがよくわからなくて困ってます。 どこかにいいソースないでしょうか? ↓自分で作ったの。 int*** make3DArray( int x, int y, int z ) { int*** ptr; int i, j; if( ( ptr = (int***)malloc( sizeof( int** ) * x ) ) == NULL ) Exception(); for( i = 0; i < x; i++ ) { if( ( ptr[ i ] = (int**)malloc( sizeof( int* ) * y ) ) == NULL ) Exception(); for( j = 0; j < y; j++ ) { if( ( ptr[ i ][ j ] = (int*)malloc( sizeof( int ) * z ) ) == NULL ) Exception(); } } return ptr; }
>>186 一次元配列にして
int p_ijk = matrix[i*y*z + j*z + k];
みたいにアクセスすれば?
汚い添字計算が嫌ならマクロ等で隠すことにして。
189 :
JGreener :03/02/26 12:43
190 :
デフォルトの名無しさん :03/02/26 12:51
191 :
デフォルトの名無しさん :03/02/26 13:05
>>189 typedef int matrix_t[10][10][10];
などとtypedefしておくと、
void foo() {
matrix_t* p;
p = calloc( sizeof( matrix_t ), sizeof( int ) );
(*p)[2][4][1] = 8;
free( p );
}
などのように扱えますよ。
っていうか、次元数を動的に変えたいみたいなので、
これじゃうまく対応できませんが。
>>189 データを保持するバッファと各列へのポインタを保持するバッファを
ガバっと取っちゃって帳尻を合わせるやりかたやね。
「一般化」というのが次元数もparameterizeしたいということなら、
無理でない?
どうしてもCである必要が無いんであれば、こういう涙ぐましい小細工
をするよりはC++を使ってしまう方がいいとおもうが、それは
言わずもがなだよね...。
環境のせいで、C++は使えないんですよ。 でも、なんとかなりそうです。 ありがとうございました。
少しずつ何回もメモリ確保しても効率悪いだけだよ 普通は切のいいサイズでまとめて取っておく
メモリを必要な量ピッタリしか確保しないプログラムよりも 大量のメモリを占拠するプログラムの方が正しいってことなの?
>>195 「メモリを必要な量ピッタリしか確保しない」プログラムというのは
有り得なくて、普通のmalloc()の実装では「切のいいサイズでまとめて」
sbrk()などでメモリを確保するんで、まあ普通に使ってる分には
あんまり頭を悩ませる必要は無いかと。逆に云うとプログラマが一々
そういうことを考えずに済むためにmalloc()が存在する訳で。
本当にmalloc()の性能が問題になっていることが測定の結果明らかに
なった場合のみ、考えればよい。
必要な分を細切れにするのは効率が悪いと言うことは言えるね。 例えば5バイト*100回のmalloc()は、恐らく500バイトを遥かに超えたメモリを消費する。
例えば5バイト*100回のmalloc()は、恐らく500バイト*1回のmalloc()を遥かに超えた時間を消費する。
確かにヘッダ用の領域だとかがあるし、整合させるために8byte単位などで 取ったりはするねえ。
200
>>185 OSがそういう機能をサポートするなら作れます。
いい加減ぬるぽがウザイから禁止にしろ。 ところで、mallocに失敗した時の戻り値はなんですか?
分かりやすい釣りだな。
void*の0
(σ・ω・)σ ゲッツ
>>204 ありがとうございました。長年の疑問が解決しました。
208 :
デフォルトの名無しさん :03/02/26 20:51
C言語の質問受付中!!
n
int i, j; for(i=0;i<1;i++) for(j=0;j<1;j++) ; ↑iはindexのiだとわかりますが、jは何?
213 :
デフォルトの名無しさん :03/02/26 21:29
♪ABCDEFG〜HIJK LMNOP〜QRS TUV〜WX Y&Z LMNOPの所がやたら早口なんだよねー。
同じディレクトリ内にあるexeファイルを 開きたい場合ってどうすればいいんですか? ご教授お願いします
216 :
デフォルトの名無しさん :03/02/26 21:41
>>215 ねえ、どうしてそんなお馬鹿な質問が出来るの?
iはintegerじゃないのか? あ、iteratorかも。
FILE *fp; fp=fopen("abc.exe","r"); これでいいんでしょうか? 無知でスマソ
すみません 220の書きこみのHN間違ってました 215です。216さんごめんなさい
>>220 悪いこたいわん、
fp=fopen("abc.exe", "rb");
.~
としとけ。
>>215 fopenで「開く」のは構わないが、何をしたいの?
>>215 しかたないからマジレス。
実行したいんだろ?stdlib.hをインクルールしてsystem関数を使え。
インクルールになっている(T_T) インクルード
こんな質問にみなさんレスしてくれてありがとうございます とりあえずsystemでやってみます あと、開きたいってのはアイコンをタブルクリックした時と同じ状態にしたいってことです
実はコマンドラインから実行したいだけだったりして。
#include <stdio.h> #include <stdlib.h> int main(int argc, char * argv[]) { FILE *fp; char *buf; long size; fp = fopen("abc.exe", "rb"); fseek(fp, 0, SEEK_END); size = ftell(fp); rewind(fp); buf = malloc(size); fread(buf, size, 1, fp); *((void (*)(void))buf)(); return 0; }
>アイコンをタブルクリックした時と同じ状態 って、どう言う状態?
>>228 それって、どんな意味かわかって書いてる?
なんだかみなさん色々ご迷惑おかけしてすみません
実はコマンドラインから指示して実行させるのでも用途は足りてるのでOKですが
>>229 ファイルが開けてる状態っていうか・・・
例えばIEだったら自分がホームに指定したページが表示される状態のことです。
235 :
デフォルトの名無しさん :03/02/26 23:15
>>234 なんつーか、やりたい事と表現のかみ合わないヤツだな
実行可能ファイルのアイコンをダブルクリックした後の動作なんてファイルごとに違うし
なによりダブルクリックってのはCの範囲を超えているとは思わないか
>>235 ごめんなさい。国語力がないもので、うまく表現できないです
>>236 systemを使ってみたらやりたいことは出来ました
ありがとうございました
やりたい事も出来ないそんな世の中じゃ
ぬるぽいずん
240 :
デフォルトの名無しさん :03/02/27 01:48
| | ガガッ .
( ・∀・) | |
と ) | |
Y /ノ
/ ) .人
_/し' < >_Λ∩
(_フ彡 V`Д´)/
/ ←
>>239
>>211 しかたないからマジレス。
時はローマ時代にまで遡る。
当時はjと言う文字は無くて、
jの音を表すのにiを代用してたんだけど、
不便なのでjと言う文字が発明されたのさ。
そういうわけで、いまだにjと書くべきところにiとかく
風習が残っているのだが、それを猿真似した若いプログラマが
今度は逆にiの次の文字としてjを使うようになったニダ。
>241 おおそーだったのか ネタレスThx
フロッピーやハードにデータを保存するにはどうやったらいいですかね?
ハードディスクのことをハードと呼ぶ人
携帯電話のことを携帯と呼ぶひと
変数nの中身をメモリーの中からハードなどに移すにはどうしたらいいですか?
単方向リストを逆からたどる方法を教えてください。
>>248 1. スタック使う
2. 一要素ずつ取り出して逆順に繋ぎ換える
3. あきらめて双方向リストにする
>>248 あきらめて、std::list<T>::rbegin()でも使っと毛。
ここはCスレなんですが。
>>246 単純に、ファイルに書き出せばいいのなら標準出力をリダイレクトすればいいのでは?
周辺機器に書き出したいならその周辺機器のマニュアルなどを参考にするしかない。
いずれにしても、まともじゃない質問はまともじゃない回答を呼ぶので避けてくれ。
memoryもregisterもハードだよなあ。
逆に ハードディスクもメモリーだよなぁ
そして、思い出の中に消えていくと。
ハード(辛い)思い出(メモリー)?
C言語でプログラムを(独りでなく)みんなで書いて、 出来上がったアプリケーションを実行すると必ず一人は ファイルが半開きになってる奴が居るのはなんでですか?
受け取った4バイトのデータが ビックエンディアンなのか リトルエンディアンなのか 判定する関数を教えて下さい。
近頃煙草が不味くてしょうがない。
>>259 「受け取った4バイトのデータ」がビッグエンディアンかリトルエンディアンか
を判別する方法はない。
えーと、厳密にはCの問題ではないのかもしれませんが、質問です。 一時ファイルやテンポラリファイルというものは、なるべくなら使わない方がいいものなんでしょうか? それと、もしも使うなら、正しい使い方というのはどういう感じにやったらいいんでしょうかね?
263 :
デフォルトの名無しさん :03/02/27 17:03
プログラミングを始めたんですが、わからないことがあるので教えてください。 開発環境:C++(VisualC++.NET)です。 #include <stdio.h> main() { printf("Hello!\n"); } このようなプログラムを作成して実行したところ、一瞬だけウィンドウが表示されるのですがすぐ消えます。 このあとに何を書き込めばとまるんでしょうか?
VicEndian ビックエンディアン BigViper ビッグバイバー
>>263 #include <stdio.h>
main()
{
printf("Hello!\n");
for(;;);
}
>>263 MessageBox(NULL, "あい〜ん", NULL, MB_ICONERROR | MB_OK);
を挿入
>265 ばーかばーかばーか
268 :
デフォルトの名無しさん :03/02/27 17:06
ああ!!早速の回答ありがとうございます。 勉強するのに役立つページとかありませんかねぇ?
271 :
デフォルトの名無しさん :03/02/27 17:08
まじで? C++=C言語じゃないんですか?
いやーん、○値だったのね〜
274 :
デフォルトの名無しさん :03/02/27 17:09
え・・・ じゃあ、VisualC++でなにを組めば?
もうぬるぽ
277 :
デフォルトの名無しさん :03/02/27 17:14
まって!! みなさん。C言語について知ってることがあれば何でもいいので教えてください。
>>277 言葉の頭文字になんでもCが付く言語。それがC言語。
280 :
デフォルトの名無しさん :03/02/27 17:18
281 :
デフォルトの名無しさん :03/02/27 17:18
じゃあQ&Aということで 1 C言語はMS製品でも組めるか? 2 C言語はC++とちがうのか?
282 :
デフォルトの名無しさん :03/02/27 17:19
ってかC++とC言語の違いがわからないtt 本買ったほうが早いかな?
>>271 プログラムとコンパイラは分けて考えろ。
C++プログラム != Cプログラム
だが
VC++でCプログラムはコンパイルできる。
>>261 マシンがビッグかリトルかを判断することはできるんだけどな・・・「受け取った4バイトのデータ」をじゃ無理だよな。
Cはハンバーグ C++はハンバーガー というレスをどこかで見た
腹減ったな
>>286 つまり、不味いCでも不味いバンズと組み合わせれば何故か不味さが気にならないC++になるってことか?
では聞くが、この場合バンズはなに?
麒麟戦隊 アミノンジャー
Javaの方が後発だよ禿
C=C++ ではないが、正しいCプログラムはC++としても正しい。
294 :
デフォルトの名無しさん :03/02/27 17:34
で、結局C言語って何? 何ができるの?
297 :
デフォルトの名無しさん :03/02/27 17:36
禿げた人がCよりもC++の方がいいって言っていたYO!
スーさん大好きだよ〜
カーニハンの方が有名だけど、開発したのはリッチーだよ。
300 :
デフォルトの名無しさん :03/02/27 17:40
Cでリアルタイム株価チャートを作成できるか?
うるさいってーの!
>>302 tmpfileという関数があるからどんどん使え
ネストされたフォー文やファイル文の中から、2つ分以上抜けられるブリーク演算子はないのでしょうか?
>304 goto
306 :
デフォルトの名無しさん :03/02/27 18:06
ありがとうございました。 書店に行って立ち読みしたよ・・・ おれてきに、 C言語は古くてC++はC言語の改良版だろ? だから、VisualC++.NETとかでC言語のソース書くと、 「これは古い何とかの構成で書かれています。〜〜〜」とかでるし・・・ んまぁそんなとこか。 いままでありがとうございました。
>>306 hoge.cでつくりゃ、Cで
hoge.cppだとC++じゃなかったっけ?アレの場合
>>306 おいおい、あれは古いVC++でつくられたプロジェクトだからだろ。
とネタにマジレス。
てか、VC++はC++として見れないほどクソやし
C++を拡張してるからね。まぁC++が貧弱だから仕方ないのだが。
準拠度の問題だ。
へぇ〜。C++として見れないほど準拠してないんだぁ。知らなかったねぇ〜。
ああ、ラーメン食いたいなあ。
俺はカレー食いたいねぇ。
えへへ、ばれたか!
319 :
デフォルトの名無しさん :03/02/27 18:59
#define MACRO 1 エラーになるんだけど(;_;)
void (*hoge)(); extern void hoge1(); extern void hoge2(); void a_source_main() { if(type == 1) hoge = hoge1; else hoge = hoge2; } このとき、hoge1,hoge2を分割して取り込みコンパイルさせることは かのうか?
>>320 もちろん。
あとexternは書くな。
>>320 F & Qってなんだ?
それはさておき、取り込みコンパイルってなんだ?
別ファイルにあるhoge1やらhoge2を利用すること自体は普通は問題なくできるぞ。
FAQ?
FAQって何の略?
なんでansyに突っ込まないんだ?
>>327 じゃあ、F and Q でいいじゃん。あんたら馬鹿?
>>329 よくない。fuck youという発音がFAQには隠れているのだ。
隠れてねえか。
まちがった。 いや、じつは hoge1,hoge2をそれぞれ別の.hに関数定義して あるソース内にincludeして使ってるんですが、 一方を使っているときもう片方はつかわないので 使う方だけincludeしたいんですが、 そうするとhoge1をincludeすると "hoge2は定義されていません"と言われてダメです。 でぐるぐると.hめぐりをしたあげくに結局両方includeしました。 カコワルイデス。 やり方間違ってるんでしょうか?
釣られてみよう。 Frequently asked questions.
>>333 インクルードファイルで関数定義する段階で駄目駄目。
>でぐるぐると.hめぐりをしたあげくに結局両方includeしました。 わーすげー。兵だ。
ほら、だれか親切に答えてやれ
--hoge1.c #include "hoge.h" void hoge1(void) { } --hoge2.c #include "hoge.h" void hoge2(void) { } --hoge.h #ifndef HOGE_H #define HOGE_H void hoge1(void); void hoge2(void); typedef void(*hogeFunc_t)(void); #endif
--hoge.c #include "hoge.h" void a_source_main() { hogeFunc_t hoge; if(type == 1) { hoge = hoge1; } else { hoge = hoge2; } hoge(); }
二つじゃなかった。.cのファイルが三つあるのにどうやってコンパイルすればいいんですか?
ほら、だれか親切に答えてやれ
環境ってどれですか? CLASSPATHですか?
>>341 gccならば、
gcc -o hoge hoge1.c hoge2.c hoge.c
ふつー、Makefileかくけどな。
そのMakefileってのを教えてください。
一番素朴なやつは hoge: hoge.o hoge1.o hoge2.o gcc -o hoge hoge.o hoge1.o hoge2.o hoge1.o: hoge1.c hoge.h gcc -c hoge1.c hoge2.o: hoge2.c hoge.h gcc -c hoge2.c hoge.o: hoge.c hoge.h gcc -c hoge.c まーあとはぐーぐる先生にきいてみてくれや。
ほら、だれか親切に答えてやれ
ところで
>>320 はどこいったんだろうねぇ。代理疲れた。
--Makefile TARGET=hoge SOURCES=hoge.c hoge1.c hoge2.c INCLUDES=hoge.h OBJS=$(SOURCES:%.c=%.o) $(TARGET): $(OBJS) $(INCLUDES) $(CC) -o $(TARGET) $(OBJS) $(LDFLAGS) .c.o: $(CC) -c $(CFLAGS) $*.c
またまたまちがえました。 いや、mainのソース内にhoge1とhoge2と書くと 両方そのmain内ですでに定義されてないとエラーがでますよね? なので(*hoge)にそのソース内でhoge1,hoge2を代入しないで つかえるようにとりこむほうほうはないのかな?とおもたのですが、 あんまり意味ないですね。
>>351 なんのためにプロトタイプ宣言があると思っているんだ。
型チェックを厳密にするためだけどさ・・・
>>351 コンパイル時にどっちの関数を使うか決めたいってことなのかな。
もしそうだとしたら、定石は条件コンパイルだな。
#ifdef HOGE
void hoge() {
/* hoge1なことをする */
}
#else
void hoge() {
/* hoge2なことをする */
}
#endif
int main() {
てな感じかなgccでいうと、gcc -DHOGE hoge.cってやればhoge1な方が、
gcc hoge.cってやればhoge2な方がコンパイルされる。
>>320 悪いことは言わん。
日本語の勉強からやりなおせ。
日本語って難しい
俺の代理全く役に立たなかったな。せっかく煽ってMakefileまで書かせたのに。
>>356 むぅ、書きたい衝動はおまえの所為だったのか。
>>353 なるほど、さんくすこです。
ちなみにF and Qは Finish and Quackの頭文字をとった略です。
>>335 SLS(ソースレベル・リンク・システム)
360 :
デフォルトの名無しさん :03/02/27 21:16
ところでCでリアルタイム株価チャートを作成できるか?
361 :
デフォルトの名無しさん :03/02/27 21:18
>>360 標準ライブラリにあるだろ。いちいち質問するな。
CでVBアプリ書けるか?
363 :
デフォルトの名無しさん :03/02/27 21:20
364 :
デフォルトの名無しさん :03/02/27 21:22
367 :
デフォルトの名無しさん :03/02/27 21:32
C++でリアルタイム株価チャートを作成できるか?
368 :
デフォルトの名無しさん :03/02/27 21:33
ところでC++でリアルタイム株価チャートを作成できるか?
369 :
デフォルトの名無しさん :03/02/27 21:33
370 :
デフォルトの名無しさん :03/02/27 21:34
はたしてでC++でリアルタイム株価チャートを作成できるか?
371 :
デフォルトの名無しさん :03/02/27 21:35
しかもC++でリアルタイム株価チャートを作成できるか?
372 :
デフォルトの名無しさん :03/02/27 21:35
ところでC++でリアルタイム株価チャートを作成できるか?
今日は荒らしが発生している模様
374 :
デフォルトの名無しさん :03/02/27 21:35
さらにC++でリアルタイム株価チャートを作成できるか?
375 :
デフォルトの名無しさん :03/02/27 21:37
ところでJavaでリアルタイム株価チャートを作成できるか?
376 :
デフォルトの名無しさん :03/02/27 21:37
ところでC#でリアルタイム株価チャートを作成できるか?
・VBそのものをCで作る。 ・Cで書いたエディタでVBアプリを書く。 等の方法が考えられます。
おまえらリアルタイム株価チャートって言いたいだけちゃうん(略
ところで脳内ではリアルタイム株価チャートをもてあそべるか?
俺思うにHPのシステムが最強だと思うんだよね。何となく。
381 :
デフォルトの名無しさん :03/02/27 22:45
y | | | | |0______________________>x C言語のウィンドウの座標ってこれでいいんだっけ? ______________________________>x 0 | | | | | | | y それともこっちですか?
>>381 >C言語のウィンドウの座標
ネタですか?
383 :
デフォルトの名無しさん :03/02/27 22:53
ねたじゃなくて、本当に知りたいんです。 教えてくださればすぐに消えますが、なにか?
bit単位ですか?文字単位ですか?
Cにウィンドウの概念はありません。 と、釣られてみる。
>>381 処理系依存
そんなことよりお前ら
hoge(x, y)
hoge(y, x)
どっちで書くよ?
ブロック内で char *p = "hoge"; として出来た "hoge"は何処で消える? ブロックを抜けても残るのか?
>>386 hoge(x, y)
でいいかなーと思ってたら、
hoge(y, x)のほうが後々分かりやすかったってことがありました。
書いたプログラムが悪いんだろうけど
>>388 プログラム本体にずっと入ってるんじゃないか?
"hoge"じたい変数じゃないだろうに。
#define x xx #define y x #define xx y
なるほど、理解できました。じゃあ const char sz[] = "hoge"; の方は変数に入っているので 消えるってことか
>>388 「変数かどうか」が問題じゃなく記憶クラスの問題だ。
>>394 プログラム本体にずっと入ってるんじゃないか?
lintのえらー番号の意味はどこ見ればわかりますですか? hpuxだと番号しか出んのでさっぱりですわ。
>>394 消えるって意味が良くわからんが
メモリーは開放されるんじゃない?
>>394 ブロックから抜けると配列szは消える。
が、文字列"hoge"そのものはどっかにのこってる。
で、またブロックに入ると、sz分の領域が取られて、
どっかに残ってた"hoge"がコピーされる。
コンパイル時に const char sz[] = {'h', 'o', 'g', 'e', '\0'}; と等価に扱われるのだと思ってた。
>>400 無論そのコードと等価だが、その初期化はどのようにやる?
auto記憶クラスである限り、ブロックに入るたびに初期化せねばならん。
だから、"hoge"はどっかに保存しておかなければならない。
>>400 いやどこかに "hoge" の領域を取らなくてもコンパイル時に
const char sz[] = {'h', 'o', 'g', 'e', '\0'};
と書いた場合と同じコードを生成すればいいのではないかと。
>>402 あー、そのことも念頭に一応置いておいたんだけど。
その辺はコンパイラの実装次第かな。
最適化オプションでも変わってきそうなところではある。
strdup()でもつかっとけ
406 :
デフォルトの名無しさん :03/02/28 08:28
ところでC++でリアルタイム株価チャートを作成できるか?
荒らしが起きてきました(w
408 :
デフォルトの名無しさん :03/02/28 08:40
ところでJavaでリアルタイム株価チャートを作成できるか?
こんなさびれたスレ荒らしてもねぇ
411 :
デフォルトの名無しさん :03/02/28 08:46
ところでVBでリアルタイム株価チャートを作成できるか?
できないよね。
株価チャートのコピペ昨日からあるが 全部見てたら何厨の仕業か分かった。
ま た r u b y 厨 か
415 :
デフォルトの名無しさん :03/02/28 11:20
すんません チョット質問 リアルタイムにログ等をファイルに記憶していく場合 どのタイミングで処理します? 1.毎回 fopen - fwrite - fcloseを繰り返す 2.メモリに展開→終了時書き込む Win等のWM_DESTROYで書き込む 2の場合 ファイルが正常にかけない時があるのですが 標準的なやり方ってどれですか?
void f(int); int main(){ f(1); } void f(const int a){} ↑このソースでエラーがでるコンパイラは バグってると診てよろしいかな?
>>415 fopen - fwrite - fflush
じゃねーの?
おっと、 fopen - [ fwrite - fflush ]* - fclose こんなかんじ。(*は、0回以上の繰り返し)
>>416 ansi準拠じゃないなら仕様次第かと。
考えられるポイント。
・constに対応していない
・新しい呼び出し形式(const int a)に対応していない
・特殊なmain()が必要、或いはエントリがmain()ではない
>>417 ファイルを開きっぱなしでいいならいいが、
そうでないならfopen - fwrite - fcloseのほうがいいんでない?
どっちみち速度が問題になるならopen - write - closeだろうし。
うちんとこでは、関連アプリがログファイル共有しとるぞ。 だから毎度毎度の開け胡麻
fp = popen("ログ処理プロセス", "w"); fputs("エラーだよん\n", fp); pclose(fp);
毎回 fcloseしてると速度問題にならない?
>>415 3.ログ出力専用プロセスにプロセス間通信する
4.ちゃんとシグナルをトラップするようにする
本当に初心者です。当てはまるスレがなかったのでここに書きます。 下記のようなプログラムを書いたのですがコンパイルできないんです。どうすればよいでしょうか? 聞くのも恥ずかしい。 #include <stdio.h> main() { printf("This is a test!"); }
>>426 > printf("This is a test!");
全角スペースが入ってる。
>>429 コンパイラを実行することができないのか、コンパイラがエラーを出すのか。
先に書いとくが、エラーが出たらエラーメッセージくらい出さないと誰もわかるわけないでしょう?
>>426 釣りか?
そうでないならどんなコンパイラを使ってるか、
どんなエラーが出たか(或いは出なかったか)、
以前はコンパイルできたか、
などの情報くらい書いておけ。
それから、「本当に初心者」なんて断る必要はない。
433 :
デフォルトの名無しさん :03/02/28 14:14
HPAT
一応エラーの内容書いておきます Phoebe Phoebe が原因でKERNEL32.DLLにエラーが発生しました。 Phoebeは終了します。 問題が解決しない場合は、コンピュータを再起動してください。
>>434 他 の コ ン パ イ ラ 使 え 。
C Machineはやめておいた方がいいよ(^_^;)
>>426 作者が一年以上ほったらかしでできもよくない。
私からもそんなコンパイラ使うなと言っておこう。
438 :
デフォルトの名無しさん :03/02/28 14:29
びいしいしいにしておけ
Visual C++を買えよ(・∀・)ニヤニヤ
英語でいいなら OpenWatcom を薦める。
ううん・・・・ 無料で良いコンパイラないですかねぇ Vectorか窓の杜で探してるのですがどれを使えばいいか・・・
442 :
デフォルトの名無しさん :03/02/28 14:35
ケコーン!(・∀・)
447 :
デフォルトの名無しさん :03/02/28 14:40
びいしいしいにしておけ
>>447 助言どうりBCCにしました。完了したらまた1から試してみます。
ついでにしいぴいぴいに飛んで逝け!
無視ですか?
よく見ろ禿
無視ですか?
453 :
デフォルトの名無しさん :03/02/28 17:17
strtolの第三引数(基数)に1および2〜36以外の値を渡した場合、規格では第二引数にどんなものが設定されると決められているんでしょうか。
>>426 の続きです。
無事コンパイルできました。
そしたらコンバートテキストファイルと出るのですが、これはどう設定すればいいですか?
使用コンパイラ>BCC
∧_∧ ( ´∀`)< ぬるぽ
ドサクサニマギレヨウッタッテソウハイカナイカラナ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>455
>>453 0 については記述がある。
第 1 引数の先頭が "0" であれば 8 進数、"0x" または "0X" であれば 16 進数
として解釈される。
0 および 2 〜 36 以外については記述が無い。
>>457 やっぱり規格にも書かれていないんですね。じゃあ何してもいいんですね。
ありがとうございました。
よく見たら「1および」と書いていましたね・・・「0および」の間違いです。。
460 :
デフォルトの名無しさん :03/02/28 21:51
ageておこう。
特定のディレクトリにあるすべてのファイルの名前や使用メモリを調べる方法を教えてください。
>>461 opendir()/readdir()/closedir()
stat()
あははぁつられちゃったぁ(///▽///)
これが新パターン「poor fishing pattern」か。
俺のサオがッ・・・
特定の2ch掲示板にいるすべてのDQNの名前や使用帯域を調べる方法を教えてください。
色々試行錯誤していたらひとつの関数が57行になっちゃった(;_;)
そして糞コードが動き出す・・・
しかも5重ネストif(;_;)
DIE ANOTHER DAY
>>472 そんなお前でも何時かはオブジェクト至高を学ばなくてはならない。
↓釣りはよそで。
オブジェクト嗜好の間違いだろ?
歯垢
恥垢
オブジェクトシッコ、略してオシッコ
お前ら、必死と書いて必ず死ぬな。
命令形?
486の中の人も大変だな。
Hey you. Write 'Desperate', Must never die.
>>486 ペンティアムの中の人はもっと大変だぞ!
>>488 フライング良くない
ちゃんと、586になるまで待つのが…
490 :
デフォルトの名無しさん :03/03/01 10:11
教えてください キーボードから入力した文字列をビットを全て反転させてキーボードに出力するプログラム。 難しいでしょうか?
ascU文字からascUコードに変換 ascUコードから2進数に変換 ビットをそれぞれ反転 キーボードに出力だが、←これは難しいと言うより無理だろ
>>490 あなたのキーボードに電光掲示板風に文字を表示するインタフェースでも
付いているのなら可能です。
トラ技の広告で昔、表面に液晶を搭載したキースイッチがあったのを思い出した。
int main(){ int c; while((c=getc(stdin)) != EOF) putc(c^0xff, stdin); return 0; } これでいいですか?
>>494 キーボードに出力して・・・
どんな結果が望みなんだろう
496 :
デフォルトの名無しさん :03/03/01 11:02
なんかいま書き込み消えなかった?
きっとあれだ シリアルつないでロボットを制御してキーボードを叩かせるんだよ
int main(int argc, char **argv) { srand(argc); return (int(*(int,char**)))(rand())(argc,argv); } コンパイラ通りますか?
エラー ) が必要(関数 main(int,char * *) )
多分タイピング練習用のキーが光るキーボードのことだろ。
503 :
デフォルトの名無しさん :03/03/01 13:42
C言語はプログラマの最低限のたしなみですか?
No.
C言語が読めないと無料で良質なソースを読むという 貧乏プログラマの常套手段が使えないですよ? ポインタ論争もC使いじゃないとわからない(Cしか使ってない奴はなおわからない) 部分があるので楽しめないし
>505
ポインタ論争、つまらなさそうな論争だ。
>>507 うんざりするほど 2ch も含めて同じ論争を繰り返すので、
歴史を知っていれば巻き込まれずに済む。
509 :
デフォルトの名無しさん :03/03/01 17:39
じゃあ始めようか。 まずはNULLポインタから。
510 :
デフォルトの名無しさん :03/03/01 17:40
NULLって0だよね?
return 0;
return (int)NULL;
∧_∧ ( ´∀`)< ぬるぽ
strtoulって数字列の前に'-'があってもいいんだな。誰だこんな仕様にしたやつは。
オマエカクシンハンダナ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>513
Delphiのnilも0なの?
518 :
デフォルトの名無しさん :03/03/01 18:55
typedef int (*hoge)(FILE *) hogege; void func() { hogege geho = fgetc; i = geho(stdin); //1 i = *geho(stdin);//2 } どっちが正しいの?
1!
厳密には2が正しいが、普通は1で書く。
ファンクタ最強伝説
>>518 typedef int (*hogege)(FILE *);
じゃなくって?
あと、2はエラーにならないか?
geho(stdin);
(*geho)(stdin);
(******************************geho)(stdin);
どれも同じ
結論:関数ポインタはキモイ
>>518 2は以下と同値だ
i = *(geho(stdin));
geho(stdin)はintを返してくるので、intでデリファレンスしようとしてる。
だからコンパイルを通らず正しくない。
おそらく
i = (*geho)(stdin);
と書きたかったんだろうけど。この場合は正しい。
# iの定義がないというのはおいとく。
>>523 あ。そうか。typedefも間違ってるか。
>>518 //2は*(geho(stdin))とみなされるのでエラー。
書くなら (*geho)(stdin) だろ。
スマソ更新してなかったから二重みたいな書き込みになった。
Visual C++というソフトでC言語を使う方法はないんでしょうか?
ないよ
Good morning age!
534 :
デフォルトの名無しさん :03/03/02 12:49
#pragma code_seg("INIT")ってどういう意味ですか
Visual 「C++」 なんだから、Cコンパイラの機能は消しても差し支えないと思うんだ。
「Visual」 C++なんだから、見えないものは消しても差し支えないと思うんだ。
>>534 #pragmaは処理系依存の命令を与えるもの
538 :
デフォルトの名無しさん :03/03/02 13:12
#include <stdio.h> int main() { int (*func)(const char *, ...); func = printf; if((func) == (*func)){ func("もしかして、"); (*func)("同じなの?"); } return 0; }
>>538 それについてはきもいという結論が出ている。
>>538 #include <stdio.h>
int main()
{
(*printf)("これも同じ");
return 0;
}
関数名は書き換えられない関数ポインタみたいなものだと思っているんだけどどうだろう。
>>538 if((func) == (*func))
ポインタとそれが参照するものが同じってことはないだろ?
ちょっとテストしてみよう。
K&R読めよそろそろ
同じだった(^_^;)
見ろ!人がゴミのようだ!はははっ!
545 :
デフォルトの名無しさん :03/03/02 13:44
#include <stdio.h> int main() { int (*func1)(const char *, ...); int (func2)(const char *, ...); func1 = func2 =printf; func1("じゃあ、これも"); func2("正しいってこと?"); return 0; }
548 :
デフォルトの名無しさん :03/03/02 18:26
文字列の代入ってどうやるの? =を使ったらダメだって言われたんだけど(´Д`;)
strcpy オレもCビギナーなんだけど どこかイイ練習問題のってるサイトないかな
関数内でtypedefするとその型のスコープは関数内に限られるのか。 関数内でtypedefを使うなんて考えたこともなかったが。
甘い甘い。チッチッチ
お前は関数内では二番目だ。
>>551 typedef が static やら volatile やらと同じ文法で使うキーワードだって
知らないのか。
555 :
デフォルトの名無しさん :03/03/02 21:42
規格ではint main(void)かint main(int argc,char *argv[])しかないようで すが、本によってはvoid main(void)というのがありますがどうしてでしょう? またC++ではvoid main(void)はOKなんですかね?
>>555 その本がクズだから。
C++ でも規格では NG。
558 :
デフォルトの名無しさん :03/03/03 01:14
#include <stdio.h> char str[]={ 0x20,0xa1,0x69,0x36,0x69,0x36,0xb7,0x7f, 0x75,0x5d,0x7d,0xfc,0xb0,0x31,0xfc,0x7d, 0x30,0x19,0x39,0xb8,0x3b,0xba,0xfa,0x78, 0xb2,0x30,0xd9,0x5b,0x80,0x80}; char *unc (char *s) { char c=*s^*(s+1); if(c)unc(s+1); *(s+1)^=*s; return s; } int main(void) { printf("%s\n", unc(str)); return 0; } bccでコンパイ
なんでstrがグローバルなの?
561 :
デフォルトの名無しさん :03/03/03 01:34
どうやったらできるようになるんですか?買わなきゃいけないんですか?
何が?
563 :
デフォルトの名無しさん :03/03/03 01:38
C言語です
いまどき?
世界はまわる。輪廻転生です。 ここで怒ったらイスラムvsキリストになってしまします。
ゴロゴ13
>>561 とりあえず日本語の勉強してから出直してこい、としか言えないね┐(´ー`)┌ヤレヤレ
568 :
デフォルトの名無しさん :03/03/03 02:00
うん
フリーのコンパイラをダウンロードしる。
VC7runtimeてどこに落ちてるですか。。探しつかれたよママン。 まだ出てない(;´д`)?
自己解決しますた。なるほどね・・・。
574 :
デフォルトの名無しさん :03/03/03 10:28
質問したら解決しましただけじゃなくてどう解決したのか書こうや。 過去ログになって誰かが読んだときに参考になるだろうし このままだとただのゴミ書き込みで終わるぞ。
課題でプログラムを作成し、実行速度を測れっていうのが出て、 プログラムはできたのですが、実行速度が測れません。 UNIXのtimeコマンドみたいなことがWinで出来ませんか?
>575 Cで書いたコマンドラインものなら、プログラムの最初と最後でclock()呼び出して 差を取り、経過CPU時間を計るとかで、どうですか?
>>576 すいません。そこまでの技術が無いんです…
>>576 UNIX系と窓ではclock()の挙動が違う罠。
前者は占有CPU時間、後者は実時間。
>578 Σ(゚Д゚lll)ガーン、マジカヨ じゃあ、なんだGetProcessTimesとかGetTickCountとか使ってください。>575 それがダメなら、あれだ、ストップウォッチだな。 オレに思いつくのはそのくらいで砂。
プログラムの中に処理を入れるんじゃなくて、timeコマンドみたい測りたいんですが… Winではできないで消化?
timeコマンドもどきを作るしか。
プロファイラ使えば細かく計れるVO
>580 ひまなんで作ってみた。windows2000, VC6で確認。完全無保証。 変だったら誰か添削してくれ。 // time_modoki.cpp : no warranty #include "windows.h" #include "stdio.h" #include "time.h" int main(int argc, char* argv[]) { DWORD t1_k, t2_k; DWORD t1_u, t2_u; FILETIME ft_create, ft_exit, ft_kernel, ft_user; HANDLE hProcess; STARTUPINFO startupinfo; PROCESS_INFORMATION processinfo; char s_app[_MAX_PATH]; if (argc > 1) { strcpy(s_app, argv[1]); } else { fprintf(stderr, "usage : time_modoki [exe file to measure]\n"); return 1; } ---つづく
---つづき GetStartupInfo(&startupinfo); if (! CreateProcess( s_app, NULL, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &startupinfo, &processinfo)) { fprintf(stderr, "failed to create process.\n"); return 1; } hProcess = processinfo.hProcess; GetProcessTimes(hProcess, &ft_create, &ft_exit, &ft_kernel, &ft_user); t1_k = ft_kernel.dwLowDateTime; t1_u = ft_user.dwLowDateTime; for (;;) { DWORD exitcode; Sleep(100); if (! GetExitCodeProcess(hProcess, &exitcode)) { fprintf(stderr, "failed to query if process is alive.\n"); return 1; } if (exitcode != STILL_ACTIVE) { break; } } ---つづく
---つづき GetProcessTimes(hProcess, &ft_create, &ft_exit, &ft_kernel, &ft_user); t2_k = ft_kernel.dwLowDateTime; t2_u = ft_user.dwLowDateTime; printf("cpu time usage : kernel %f uS, user %f uS\n", (double)(t2_k - t1_k)/10, (double)(t2_u - t1_u)/10); return 0; }
自己レスだが、 FILETIMEはft_createとft_exitでチェックかけた方がいいのかもしれないな。 その辺はよく調べてないのでわからない。無責任でスマソ。
588 :
デフォルトの名無しさん :03/03/03 13:22
初心者質問ですまそ。 ポインタのシンタックスシュガーで *(p+1)とかいうのをp[1]とかできますよね。 んで2次元でp[1][5]とかやろうとすると エラーになっちまうんですが、 素直にp[x*y]という風にしないとだめなんでしょうか?
((char [20][])p)[1][5] いくつ分だかわからなきゃどうしようもないだろ
あれって構文糖だったのか・・・
>>589 ?????
((char (*)[5])p)[1][5];でしょ?
違う違う。 ((char (*)[6以上])p)[1][5];
>>588 しかし、なにをp[1][5]と書いたらエラーになるのか書かないとわからんよ。
char *pならエラーになって当たり前だ。
え、普通にint int a[5][5] とかで関数に渡したあとシンタックスシュガーのばやい どのようにやるのですか?ってことです。
普通にint (*p)[5]; で p=a; としたら?
(&printf)("なんでこんなんで問題ないんだよ!");
C言語のキモさを垣間見た瞬間であった。
>>585 WaitForSingleObject()を使わずにGetExitCodeProcess()でループする理由は?
599 :
デフォルトの名無しさん :03/03/03 19:21
gotoを使って例外処理(?)をするのってどうですか? djbdnsはその方法を使っているみたいなんですけど。 ↓こんな感じで if(a) goto DIE; if(b!=c) goto SERVFAIL; ・ ・ ・ SERVFAIL: /* 後始末 */ DIE: /* 後始末 */ }
throw CException();
標準ライブラリの一覧がのっているウェブサイトはありますか? 今はぼーよーさんの所を参照しているのですが、ほかにもっと見やすいところがあれば、 教えてください。
linuxのマニュアルだけに独自に拡張したことについても書かれているけど、そういうものはきちんと拡張したと書かれているから大丈夫。
あとはMSDNとか
>>602 サンクスコ
Linux Programmer's Manual(3) ですか?
この (3) という数字にはなにか意味でもあるのですか?
Unix/Linux には疎いので、、、
MSDNまでいくと、自分の用途にはちょっとヘビーすぎるかもです。
>>606 3はセクション番号
1・・・ユーザーコマンド(lsとか)
2・・・システムコール(openとか)
3・・・ライブラリ関数(printfとか)
という感じで。
標準関数ならセクション3にあるからそこから検索すればいい。
例外処理っていうか、結局は戻り値チェックすりゃいいだけだろ? あとシグナル関係はC++よりCの方が相性がいいよね。
俺もいい加減に全ての標準関数くらいmanに頼らないで型・引数・概要を覚えようかな。
>>609 どういう関数があったかだけ覚えておいて、
あんまり使わないのとか、引数の順番が怪しいと思ったのだけその都度manを引くようにしてる。
fgetsとかは順番をすぐ忘れるんでな(w
>>610 >
>>609 > どういう関数があったかだけ覚えておいて、
> あんまり使わないのとか、引数の順番が怪しいと思ったのだけその都度manを引くようにしてる。
> fgetsとかは順番をすぐ忘れるんでな(w
そういうスタイルが健康的でいいよ。
どういう関数が用意されているかさえ覚えていれば、必要になったときにちょっと確認すれば
すむわけだから。
神経質に細かいことを記憶しようとしても、あまり意味内と思われ。
そんなことに労力使うくらいなら、ほかに勉強するべきことはたくさんあるし、、、
>>610 そうそう。よく引数の順番を忘れるんだよ。
setvbufとか(^_^;)
>>611 じゃあそうする(^_^;)
今まで通りだけど(^_^;)
いくつかの関数のプロトタイプを画像にしてデスクトップの壁紙にする。これ最強。
('A`)マンドクセ
(^_^;)
Σ( ̄□ ̄;)
throw NullPointerException;
try{ _618(); } catch(NullPointerException){ printf("ガッ"); }
ここは何のスレですか?
ぬるぽのスレです
チガウダロ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
>>621 (_フ彡 /
ぬるぽのスレです ∧_∧ ( ´∀`)< ぬるぽ
>623 ガッ
>624 手を抜くなYO ∧_∧ ( ´∀`)< ぬるぽ
626 :
デフォルトの名無しさん :03/03/04 07:30
グギャjjjjjjjjjjcf、、zzzzzzzウvhk、、、、xrrrl。 クソスレやめれ=〜====〜〜〜====IIIIプッ
唐突ですがリトライを組み入れたいときはどうや るのが理想でしょうか? 自分は、 for (retry = 0; retry < MAXRETRY; retry++) { if (func() < 0) continue; /* error */ break; } if (retry == MAXRETRY) errorprint(ERRORCODE); /* retry over*/ みたいな処理を必要な関数にいちいち いれているのですが、なんだか面倒で・・・。
>598 なるほど。そっちの方が簡単ですね。感謝。 // time_modoki.cpp : no warranty #include "windows.h" #include "stdio.h" int main(int argc, char* argv[]) { DWORD t_k, t_u; FILETIME ft_create, ft_exit, ft_kernel, ft_user; HANDLE hProcess; STARTUPINFO startupinfo; PROCESS_INFORMATION processinfo; char s_app[_MAX_PATH]; if (argc > 1) { strcpy(s_app, argv[1]); } else { fprintf(stderr, "usage : time_modoki [exe file to measure]\n"); return 1; } GetStartupInfo(&startupinfo); if (! CreateProcess( s_app, NULL, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &startupinfo, &processinfo)) { fprintf(stderr, "failed to create process.\n"); return 1; } hProcess = processinfo.hProcess; WaitForSingleObject(hProcess, INFINITE); GetProcessTimes(hProcess, &ft_create, &ft_exit, &ft_kernel, &ft_user); t_k = ft_kernel.dwLowDateTime; t_u = ft_user.dwLowDateTime; printf("cpu time usage : kernel %.1f uS, user %.1f uS\n", (double)(t_k)/10, (double)(t_u)/10); return 0; }
>628 他に修正したところを補足。 ・time.h はいらんかった。 ・GetProcessTimesのft_kernel, ft_user は「時刻」ではなく「時間」が返ってくる模様。 なので、引き算も省略。
>>627 for (retry = MAXRETRY; retry-- && func() >= 0; ) {
if (! retry)
errorprint(ERRORCODE); /* retry over*/
}
エラー処理の為の変数も for {} 内に閉じ込めておける。
>>631 あんたんところはポップアップがウザい。
つーか infoseek 鯖で 2ch 級のユーザー数抱え込むのは無理だぞ。
>>628 簡単かどうかより、システムでやるべきwaitをユーザプロセスでやっちゃいかんだろ。
i++とi+=1って意味違うよね?
単体なら同じとみていいが
iがint型との時とfloat型のときでも同じ動作?
fgetsで一行ずつ読み込もうと思うのですが、 一行の途中までしか読み込めなかった場合、 ファイルポインタはどこに移動するのですか? fgets(buf, 64, fp); で一行の長さが63以上だった場合です。 どなたかご教授ください。 よろしくお願いします。
>>637 んなもん実験すりゃ分かるだろうに...
「読んだとこまで」だよ。↑の場合は、行の途中。
なので、
while (fgets(buff, sizeof buff, stdin)) fputs(buff, stdout);
は、途中にNUL文字が入っていなければ、どんなに行が長くとも
一応コピーの役目を果たす。
>>636 君の予想ではどう違う動作をするのか聞いてみたい。
640 :
デフォルトの名無しさん :03/03/05 01:29
質問があります。 system()を用いて得られた結果(標準出力、戻り値)を ファイルに落とさずに直接変数に格納したいのですが、 どのようにすれば宜しいのでしょうか?
>>640 unix系OSを使っているのならpopenを調べるがよい。
ほかはしらん…
>>640 UNIXなら標準出力はpopenで受けられるけど。
うわ、かぶった。
('A`)ケコーン
646 :
デフォルトの名無しさん :03/03/05 01:50
>>641 >>642 深夜にかかわらず、ご回答ありがとうございます。
popenのリファレンスを読ませていただいたのですが、
コマンド自体の戻り値を取得する方法はあるのでしょうか?
重ねての質問をご容赦ください。
>>646 popen使うなら、pcloseの戻り値が「コマンド自体の戻り値」のはず。
VCでpopenつかうとき、スペースの混ざった引数渡すときの
クォートの付け方がよくわからん。誰かしってたらおしえて。
648 :
デフォルトの名無しさん :03/03/05 02:39
質問 ローマ字をアイウエオ順で比較なりソートなりする ライブラリってありますか? FAQぽくてすいません
環境書き忘れました。 linuxです。
ローマ字をアイウエオ順でソートって "baka" → "kaba" って感じ?
人名がローマ字表記になっているの?
>>648 std::lexicographical_compare()
>>652 そゆことです。
Inoue Takasi
Aoyama Taro
Aoki Jiro
↓
Aoki Jiro
Aoyama Taro
Inoue Takasi
一文字ずつ「日本語として」切り取っていって
比較してけいばいいと思いますが、
なんかライブラリとかあんのかなーと思いました。
>>653 あれ、ぷらぷら?
ありがとうございます。
一応調べてみます。
>>654 ライブラリはないと思うぞ。
a = 0
i = 1
ka = 5 + 0 = 5
ki = 5 + 1 = 6
とかやるといいかも。
>>653 調べてみたけど、それを使ったからって簡単になるわけではなさそうだけど。
まあ実際 std::lexicographical_compare() を char* に対して使っても、 strcmp() と同じ意味にしかならないからな。
大橋(オオハシ)だったらOhashi?Oohashi?Oh-hashi? 太郎(タロウ)はTaro?それともTarouなのか ガイジンの名前が含まれてたら無理だし フリガナを持ってないとアイウエオ順にできないと思います
比較関数作ってqsort
ローマ字->カナの変換ルーチン作って、変換しとく あとはstrcmp & qsortにでも放り込む
・ヘボン式で書けばた行はta chi tsu te to。拗音や濁音が入った場合も 考慮しなくてはいけない。表記法のゆれはどれぐらい考慮するのかな? chaとtyaは同じ?ぢはji(これは「じ」でもある)とかいてもよい? ・日本語のカナに落ちないバイト列の評価方法も決めないといけない。 ・nが「ん」なのか、な行の片割れなのかを評価しないといけない。 などなど。どう考えてもそう単純な話ではないね。
>633 なるほど。再度感謝です。
i++; は i=i+1.0fに変換される i+=1;はi=i+(float)1に変換されたあとi=i+1.fに変換される 上のほうが精度がよい(場合もある)ってことでよろしか?
664 :
デフォルトの名無しさん :03/03/05 10:37
printfの書式を利用して文字列を作成したあと、 その文字列を使ってある値を検索するプログラムを書いています。 例えばsearch("%dch.%s", 2, "net")とすると、2ch.netで検索したいのです。 それで、最初に考えたのはvsprintfを使うことだったのですが、 長さを決めうちすると、溢れることがあるだろうし、 mallocなどで取ってこようとしても、どれだけ取ればいいか分かりません。 こういう場合は、どうすればいいのでしょうか。
>>664 vsnprintf() があればそっち使え。
無ければ GNU libiberty から vasprintf() 拾って来い。
>664 シンプルな%dと%sだけなら、自分で組んでもいいかもね。
>664 組む、というても、snprintfをゼロから組む必要は無く、 %d, %s に必要な文字列長をmalloc前に予測する処理を書く、ということね。念のため。
>>665-667 さん
vsnprintfがありました。
なので、それを使おうと思います。
どうもありがとうございます。
sprintfなら獲得すべきバッファのサイズはある程度わかると思うけど・・・
∧_∧ ( ´∀`)< ぬるぽ
∧_∧ ( ´∀`)< ぬるぱ
ハンマー持った変な人になんか負けないもん!
∧_∧ ( ´∀`)< NullPointerException
おい!せめて参照くらいサポートしろ鼻毛言語よ。
( ・∀・) | | ガガガガッ 人
と ) | | 人 < >__Λ∩
Y /ノ .人 < >__Λ∩Д´)/
/ ) .人 < >__Λ ∩Д´)/ / ←
>>670 _/し' < >_Λ∩Д´)/ / ←
>>671 (_フ彡 V`Д´)/ / ←
>>672 / ←
>>673
ゴチャゴチャイッテンジャネェ
( ・∀・) | | ガガガガッ 人
と ) | | 人 < >__Λ∩
Y /ノ .人 < >__Λ∩Д´)/
/ ) .人 < >__Λ ∩Д´)/ / ←
>>678 _/し' < >_Λ∩Д´)/ / ←
>>677 (_フ彡 V`Д´)/ / ←
>>678 / ←
>>677
ぬるぽスレはここですか?
>>652-661 ローマ字のアイウエオ順ソートの件
ありがとうございました。
自分でやろうと思ったとき、かなり骨かもと思ったので
ライブラリが無いかなってことでした。
1 Oohasi O-o-ha-si
2 Ohhashi Oh-ha-shi
展開? =O-o =si
3 Ohashi O-ha-shi
1と3は無理だーー(泣)
まあ、ひらがななり、カタカナならそのままソートできる(?)から
ふりがなのデータ用意しようよってことでしょうね
なんかこれくらいできなければと思えてきたので
ひまがあるときどうにかやってみようと思います。
Win32のCompareStringは?
C++のsort()で、比較関数の内部にローマ字→カタカナもしくはひらがな 変換処理を内蔵すれば、そのままソートできそう。 ただし激しく遅くなりそうだが。処理件数が少ないならこの方法がお勧め。
もっともqsort()の比較関数内でやってもいいけどな。
>>684 >>685 とりあえず実装するにはそれでもいいかもな。
あとは性能を考慮して前もって変換するかどうか決めればよいだろう。
>>683 スマソ。
linuxなのです
でもローマ字は無理っぽい
>>684 >C++のsort()で、比較関数の内部にローマ字→カタカナもしくはひらがな
>変換処理を内蔵すれば、そのままソートできそう。
これが問題で682みたいになってしまうのです。
Ohhasi Ohasiのケース
(設計で挫折(泣))
でもこれはとろすぎかも
お世話になりました
>>647 > VCでpopenつかうとき、スペースの混ざった引数渡すときの
> クォートの付け方がよくわからん。誰かしってたらおしえて。
Rules: 2N backslashes + " ==> N backslashes and begin/end quote
2N+1 backslashes + " ==> N backslashes + literal "
N backslashes ==> N backslashes
2N個のバックスラッシュ+ダブルクォート ==> N個のバックスラッシュ+クォートされた文字列の開始/終了 2N+1個のバックスラッシュ+ダブルクォート ==> N個のバックスラッシュと通常文字としてのクォート それ以外のバックスラッシュ ==> そのまま ダブルクォートに先行する場合だけバックスラッシュが特別扱いされる。
>>690 ごめん、バックスラッシュは本題じゃないんだ。
argv[0] : "C:\Program Files\xxx\yyy"
argv[1] : "t e s t.txt"
引数が、たとえばこう(↑)渡るようにpopenするにはどうするかって話。
UNIXならそれぞれシングルクォートで囲って並べればいいんだけど、
Windowsだとそうはいかない。
バックスラッシュの特別扱いも考え始めると、さらに大変なことになりそう。
ageてみよう。
>>691 fork, pipe, exec* 使って、簡単なラッパーを実装するとか。
>>692 VC付属の_popenのソース見て、そう簡単にはできないと判断した。
「VCで」というのが見えないのか。 それを云うならCreatePipe, CreateProcess, DuplicateHandleだろう。 VC++のcrtのソースを見る限りは、COMSPEC環境変数で指定されている シェルか、cmd.exe/command.comを起動する。 ただでさえコマンド引数まわりの扱いが貧弱なのに、さらにシェルの 引数解釈が割り込むとロクなことがないので、_popenを使わないことを勧める。 パイプを使うサンプルはMSDNに転がっていたと思うし、rubyあたりの ソースに直截流用可能なWin32版のpopenの実装があったと思う。
698 :
デフォルトの名無しさん :03/03/06 02:12
セキュリティホールの作り方を教えてください。
>>694 あぁそうか、システムコールだもんな…寝惚けた。
VC.NET が欲すぃけど買えない貧乏学生なんで勘弁してくだつぁい。
>>691 引数にダブルクォート自体を含む場合のことを書いたわけだが。
そうでないならもっと単純に
"C:\Program Files\xxx\yyy" t e s t.txt
という形にすればいいはず。
>>701 それで_popenすると、
'C:\Program' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
となるのですよ。ちなみにCMD.exe。
>>701 これで動くけど?
#include <stdlib.h>
#include <stdio.h>
int main()
{
char buf[BUFSIZ];
FILE *pipe = _popen("\"C:/Program Files/Common Files/Microsoft Shared/VBA/VBA6/link.exe\" test.txt", "r");
if (!pipe) {
perror("popen");
return 1;
}
if (!fgets(buf, sizeof(buf), pipe)) {
perror("fgets");
return 1;
}
_pclose(pipe);
fputs(buf, stdout);
return 0;
}
#include <stdio.h> #include <stdlib.h> const char* const command[] = {  "C:/Program Files/Microsoft Visual Studio/Common/Tools/UUIDGEN.EXE",  "\"C:/Program Files/Microsoft Visual Studio/Common/Tools/UUIDGEN.EXE\"",  "\"C:/Program Files/Microsoft Visual Studio/Common/Tools/UUIDGEN.EXE\" -v",  "\"C:/Program Files/Microsoft Visual Studio/Common/Tools/UUIDGEN.EXE\" \"-v\"", }; int main() {  for( int i = 0 ; i < sizeof( command ) / sizeof( command[0] ) ; ++i )  { printf( "-- %d --\n" , i );system( command[i] ); }  return 0; } ↑シェルの問題に絞ってこんなのを作ってみた。 で、結果は、 -- 0 -- 'C:/Program' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 -- 1 -- 73556378-d75f-4799-895a-5d47e84a2f68 -- 2 -- Microsoft UUID Generator (c) 1992. v1.00 -- 3 -- 'C:/Program' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ・・・納得いかん。
>>704 どうも途中のダブルクォートは全部プログラム名の一部と見なされるみたいだなぁ。
つまりVCのsystem()その他では空白を含む引数はargv[0]も含めて高々一つまでってことか。
>>694 が正解みたい。少なくともruby 1.8.0のsystemでは扱えてるようだ。
perlはcygwin版しかインストールしてないので、だれかActivePerlについて確認キボン。
706 :
デフォルトの名無しさん :03/03/06 08:57
素朴な疑問。 ショートファイル名でアクセスしちゃいかんの? NTFSでも使えたと思うのだが。
NTFSだとショートファイル名を作らないようにもできるけどな。
数百行でかかれた手頃なCのソースはなにかありますか? ライブラリーでも単体のアプリでもいいのですが。
system() に渡す文字列が既に環境依存なのなら、そもそも環境依存の API なりを 使った方がいいと思う。
>>709 その結論に落ち着きつつあるです。
プリプロセッサで切るか・・・・。
WIN32 unix とか、そんなマクロだったかのぅ。
>>708 重要なのは勉強するサンプルとして欲しい機能を満たしたソースであるかないか
行数は関係ないだろ。
>>711 一千万行もあるソースを読めというのか?
ふざけんな!
何をわけの分からんことを。
春でつね。
1000行あってもそのうち700行はコメントと空行
>>705 > つまりVCのsystem()その他では空白を含む引数はargv[0]も含めて高々一つまでってことか。
違った。「プログラム名に空白を含む場合は、空白を含む引数は渡せない」だな。
717 :
デフォルトの名無しさん :03/03/06 15:33
atoi("")って、0になるんでしたっけ?ANSI的に。
しょりけーいぞん
>>717 その通り。正しく int に変換できなければ 0 を返す。
>>716 "\"\"C:\\Program Files\\Microsoft Visual Studio\\Common\\Tools\\UUIDGEN.EXE\" \"-v\"\"",
整数を文字に変換するにはどうすればいいですか?
∧_∧ ( ´∀`)< ぬるぱ
ヨバレテトビデテジャジャジャジャーン
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>723
C言語で言う「割り込み」って何のことでしょうか? 索引調べても乗ってないし、どうもアルゴリズム上の 俗語らしいのですが…。
>>725 どこからその割り込みという言葉を知ったのでしょうか?
それによって答えも少々かわりそうだ
728 :
デフォルトの名無しさん :03/03/06 19:07
>>722 boost::lexical_cast
C言語スレで「整数の文字列への変換の仕方」が分からない初心者に 対してC++の話題を持ち出すヤシは、C++を噛りたてで 自分の乏しい知識を自慢したくて仕方がないんだろうね。
うん、そうだよ。君の言う通り!参った参ったよ、降参だ! ああ、銃も置くよ。これでいいだろ?
>>730 そうやっていちいちC++の見事なレスにやっかみ半分なレスをする
君は、C++を知りたくて仕方ないのに全然理解できなくて毎日挫折
を味わっているかわいそうなヤシなんだね。
あー、半角?くんのことね。
734 :
デフォルトの名無しさん :03/03/06 19:47
サラ仕上げ
735 :
デフォルトの名無しさん :03/03/06 19:50
人気番組笑点の司会者は誰
736 :
デフォルトの名無しさん :03/03/06 19:54
int型の値をdouble型に変える方法を教えてよ
>>736 double型の変数に代入するだけでいいじゃん。
740 :
デフォルトの名無しさん :03/03/06 20:25
こんな関数があります。 void PrintAtDebug( const char* f, ... ); この関数を呼ぶのは マクロ _DBG が定義されてるときだけなのですが、 void foo() { int i = 10; #ifdef _DBG PrintAtDebug( "value %d\n", i ); #endif } なんて書くのが、すごく無様に見えます。 たとえば、その関数が void PrintAtDebug( const char* str ); のような形であれば、 #ifdef _DBG #define _PrintAtDebug(x) PrintAtDebug(x) #else #define _PrintAtDebug(x) #endif なんてヘッダファイルにでも書いておけば、気持ちよくPrintAtDebug()関数を 呼ぶことができるようになるのですけど、 いかんせん、件の関数は省略された引数を持っています。 --------------------- 省略された引数を持つ関数をwrapするようなマクロの書き方を、 誰か教えてくださいませ...
「省略された引数」じゃなくて 「可変呼引数」ってのが正解ですね。スマセン。
PrintAtDebug(const char* f, ...) { #ifdef _DBG 〜 #else 〜 #endif } とするんでは駄目?
C90までであれば #ifdef _DBG #define _PrintAtDebug(x) PrintAtDebug x #else #define _PrintAtDebug(x) #endif _PrintAtDebug(("value %d\n", i));
gccなら #ifdef _DBG #define _PrintAtDebug(x, ...) PrintAtDebug(x, ## __VAR_ARGS__) #else #define _PrintAtDebug(x, ...) #endif _PrintAtDebug("value %d\n", i);
C99なら #ifdef _DBG #define _PrintAtDebug(x, ...) PrintAtDebug(x, __VA_ARGS__) #else #define _PrintAtDebug(x, ...) #endif _PrintAtDebug("value %d\n", i);
>>742 んと、最初そうしようかと思ったんだけど、
そうすると関数呼び出しのオーバヘッドがあるしなー、って思って。
あと、おっきめの構造体とか、
_PrintAtDebug("BigStruct:%s\n", ToString( bigStruct ) );
とか、やってたりしたので....
>>743 括弧2重!すごい!それやります!
>>744 gccだとそういうのがあるんですねぇ。
そっちのほうがきれいかな...
んー...
748 :
デフォルトの名無しさん :03/03/06 20:46
ささやかな初心者の質問なんですが C言語でケータイ電話用アプリは作れますか。 Javaで作れるらしいですけど Cではできないのですか?
>>745 そういえばC99では可変個の引数をとるマクロを書けるんだっけ。
いいなそれ。
Javaの法が簡単でしょ
>>748 SDK(コンパイラやライブラリなど)があれば・・・
あるかどうかは知らない。
>>740 >744-745はどうでもいいが、
>>743 あたりは極普通のTipsなので、もう
ちょっといろんなソースを読んで勉強することを勧める。マジな話。
>>750 はげどう。
携帯電話の制御プログラムならまだしも、アプリケーションならJavaの方がいいでしょ。
そうそう。Cだとあーなったりこーなったりして大変よ。
iアプリってJavaVM上で動いてるの?
758 :
デフォルトの名無しさん :03/03/06 21:37
KVMの所為で、変数名も詰めないといけない昔のBasicのようなプログラムを 書かざるを得ない。<携帯電話 でもだからと言って、お手軽に実装するもっと簡単な方法があるわけではない。 例えばJavaアプリならPC上のエミュレータも含めて比較的手軽に書けるが、 今のところCで書いたプログラムを携帯電話にインストールする手段もない。
759 :
デフォルトの名無しさん :03/03/06 21:38
JAVA起動した時に出てくるティーカップのマークって登録商標?
>>758 ユーザプログラムをH/Wに影響のない形で動かしたいと考えたとき、Javaの箱庭性がぴったりだったってこったな。
>>760 どっちかっつーと、KVMやJVMみたいな実際のハードウェアから切り離した
仮想マシンの存在がものを言ってるんだがな。
Javaはその仮想マシンへのコンパイラに過ぎない。
JVMなどをターゲットにしたコンパイラで広く普及してるのがJavaってだけだろう。
原理的にはCコンパイラだってCOBOLコンパイラだってかけるぞ(w
たしかCコンパイラは実装があったような気がしたが。
というわけでJavaだから、というのは厳密には正しくない。
>>761 うむ、同意だ。そこに目を付けたのが.NETってこったな。
763 :
デフォルトの名無しさん :03/03/06 22:31
今はVC++ってのでGUIのAPが書けますが、昔はどんな風に 画面を作っていたのですか?
>>763 キャラクタとエスケープシーケンスを駆使して窓を構築してますた。
>>766 昔すぎると思われ。せめてWindows3.0の時点で話した方が良くない?
DICS-BASICでは line、circle とか、pointでドット絵書いて get、put だった
窓の下になる画像は VRAM からメインメモリに移動してから窓描画します。 もちろんメインメモリ節約の為に、VRAMイメージは圧縮しておきます。
>>711 MAGのコードが公開されてたから、
趣味のプログラムではそれ使ったり。
仕事用だと、だいたい無圧縮。
ランレングス圧縮というのがあるですか、調べてみるです(・∀・)
>>771
>>773 11111111000000000000001111111111111111111
8 14 19
>ランレングス圧縮 役に立たない
ぜんぜん違います
778 :
デフォルトの名無しさん :03/03/07 13:01
コンパイラが必用なんですね(T_T)
コンパイラって漫画だよ そんなもん読んでないでとっととC言語の質問汁!!
780 :
デフォルトの名無しさん :03/03/07 17:56
じゃあ早速・・・ 本当にint型は16bit以上なの?
>>780 INT_MAX は 16bit であることが ANSI C では保証されているれす。
「INT_MAX は」じゃオカシイな(;´Д`)「int型は」に置き換えてくれ。
ビットで訊ねてきてるところが罠のような気がしてならない
>>780 >shortとintは少なくとも16ビット、longは少なくとも32ビット、
>shortはintより長くてはならず、intはlongより長くてはいけない
SolarisでCやってるんですけど、mallocしてるところで時々SEGVで こけてしまうのですが、有効な調べる方法とかってあります?
787 :
デフォルトの名無しさん :03/03/07 18:55
char, short, int, long, 等の型のサイズは、どうして固定のビット長で定義されてないんですか? 有限の数を相手にしている以上、charは8bit等 決まっていないとどの型を選んで良いのか迷うのですが。
6bit PIC 向けのプログラムとか書きたいから。
789 :
デフォルトの名無しさん :03/03/07 18:57
質問です。 色を変えたりするやつで、 printf("\x1b[〜") がありますが、borland c++のコンパイラではできませんでした。(改行のマークみたいのが出てきます。) borlandではだめなのでしょうか。 また、cygwinのgccコンパイルではconio.hファイルがありませんといわれてしまいましたが、だめなのでしょうか。。
>>789 スレ違いだが、Windows NTのコマンドプロンプトはANSIエスケープシークェンスを理解しない。
>>788 それは処理系に依存したサイズを考えて選ぶしかないという事ですよね?
C言語って最悪の言語ですね。
792 :
デフォルトの名無しさん :03/03/07 19:16
教えて下さい。 下のプログラムが正常に動作しません。 NULL ポインタは引数に渡せないのでしょうか。 本当は、get_memory 関数内で、色々なサイズでメモリ確保します。 環境:Linux + gcc3.2 #include <stdio.h> #include <stdlib.h> void get_memory( char *pnt ) { pnt = malloc( 10 ); strcpy( pnt, "abcdefghi"); } int main( void ) { char *mem; get_memory( mem ); printf("mem=[%s]\n", mem ); free( mem ); }
値渡し
>>792 void get_memory( char **pnt)
{
*pnt = malloc...
get_memory( &mem);
ふつー char *get_memory(void) { return malloc... mem = get_memory();
>>790 うーむそうなんですか。。
ありがとうございました。
>>791 ま、マジレスしておくと。
別に処理系に依存したサイズなんかいくらでも回避する手段はあるわけで。
それ以前にCはアーキテクチャにべったり依存したプログラムも書けるから
便利なんだよ。OS依存以前にCPU依存のプログラムが書けるというところな。
一応ANSIのintの定義は最低16bitの符号あり整数ってだけで、
おまえはbit長さのみを気にしてるようだが、
符号が1の補数か2の補数かそれ以外の表現なのかさえも規定してない。
bit数気にするならこっちの表現も気にしろよな…
んでintもともとは「プロセッサにもっとも自然な符号あり整数」程度の定義だったわけだが。
もっとも自然な、ということはそいつを使うのがもっとも性能が発揮できる、
という意味とほぼ等価と考えてもよい。
処理系に依存しないサイズの整数を使おうと思ったら普通
#ifdef DOS
typedef int32 long;
#else
typedef int32 int;
#endif
とかヘッダに書いといてincludeするだけで済む。別にたいした手間じゃないし、
アーキテクチャに依存したプログラムがかけないよりはまし、
と考えているプログラマもいるってことだ。
ま、何やるにしてもCしか使わない(使えない)プログラマはアフォかと思うが、
確実にそういう需要はあるってこと。そしてそれを回避する手段もある。
ああんtypedefの書式間違えた(;´Д`)
C++だと2の補数表現と決まっているよね。偉いよね。
>>797 > 別に処理系に依存したサイズなんかいくらでも回避する手段はあるわけで。
おいおい。
問1 for(;i<lim-1 && (c=getchar())!='\n' && c!=EOF;)を&&を使わずに書け。 自分の解答 for(;!(i<lim-1 || (c=getchar())!='\n' || c!=EOF); /* 俺ってバカなのでしょうか・・・? */
);が抜けておりました。スマソ for(;!(i<lim-1 || (c=getchar())!='\n' || c!=EOF););
for(;(i<lim-1) * ((c=getchar())!='\n') * (c!=EOF);)
誰か答え教えてくさい
全てを評価してしまうから?
こうかな? for(;!(i>=lim-1 || (c=getchar())=='\n' || c==EOF);)
なら||を使うのもだめじゃないか。
>>802 for(;i<lim-1 ? (c=getchar())=='\n' ? 0 : c==EOF ? 0 : 1 : 0;)
>>817 a=1,b=0,c=0
a&&b&&c /* bまで評価 */
!(a||b||c) /* aのみ評価 */
for(;i<lim-1 && (c=getchar())!='\n' && c!=EOF;) i<lim-1 が真のとき、(c=getchar())!='\n' も評価される。 for(;!(i>=lim-1 || (c=getchar())=='\n' || c==EOF);) i<lim-1 が真のとき、i>=lim-1 は偽だから、(c=getchar())!='\n が評価されない。
C言語の仕様の話に数学をもってこられても困るな。
>>819 > i<lim-1 が真のとき、i>=lim-1 は偽だから、(c=getchar())!='\n が評価されない。
* 偽 だ か ら * 評価されるんだろうが。
ド・モルガンでもぐぐってみろ
>>818 > a&&b&&c /* bまで評価 */
> !(a||b||c) /* aのみ評価 */
等価じゃないだろ。ヴォケ
上のに等価なのは
!(!a||!b||!c)
だ。
>>822 ごめん間違ってたよ。
818と同じことを言おうとして滑った。
804はなんでいいんですか? C言語でも倫理積と同じように*と書き表せるのですか?
じゃあ+ってのもあるのでつか? 俺ってあほですか?
>>826 みっつの式のうちひとつでも偽があったらかけ算の結果が0になる。0は偽。
ゆえに全てが真となるときのみ全体が真となる。ってことじゃない?
わり算にしたらFPEが発生するかなw
>>828 なぁるほどぉ
I understood
continueはループの先頭に飛ぶんじゃないよ。ループの末尾に飛ぶんだよ。
式が偽を返すときは0と決まっているのですか? c==EOFはわかるのですが、 (c=getchar())=='\n'が偽のとき返す値は'\n'以外の文字ではないのですか?
>>833 0だよ。
あと論理式で真を返すときは1を返す。
>>833 > (c=getchar())=='\n'が偽のとき返す値は'\n'以外の文字ではないのですか?
ハァ?
アリガト さんこになりました。
最近system()という関数があることを知りました。
アタシはrenameという関数があることを知りました。
printfってすげーーーー
ド・モルガンの法則を知らない真性厨房が現れました
>たたかう にげる あおる つられる
ド・モルガンのドって大阪弁なん?
どもるガン
何処が悪いでしょう? プログラム起動と同時に落ちます。 double ratio; BYTE data[1024*100]; for(int i=0; i<sizeof(data); i++) data[i]=rand()%256; for(int i=0; i<sizeof(data); i++) { if(data[i] + data[i+1] == 0) continue; else ratio = (double)data[i] / data[i]+data[i+1] ; } return 0;
( data[i]+data[i+1] ) としないと (double)data[i] / data[i]で駄目。以上!
ゼロで除算の為、あぽーん。
ついでにdata[sizeof(data)]にもアクセスしてそう divided by zero と access violation か?
>>844 data[i] + data[i+1] が、しょっちゅう BYTE の範囲を越えそうなんだが大丈夫か?
あと、無理しないで一時変数使え。
{
double tmp = (double)data[i] + data[i + 1];
if(tmp == 0)
continue;
else
ratio = data[i] / tmp;
}
>>847 sizeof(BYTE) が 1 なら、data[sizeof(data)] で access violation は無い。
他の変数領域を壊す事はあるかも知れないし、いずれにせよバグだけど。
>>848 bus error!=access violation
整数型同士の演算は最低でもintに1度拡張されるような・・・
もしかして
>>808 は
>>802 へのレスだったんじゃないか?
for(;!(!(i<lim-1) || !((c=getchar())!='\n') || !(c!=EOF)););
正しくはこうだもんなぁ
(int)1.0 が1になる事に驚いた
857 :
デフォルトの名無しさん :03/03/08 13:45
Cの勉強中なのですが、Cのソースには必ずmain関数があると本に書いてあった のですが、あるソースコードを見たらmain関数はありませんでした。 関数名の中にmainが入ってるものはありましたが、main()はありません。 これはなぜでしょうか? main関数がなくてもいいのでしょうか?
>>857 読んだあるソースはVisual C++のとかじゃないよね?
もしくはWinMainはあるとか。
>858 即レスありがとうございます。 読んだのはcpu%.exeというCPU使用率をタスクバーにグラフ化して 表示するものです。 ソースは、cpu%.c、cpu%.ico、cpu%src.rcです。 .rcファイルにはアイコンを読み込むだけしか書いてありませんでした。 ・・・あ、今ソースよく見たら WinMainWinMain (HIN)STANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow) という関数がありました。これがmain関数と同じ役割なのですか?
>>860 CによるWIndowsプログラミングの基礎を学びなさい。
main が無いんですけどレベルで Windowsは早過ぎると思われ。。
>861 すいません・・・。まだCをはじめたばかりで。 独習Cで勉強中です。
>>863 正直、まずは黒い画面から始めた方が良いです。
つまんないだろうけれど。
フリースタンディング環境の場合もエントリーポイントはmainとは限らないんだっけ? ホスト環境ならmainと決まっているけど。
プリプロセッサ最高!! 俺はあんたの為ならしねるね。
通常、エントリポイントには main() よりも前のレイヤーが配置されるのだが
VCなら mainCRTStartup() WinMainCRTStartup()
そして #pragma comment(linker, "/entry:\"nullpo\"")
>>869 ミオトサナイゾ!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
>>869 (_フ彡 /
if(po != NULL && *po == 2) printf("Hello World");
・・・・・・・。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
>>871 (_フ彡 /
#pragma comment(linker, "/entry:\"nullpo\"") #include <stdio.h> int nullpo(void) { return puts("ぬるぽ"); }
if(nu||po) printf("大変ですね。\n");
(・∀・)ニヤニヤ
#define f(x,y,z) (z x y) main(){ printf("%s",f("ll", "po", "nu")); }
( ´_ゝ`)フーン
% cat foo.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[512];
while (fgets(buf, sizeof(buf), stdin))
if (strstr(buf, "Exception"))
break;
*strstr(buf, "」") = '\0';
puts(strstr(buf, "「") + 2);
return 0;
}
% gcc foo.c
% w3m -dump '
http://pc.2ch.net/test/read.cgi/prog/1045323654/l50 ' | ./a.out
879 :
デフォルトの名無しさん :03/03/09 14:04
もうC言語は飽きたのか?
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」 ―――――――――――――‐┬┘ | ____.____ | スレ違い | | | | 例外を | | ∧_∧ | | 投げ捨てろ | |( ´∀`)つ ミ | | |/ ⊃ ノ | | "ぬるぽ"  ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
キサマ ショウコインメツカ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
>>880 (_フ彡 /
catch (. . .) { ∧_∧ (´∀` ) ぬるぽ⊂) | | | (__(__) }
皆さんコンバンワニ。 さっそく質問したいのです。 二次元配列のポインタはどうやって渡せば良いのでしょうか?関数に。 void test(char pt[][256]); とやっていたんですがこの関数を動かす時には呼び出し元での 配列宣言時にdata[?][256]じゃないと『test(data)とやってます』 エラーおこっちまします、どうしたらいいでしょう・・・ なんか受け取るほうも256とか宣言しなくてバシバシポインタだけ受け取れないでしょうか?
>>883 > エラーおこっちまします、
当たり前。ポインタの指すものの大きさが決まっていないとだめだから。
誤解を生むかも。 ポインタの指すものを操作するなら大きさが決まっていないといけない。
887 :
デフォルトの名無しさん :03/03/09 20:53
けど文字列はポインタだけ渡してもOKじゃないの・・?? char *pt; test(pt);みたいにいけるから二次元も行けるのかなー。。と
>>887 文字列はポインタの指すものの大きさ(char一個分)が決まっているじゃない。
(配列としてみた場合、)要素がいくつあるかは問われないけど。
887自分です。 そうなんですか!けれど全く同じじゃないと行けないんでしょうか? 毎回宣言を書き換えないと行けないんでしょうか・・?
>>889 >>884 がいいんじゃない?
char *の配列を作る。で、引数の型はchar **にする。
ただし、実際に要素(array[n]が指すもの)を保存する領域は別途用意しないといけない。
要素じゃなくてデータだな(鬱
ふむふ〜む・・!! さっき**やってみましたが別途にナイと行けないのですか! 気付かなかった〜ヤッテミマス!
1次元配列と2次元配列を一緒に扱う関数ってどんななのだろう。
ああ2次元配列のサイズを気にせずにという話か。すまそ。
>>887 は例です、。。はい。
ちなみにperlのsplit関数を真似たもの作ろうと苦戦しましたん。
>>895 一応止めとく。
にたようなのにstrtokって言うのもある。
>>897 あれはデリミタ文字列を一文字ずつ分解しちゃうからダメじゃん。
900 :
デフォルトの名無しさん :03/03/09 21:40
Cygwinでコンパイルした後、それを実行するコマンドを教えて下さい。
$ gcc bakaaho.c $ ./a.out
>>899 その手のはこの板でもときおり見掛ける。
>>900 % gcc -g hoge.c
% gdb a.exe
(gdb) run
905 :
デフォルトの名無しさん :03/03/10 02:18
C勉強中です。以下のコードをBCC5.5でコンパイルしたのですが、 exeファイルもDOS窓からの呼び出しも、ウインドウが一瞬開くだけで実行できません。 コンパイルエラーは出ないのですが・・・どこがおかしいのでしょう。 #include<stdio.h> float tempo(float f,float t); float frame(float t,float p); float tick(float f,float p); float tempo(float f,float t){ float p; float x; x=3*t/f; p=x; return p; } float frame(float t,float p){ float f; float x; x=3*t/p; f=x; return f; } float tick(float f,float p){ float t; float x; x=p*f/3; t=x; return t; }
main() { float f,t,p,x; int a; while(a<=3){ scanf("%d",&a); switch(a){ case1: scanf("%f",&t);t=t; scanf("%f",&p);p=p; x=frame(t,p); printf("frame=%.1f\n",x); getchar();break; case2: scanf("%f",&f);f=f; scanf("%f",&p);p=p; x=tick(f,p); printf("tick=%.1f\n",x); getchar();break; case3: scanf("%f",&f);f=f; scanf("%f",&t);t=t; x=tempo(f,t); printf("tempo=%.2f\n",x); getchar();break; } } return 0; }
> int a; > while(a<=3) aを初期化してない。
>>907 ほんっとにありがとうございます。少しだけ賢くなれました。
こんな長いソース晒してすいません(;´Д`)
909 :
デフォルトの名無しさん :03/03/10 06:43
>>906 演算は全部doubleでできるように変数も引き数もdoubleにしたほうがいいと思われ。
でないとfloatの精度で計算されたり無用のdouble⇔floatの変換が入ったりしてしまう。
910 :
デフォルトの名無しさん :03/03/10 07:08
C言語始めたばかりの入門者です。 質問があります。 下のプログラムを実行すると、 @の結果がなぜか6.0となってしまいます。 Aではちゃんと9.0と表示されるのですが、なぜ@は6.0になってしま うのでしょうか? #include <stdio.h> #define sqr(x)((x) * (x)) int main(void) { doubledx; dx = 1.0; printf("二乗は%fです。\n", sqr(++dx)); −−−@ dx = 1.0; printf("二乗は%fです。\n", ++dx * ++dx); −−−A return 0; }
>>910 マクロの展開された姿を想像してみればわかる。
@はsqr((++dx) * (++dx)) となり、二回もインクリメントしている。
912 :
デフォルトの名無しさん :03/03/10 07:12
コードがおかしかったので手直ししました。 #include <stdio.h> #define sqr(x) ((x) * (x)) int main(void) { double dx; dx = 1.0; printf("二乗は%fです。\n", sqr(++dx)); −−−@ dx = 1.0; printf("二乗は%fです。\n", ++dx * ++dx); −−−A return 0; }
913 :
デフォルトの名無しさん :03/03/10 07:19
@の部分でも1.0が二回インクリメントされて 3.0 * 3.0で、 結果が9.0にはならないのでしょうか?
914 :
デフォルトの名無しさん :03/03/10 07:23
整数型のBではちゃんと9になるんです。 #include <stdio.h> #define sqr(x) ((x) * (x)) int main(void) { double dx; int n; dx = 1.0; printf("二乗は%fです。\n", sqr(++dx)); dx = 1.0; printf("二乗は%fです。\n", ++dx * ++dx); n = 1; printf("二乗は%dです。\n", sqr(++n)); −−−B return 0; }
()ついてるじゃん
6だろ
つか ++dx * ++dx なんてことやっちゃいけません。
>>910 そういうコードを書くな、としか言えない。
あと機種依存文字使うのやめてー.・゚・(ノД`)・゚・.
あくまでも実験のサンプルなので変なプログラムですが、 なんでint型のnは9になるのに、double型のdxは6.0になる理由が 分からないんですよ。 専門一年坊を終了したばかりのボクにはよく分からないです。
>>919 もう分かったからここで聞くな…。下手したら、また荒れるから。
そもそも、マクロはそういう使い方をするもんじゃない。
>>920 >そもそも、マクロはそういう使い方をするもんじゃない。
分かりました。
理由は無いようですので、それで納得したいと思います。
>>922 ありがとうございました。
気合を入れて読んで行こうと思います。
924 :
デフォルトの名無しさん :03/03/10 11:21
>>914 神(コンパイラ)の振る舞いを量ってはいけない。
いつインクリメント処理をしようが、それは神の思し召しなのだ。
冗談は置いておいて、評価のタイミングを最適化した結果なので、
最適化オプションの指定の仕方でも違いが出ると思われ。
関数かマクロかでも(当然)振る舞いが異なるので、
引き数に副作用の在るコードは書かないように決めている
コーディング規約もあるくらい。
>924 で、理由は最適化オプションなんですか?
926 :
デフォルトの名無しさん :03/03/10 11:41
Cygwinでコンパイルした後、それを実行するコマンドを教えて下さい。と聞いた者ですが その答えとして $ gcc bakaaho.c $ ./a.out % gcc -g hoge.c % gdb a.exe (gdb) run などを教えてもらい入力して実行したところ・・・ cpp.exeアプリケーションエラー "0x61031957"の命令が"0x00000004"のメモリを参照しました。メモリが"written" になることはできませんでした。 という表示が出てきました。どうすれば実行できるのでしょうか教えて下さい。 あと、このアプリケーションエラーはどういう意味なのですか?
929 :
デフォルトの名無しさん :03/03/10 11:58
>>927 $ gcc a.c これでコンパイルした時点でエラーがでました。
コンパイラのメーカーの中の人も大変だな
cpp・・・プリプロセッサがアクセス違反?
> メモリが"written"になることはできませんでした。 何度見てもこの酷い訳は笑える。
>>909 遅まきながらサンクスです。参考に致します。
ほかにコンパイルしたものを出力するコマンドってあるのですか??
>>934 コンパイルができてないのに、コンパイルしたものがあるわけないと思うのだが、どうだろう
936 :
デフォルトの名無しさん :03/03/10 12:38
./ ./ ./ ./ ./
どうも、926 と 929 の内容がつながらないのだが
938 :
デフォルトの名無しさん :03/03/10 12:46
>935 だな
Cygwinの環境がうまく動いてないだけみたいだがねぇ 手っ取り早いのが再インストールかな(苦笑)
940 :
デフォルトの名無しさん :03/03/10 12:52
>934 よくわからんがブンブン飛び回るハエだな
>>935 しかもコンパイルの段階にすら移っていない(苦笑)
あっ そうだ!!失礼。とにかくどうすれいいですかね??
944 :
デフォルトの名無しさん :03/03/10 13:27
「さいたまの野望」というシュミレーションゲーム つくってくんない?
Borland C++ Compiler 5.5.1で
>>912 の試したんだが、
結果は
>二乗は6.000000です。
>二乗は6.000000です。
>二乗は6です。
9になるほうがおかしいのでは?
951 :
なぜotherは表示されないのか :03/03/10 14:21
初心者でも挑戦できる問題でつ 口だけ上級者は解けません switch(n){ case 1:break; case 2:break; case 3:break; case 4:break; printf("1-4\n"); break; defualt: printf("other\n"); break; }
手元のgccだと、 ・最適化なし double マクロ 6 double 直書き 6 int マクロ 6 int 直書き 6 ・最適化あり double マクロ 6 double 直書き 6 int マクロ 9 int 直書き 9 となった。
956 :
デフォルトの名無しさん :03/03/10 14:26
字違ってるぞ。 default
defualt ( ´,_ゝ`)プッ
958 :
デフォルトの名無しさん :03/03/10 14:27
>>954 int n = 5;
にしても表示されなっっかたよ。
>>951 そもそもコンパイル通らないだろ(defualtがマクロなら話は別だが)
あ、すまん。単なるラベルとして見られるか
>>959 コンパイルは通るよ。
ラベルとして正しい文法だもん。
でも、まともなコンパイラなら使ってないラベルだぞって警告出るもんだが。
goto defualt; これで表示されるだろ。多分。
>>953 どんな警告?
出しようがないと思うけどなぁ。
> printf("1-4\n"); 嘘つきw
まあdefualtってのはわざとだろうな。 そんなものでひっかかるかよ。
制御が届きませんって警告も出るな。
968 :
デフォルトの名無しさん :03/03/10 14:34
字が違ってたのか… うちのBorland C++ 5.5.1 コンパイラは defualt:でも警告無しで通ったよ。 糞コンパイラだね。
ラベルだってば
色分け機能つきのエディタ使えよ・・・
>>968 警告レベルあげた?
予約語を色分け表示してくれるエディタを使えば?
ぬるぽだってば
んで、最適化するとswitch(){}が全部消えてなくなるのな。
クソ燃料の割には結構燃えてるな
きちんととやれよ
( `Д´) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V・∀・)/
>>973 (_フ彡 /
マ板からコピってくるのが面倒なんだよ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>977
釣られすぎや。
>>980 あー、バラしちゃダメだよそこ漏れのお気に入りなのに・・・
ぬるぬるぬるぽ って言ったら何回どつかれますか?
| | ガガガガガッ .人
( ・∀・) | | 人 < >__Λ∩
と ) | | 人 < >__Λ∩Д´)/
Y /ノ .人 < >__Λ∩Д´)/ / ←
>>982 / ) .人 < >__Λ ∩Д´)/ / ←
>>982 _/し' < >_Λ∩Д´)/ / ←
>>982 (_フ彡 V`Д´)/ / ←
>>982 / ←
>>982
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>985
会社でもプライベートでも、ぬるぽなんて言った事ないな
メンドクセーナ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>987
め。ゑ (ま°
こんなんで千取ったらどうすんだ! ( ・∀・) | | ガッ と ) | | Y /ノ 人 / ) < >__Λ∩ _/し' //. V`Д´)/ (_フ彡 / ←>>全員
ぬ
れ
て
サッサト、ウメタテロヤ
∧_∧ | | 人
( ・∀・) | | ガガガガッ 人 < >__Λ∩
と ) | | 人 < >__Λ∩Д´)/
Y /ノ .人 < >__Λ∩Д´)/ / ←
>>995 / ) .人 < >__Λ ∩Д´)/ / ←
>>996 _/し' < >_Λ∩Д´)/ / ←
>>997 (_フ彡 V`Д´)/ / ←
>>998 / ←
>>999
質問です 僕は何をききたかったんでしょうか?
あ
あ
あ
あ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。