1 :
デフォルトの名無しさん :
2011/03/09(水) 14:40:37.79
がっ
おつ
なななななんでや
次はテンプレにcodepadのリンク入れよう
8 :
デフォルトの名無しさん :2011/03/09(水) 20:36:46.04
やっと勃った
10 :
デフォルトの名無しさん :2011/03/09(水) 20:55:07.36
tes
最近C言語やりはじめたんですが、C++ってなんですか?参考書売場であったので、C言語とは関係ないんですか?
関係ある
C++はC言語の拡張版 って言う感じ
C++ == C + 1 だしなw
>>11 C を拡張した言語は沢山あって、C++ もそうだし、Objective-C とか D とか、
色んな言語が C を元にして生み出されてきました。C++ はそういった言語の
ひとつで、主に 1990 年代に隆盛した言語です。
16 :
デフォルトの名無しさん :2011/03/09(水) 21:50:35.17
ん? C++ == C か?
C++ = C; // 副作用二回で未定義 C++ == C; // 左辺と右辺の評価順が不定
> C++ == C; あれ? 左辺から右辺に評価かされるけど、左辺の副作の評価順が不定? 良く分からなくなってきた
&& と || と , と:?だけが例外的に副作用完了点を持つ
どこまでが不定で、どこからが未定義か分からなくなってきた K&RのころとC99で変わってる気もするから、今度確認しておこう…
とりあえず=と==では++使わない方がいいってことですね
質問はcodepad使って欲しいね。 あっちのほうが見やすい
>>19 ANSIから下も未定義じゃね?
C FAQに何か書いてあるっぽい。
C = C++ はうっかりするかもしれんけど、 C == C++ のほうはやりそうにないな。
>>23 違う
副作用がある演算を行った変数は、その前後の副作用完了点の間の他の場所では参照するなってこと
>>25 FAQの頃は、参照(比較)だけなら不定で、演算すると未定義だったはず
>>26 こんなことしないでくださいね
int i = ;
int *p = &i;
*p == i++;
>>27 副作用完了点をつければいいということは
この場合は
C++ , C=C;
C++ , C==C;
ということですね(`・ω・´)シャキーン
int bitCount(unsigned int i) { i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f; } ビットを数えていると思うんですが、動きがわかりません><
oh... >が三つになっているのはミスです
>>30 最初に2ビットずつ何ビットあるか計算して、
次に4ビットずつ何ビットあるか計算して、
更に8ビットずつ何ビットあるか計算して、
今度は16ビットずつ何ビットあるか計算して、
最後に32ビットに何ビットあるか計算しています。
>>30 i - ((i >> 1) & 0x55555555);
0x55555555ってのは0101010…以下略のビットが並んでる状態で
隣合う2ビット毎に、そこで立っているビット数を、その2ビット自身に格納
11 → 11 - 01 → 10
10 → 11 - 01 → 01
01 → 01 - 00 → 01
00 → 00 - 00 → 00
> (i & 0x33333333) + ((i >>> 2) & 0x33333333);
0x33333333ってのは00110011…以下略のビットが並んでる状態で
隣合う2ビット毎をペアにした計4ビット毎のビット数を、その4ビット自身に格納
xxyy → yy(下位2ビットのビット数) + xx(上位2ビットのビット数) → 0zzz(4ビットのビット数)
以降、同様に繰り返しているだけたが、最初のビットの数え方だけ違うのと
不要ビットの消し方も最適化してるから分かり辛いかも
以下、もともとの考え方
i = ((i & 0xaaaaaaaa) >> 1) + (i & 0x55555555);
i = ((i & 0xcccccccc) >> 2) + (i & 0x33333333);
i = ((i & 0xf0f0f0f0) >> 4) + (i & 0x0f0f0f0f);
i = ((i & 0xff00ff00) >> 8) + (i & 0x00ff00ff);
i = ((i & 0xffff0000) >> 16) + (i & 0x0000ffff);
return i;
で、これを最適化すると
>>30 になる
34 :
デフォルトの名無しさん :2011/03/10(木) 08:19:40.10
プログラム全体の時間量を計測して表示したいんですが どうしたらいいですか? #include<stdio.h> int main(void) {return(0);} このプログラムならどうなりますか?
つ[time]
並行処理(並列動作)するプログラム、すなわち、マルチスレッドプログラムのクリティカルなケースについて 前提: スレッドは2つ(スレッドA、スレッドB) A、B間で、データを受け渡しするために、共有メモリを使用する。(構造体M) しばり: ソースを自由に変更できるのは、スレッドBのみ。(スレッドAのソースは現在の実装を変更できない、スレッドBのソースのみを変更して、B,M,A間のデータの整合性を実現させたい。)
構造体Mの内容: ・データを格納する配列 : int a[L]; // L=1<<13 ・配列 a[] への、現在の書き込み先頭インデックス : int write_index; ・配列 a[] への、現在の読み込み先頭インデックス : int read_index; ・write_index 〜 read_index 間の距離(配列個数) : int count; ・Mの操作作法: write_index は 0 → L 方向に増加し、L 以上で 0 に戻り、循環する。 つまり、 write_index++ をする場合は、実際には write_index = (write_index+1) % L; もしくは(Lが(1<<x)の場合に限り)、 write_index = (write_index+1) & ~(L-1) read_index も write_index 同様。 count は、循環を考慮して計算する必要がある。(つまり単純に write_index - read_index では不正) Aの動作: まったく自由でランダムなタイミングで、a[read_index]からa[write_index]までのデータを参照する。 それに伴い、read_index と count の値も操作する。 Bの動作: まったく自由でランダムなタイミングで、a[write_index]にデータを書き込む。 それに伴い、write_index の値を操作する。 質問: B、M、Aの整合性を保つ方法。 つまり具体的に、 B の write_index (int)への書き込みは、スレッドセーフだと想定して良いのかどうか。(intel core2以降のCPUの動作として) すなわち、仮に write_index が実際には struct write_index {int a, b;} だとすれば、 a, b への変更は、タイミングにズレが生じるので問題だが、 (int)への書き込みの場合にも、このようなズレ(タイムラグ)は発生するのだろうか? つまりスレッドAが、(int)に0xFF を書く場合、スレッドA(CPU A)がLSB側3ビット目までしか書き終わってないタイミングで、 スレッドB(CPU B)がアクセスして、0x07として読み取る心配は不要なのかどうか。
謙虚きたよ^^
NEET?
>>38 質問の本質に対して話長杉w
現実世界でC言語で書かれた (write_index+1) % L や write_index = (write_index+1) & ~(L-1) が
アトミック性を持つ可能性はほぼ 0 なのでクリティカルセクションになる
Bがcount操作しないのおかしくね? 書いてある前提が全て正しければ、整合性は取れる
ちゃんと見てないけど、むしろcountがネックな気がした。
おちんちんびろーん
>>38 volatileでコンパイラ最適化抑制をしておかないと場合によってはハマる予感
つかコンパイルエラーって役に立つんですか?for()内の;忘れただけで 他の行にも複数エラーありの表示が出るんですが・・・ ピンポイントでここが違うんじゃないかという予想のエラー表示を して欲しいものです。
正 コンパイルエラーの通達表示
>>46 無いより有ったほうが良い 少なくともそれ以前はエラーじゃないことがわかる
エラー内容は役に立ちまくり。
>>46 ついでに予想して直してくれりゃ最高だなw
適切なエラーメッセージの表示は 非常に難しい分野
52 :
デフォルトの名無しさん :2011/03/11(金) 01:09:09.89
fgets関数を使った標準入力で、指定された範囲での入力を促す機能をつけよ うとしているのですがエラーがでます。どこがマズイんでしょうか? エラー E2034 0311.cpp 10: 'int' 型は 'char *' 型に変換できない(関数 main() ) エラー E2034 0311.cpp 10: 'int' 型は 'char *' 型に変換できない(関数 main() ) #include <stdio.h> int main(void) { char y[10]; printf( "1〜9999の間数字を入力してください \n" ); fgets( y, 10, stdin ); /* 標準入力から入力 */ while (1>y || 9999<y) { printf("1〜9999の間で入力してください。\n"); fgets( y, 10, stdin ); } puts(y); /* 入力された文字列を表示 */ return 0; }
宿題は宿題スレへ
>>52 数字と配列を比較しているのがまずい。
GCCしか手元に無いので試せてなくて申し訳ないが、たぶんVC++とかでも動く……はず。
#include <stdio.h>
int main(void){
char y[10];
/* 1と入力してEnterキー押してみ。 */
fgets(y, 10, stdin);
/*「2673946」なり「1438764」なり、妙な数字が出ると思う。この数字は「メモリ上の番地」を指している。
yには確保したメモリ領域の先頭の番地(数字)が入っている。
char y[10]って書いたら「xxxxxx番地から10バイト(char10コ分)のメモリ領域を確保せよ」の意味。ちなみに
y[0] = 「メモリ上のxxxxxx番地に記載されたデータを出せ」の意味。
y[1] = 「メモリ上のxxxxxx番地から1バイト先に記載されたデータを出せ」の意味。*/
printf("y = %d\n", y);
if (y == 1) {
printf("%d = 1\n", y);
}
else {
printf("%d != 1\n", y);
}
/* オマケ。 文字列の"1"を数字に直すと49。数字の49を見たら"1"って文字に直しましょうという「ASCII」仕様に拠る。
ttp://e-words.jp/p/r-ascii.html を参照のこと*/
printf("%cって文字は数字の%d。\n", y[0], y[0]);
return 0;
}
試してみ。
>>46 一個のテキストファイルしか扱わないならピンポイントでもいいんだわ。
1000コの.cファイルを扱うようなとき、「エラー一個見つけたら止まる」だと
直してコンパイルして直してコンパイルして……ってことになる。
そりゃ開発者側からすれば面倒なわけ。複数個のエラーがあるなら全部直した上でコンパイルしたいし、
エラーの箇所は大体知っておきたい。
だから大体のコンパイラは「他にもエラーが無いか探して、分かりえる限り全部のエラーを
プログラマーに示そうとする」ような作りになってる。
初心者から上級者まで全部を満足させるのは難しいわけね。仕様と思ってあきらめて。
初心者レベルなら一番初めのエラーだけ見ておけば済むと思う。
それなら、翻訳単位ごとに1個にしてださいよこの野郎
>>38 >つまりスレッドAが、(int)に0xFF を書く場合、スレッドA(CPU A)がLSB側3ビット目までしか書き終わってないタイミングで、 スレッドB(CPU B)がアクセスして、0x07として読み取る心配は不要なのかどうか。
x86系なら、bit単位でスライスされるなんてことないから、心配無用
まぁ、他の系統でも、そんな動作聞いたことないから大丈夫だとは思うが…
但し、bit単位でNGはありえないが、バイト単位でのNGはあり得るので
心配であれば、スレッドAのread_indexへの書き込みが、intと同じ大きさで
一回の命令で書き込まれているかを確認する必要がある
※たとえば、スレッドAのread_indexへの書き込み部の実装が、
1バイト単位でのコピーになってれば当然NG(普通はあり得ないが保障もない)
あとは、作った奴がアホで、スレッドAでread_indexやcountを変更後に
配列 a[]を読み込んでたり、スレッドbでread_index確認せずに、
スレッドAが参照する前に追い越したり(write_indexの書き換えタイミングも同様)
アホなことをしなければ大丈夫だと思われる。
>>46 ピンポイント予想が出来ないから、可能性のある場所全てが表示される
逆に考えれば、ピンポイント予想の一か所を外した場合、間違ってる箇所を探すのが大変
59 :
デフォルトの名無しさん :2011/03/11(金) 08:38:21.15
60 :
デフォルトの名無しさん :2011/03/11(金) 09:49:03.39
お!
61 :
デフォルトの名無しさん :2011/03/11(金) 11:48:30.48
>>57 もうすこし根は深いぞ
例えばスレッドAとBが同じint型変数を100回ずつインクリメントする
プログラムを実行したとして、必ずしも
変数の値が200増える保証はない
じゃエラー拾ったら雪崩れるかなって所の後ろにセミコロン連打しとけばいいじゃん。 怪しげコード;;;;;;;;;
構造体の宣言についての質問です。 typedef _tgaAAA{ ... }; typedef { ... }AAA; typedef _tgaAAA{ ... }AAA; これらの違いをお教えいただけますでしょうか・・・。
67 :
37 :2011/03/11(金) 19:04:29.83
テストしてみたところ、たしかに変数への書き込みがビット単位で分解される心配はしなくてもよいみたいです(CORE2)
スレッドA、Bは並列動作
ケース1 : スレッドB は 0 と -1 を交互に、 write_index へ一度に書き込む場合
http://ideone.com/Dn5SW ケース2 : スレッドB は 0 と -1 を交互に、 write_index へ複数ステップで書き込む場合
http://ideone.com/Tn0y1 ケース1と、ケース2では、スレッドBの動作が異なるだけで、あとはすべて同じです。
ケース1では、心配してたバイト単位での不整合は、起きないようです。(CORE2の場合)
ケース2では、書き込みが2回に分けて行われますが(上位16bit、下位16bit)、この場合、Aとの同期に失敗します。(Aは0か-1以外ならエラー表示)
ケース3 : ケース2の各スレッドの動作速度を下げた。(1マイクロ秒毎)
http://ideone.com/hA2tF ケース3の場合、動作速度以外はケース2と同じコードであるにも関わらず、実質、エラーが現れなくなりました。
(注:消えたではなく)
これは、おどろくべき事だと感じます… というか、並列プログラムのデバッグ・バグ再現の難しさを象徴してると思いました。
68 :
37 :2011/03/11(金) 19:11:06.33
(write_index +1)%L のタイミングも、実際には a=write_index; (a+1)%L; write_index = a; とすれば、 ケース1のように個々のIOはアトミックなので問題は出ないと思いますが、ご指摘のとうり、やはり懸念材料は count です。(変数操作が2つ以上あるということ。ケース2の例に相当) そのものズバリ、「スレッドAとBで100づつ増やしても200にならない」問題です。(スレッドAを変えられさえすれば…) また、 スレッドAでは、a[read_index+1]; read_index++; ではなく、ご察しのとうり(懸念どうり)、 read_index++; a[read_index]; の順序だったりします。(もともとシングルスレッド前提に書かれたコードなので) これは実質スレッドBの動作には直接影響は無いと考えられますが、やはりシングルスレッドの時には注意しなかった微妙な点までもが、プログラム中で意味を持つようになるのは厄介に感じますね… ある方法を思いついたのですが、アトミックが保証される動作に限定することで、A、B間での共有変数Mの操作に、セマフォ等を用いなくても可能になるのではないか? と思いました。が、実際にコード書いて検証はしてませんが。 count、write_index、read_index が、もしも128bitの配列として定義されてるのであれば、 書き込み、読み込みのインターフェースを限定し、そのインターフェース内でsseのmovで実現すれば、count と write_index を同時に書くことも可能になるかもしれないといことです。 (sseのmovはアトミックが保証されるのだろうか?がまだ不明ですが、保証される前提で考えてます。) しかし、実際、それにはスレッドAのMへのアクセスも、すべてインターフェース使用を前提として書き換える必要が出てくるので、やはり実際には無理です… (というか、スレッドAを書き換えられるとしても、セマフォではなく、sseレジスター128bit単位の方式の方が、セマフォでやるよりも効率の点でも良いような気がしますが、 果たしてsseのmovはbit単位で安全なのだろうか?等の懸念)
話が長いな
70 :
デフォルトの名無しさん :2011/03/11(金) 20:51:27.56
あいうえおと言う文字列を 16進数化するにはどういう方法を使えばいいのでしょうか
2バイトづつ読みこめばいいんじゃね
>70 「16進数化」とは何? そこから話が始まるぞ。
>>70 printfの%xとか、そういうレベル?
>>68 >そのものズバリ、「スレッドAとBで100づつ増やしても200にならない」問題です。(スレッドAを変えられさえすれば…)
そりゃ、両スレッドから同じ値をカウントアップすれば、吐かれるコードによってはそうなって当たり前。
今回の話では、スレッドBは共有のcountを更新する必要はない。
スレッドBでは、前回読み込み時のread_indexとcountはローカルのみで保存して
read_indexが前回の読み込み時と同じ場合のみ、ローカルのcountと共有メモリのcountを、比較すればOK
(もちろんcountの更新方法はスレッドAと同じ方法で実装すること→最適化に注意)
と言っても、read_index++; a[read_index]; の更新&読み込み順だと、何やっても無駄だけどね…
意味が分かり辛いため補足 >(もちろんcountの更新方法はスレッドAと同じ方法で実装すること→最適化に注意) ローカルのcountの更新は「前回のread_index」>「今回のread_index」もしくは、 「前回のread_index」==「今回のread_index」&&「ローカルcount」!=「共有count」 このcountの更新タイミングをスレッドAと同じタイミングで実装 って、これも分かり辛いか… まぁ、何となく分かってくれ
>>62 今回の話では、スレッドAが書いたものをスレッドBが読み込んで、
スレッドBが書いたものをスレッドAが読み込む仕様なので、そんな問題は起こらない。
>>68 あぁ、ゴメン。
何か変だと思ったら、countの仕様とか、read writeとか反対に考えてた
つー訳で色々と無理だから諦めろ
勘違いしてたお詫びに邪道だが、他の手を考えてみた スレッドAの仕様にもよるが、読み込む時にcountをキーにしてる(count==0なら何もしない) かつ、countが残っている限り、貪欲にデータを読み込む仕様であれば、 スレッドAをcount==0になるまで飢えさせて、データを渡す量を調整する手もある。 (countの確認→データの書き込み→write_index→countの更新順) また、スレッドBが重い処理で、調整が難しいなら、 安全にデータを渡すためのスレッドCを作ってブリッジすればOK。 まぁ、いかにも継ぎはぎになってしまうけどね
79 :
グループ :2011/03/12(土) 06:46:24.85
皆さんは何歳の時からC言語をやっていましたか?
>>75 複数スレッドから同じ変数を更新するなら、
全スレッドでアトミックなメモリ操作にしない限り
どんな小細工しても整合性を保つことは不可能。
すいません。全ての定数定義は#defineを使ったものよりconstを使ったものの方が良いんですか #define XXX 10 static const int YYY = 20; int main (void){ #define XXX 1000 printf("%d\n", XXX); // #undef XXX { static const int YYY = 2000; printf("%d\n", YYY); } printf("%d\n", XXX); printf("%d\n", YYY); return 0; }
マクロとconstは別物 何が良いのか分からんが"定数定義"ってならconst
>>82 コンパイラの最適化の能力にもよるが、const int a = 123; とすると、実際に a を格納する領域を確保する場合がある。
定数にメモリを確保することが可能性としてあっていいのならば、int const a = 123; としていい。
定数のためにメモリを確保することを絶対に避けたいのであれば #define でマクロ置換とすればいい。
整数の定数宣言であれば enum を使う流儀も最近みかける。
真っ赤な誓いいいいいいいいいいいいいいいいいいいいいいいい
>>82 コンパイラの最適化の能力にもよるが、const int a = 123; とすると、実際に a を格納する領域を確保する場合がある。
定数にメモリを確保することが可能性としてあっていいのならば、int const a = 123; としていい。
定数のためにメモリを確保することを絶対に避けたいのであれば #define でマクロ置換とすればいい。
整数の定数宣言であれば enum を使う流儀も最近みかける。
>>87 #defineかconstかどっちがいいか聞いてるだけじゃね?
型情報が使えるから const でいいなら const のほうがいい
90 :
デフォルトの名無しさん :2011/03/12(土) 13:38:48.37
>>82 その「良い」ってのが、どういう様をいうのかによる
おまえさんが聞きたいのは2個目の XXX と YYY がどうなるかってことじゃないか?
その実験でわかったろうが #define には # で始まらない構文にくらべて
独特の扱いにくさがあるよな
誰とは言わんが即値になるか数値リテラルになるかの保証はそんなに甘くないぜ
>>90 >誰とは言わんが即値になるか数値リテラルになるかの保証はそんなに甘くないぜ
kwsk
#define でも即値にならない場合があるの?
なるほどそれでは組み込み系などのリソースが貧弱な環境では#defineでやった方がよくてその他の潤沢な環境ならconstで定数定義した方がいいんすね あと定義の場所ですがヘッダーとかに書くんじゃなくて使いたい場所の直前とかで定義するのが良いんですかね void func(void) { int unko_val; unko_val = get_unko(); { static const int UNKO_MAX = 100; if(UNKO_MAX < unko_val){ delete_mylife(); } }
C99? それってコンパイル通るんか
なんか勘違いしてるね。
97 :
グループ :2011/03/12(土) 14:52:02.00
>>96 NGしてるから隠さないでちゃんと付けとけよ
つうかstaticなしだとスタックに領域確保する処理が無駄に走るからstaticつけるべきなんじゃないんすか
>>99 >スタックに領域確保する処理
というのは sp レジスタを定数分減らすことです。
これって一つでも他に auto 変数があれば不可避の動作ですから、static つけようとつけまいとほとんど差はありません。
101 :
デフォルトの名無しさん :2011/03/12(土) 21:10:32.31
>>81 readとwriteのスレッドに分かれてれば、両スレッドから同じ変数を更新する必要はない
ただし、
>>37 はスレッドAがcountを触ってしまってるため、その手が使えないって話が
>>77
>>82 定数を定義して使うのであればconst
定数を定義しないで使うのであればマクロ
スタックだとか即値だとかは環境依存なので、
xxxの環境で即値にするためには、どうすれば良い?
って質問であれば答えられるかもしれんが、
C言語の規格だけで、答えられるものではない。
104 :
デフォルトの名無しさん :2011/03/13(日) 04:48:28.98
pngファイルをバイナリで読み込ませて そのバイナリになったファイルをtxtで保存すると すごく大きい容量になるのですが これの解消法とかないですかね
>スタックに領域確保する処理が無駄に走るから ド素人に考え方です。
じゃあstaticつけない場合のメリットを言ってください
>>106 static なしであれば、環境が許せば即値で定数が表現できる。
static をつけると、つねにそのためのメモリが確保される。
サイズ的にどうということがないという環境であれば、どちらでも問題はないが、
C プログラムについては、制限の多い環境で使われることも念頭において、人は評価する傾向にあるようです。
即値ってのがよく分かりませんが const int XXX = 10; と書くとスタックを消費せずにXXXの文字列が10に置き換わる動作をする コンパイラもあるってことなんですか? 私の知識ではローカル変数はスタックにプッシュされるものだと思っていたんですが そうではない環境もあるということですか? それならスタック消費なしで型情報も持たせられるのでconstが最強ですね
#define XXX (int)10
マクロはファイルスコープ。enumの方が使いやすい。
112 :
デフォルトの名無しさん :2011/03/13(日) 11:52:10.43
System.Media.SoundPlayer startSoundPlayer = new System.Media.SoundPlayer(@"C:\Windows\Media\chord.wav"); というコードがあるんですが この場合startSoundPlayerというメモリコンテナに該当サウンドを代入している という認識でよろしいんですよね?
まさか関数定義マクロか?
enumの美しい使い方を教えれ
>私の知識ではローカル変数はスタックにプッシュされるものだと思っていたんですが 私の知識がすでに時代遅れです。
>>108 規格には何て書いてあるか調べたのか?
そして、それが全てだ。
すいません企画のありかを教えてください
規格とか気にする前に、コンパイルした汗とか見てみたら 知識あれば、できるなら、誰も苦労しないだろうに
ぶっちゃけ千回計算させてどっちが速いか調べたほうがいいんじゃね
外れた知識をどっから仕入れてるんだろうね?
>>120 時代遅れって、何時のどんなC言語処理系で「ローカル変数はスタックにプッシュ」が使われていたんだ?
>>126 ターゲットが Forth な C コンパイラ
128 :
デフォルトの名無しさん :2011/03/13(日) 17:09:44.15
これは痛いね 話の流れに static がでてきてるのに時代だってお(バンバン
>>127 なるほど、ネイティブコードじゃなくて仮想マシンターゲットですか。
なら、CILあたりも似たようなことをやっているので時代遅れでは無いのでは?
実際にはCじゃなくてC++/CLIになるけどね
過去を懐かしむ人が多いからね
132 :
デフォルトの名無しさん :2011/03/14(月) 17:44:58.85
クイックソートのプログラムソースのバリエーションと難しさは異常 while(t) { 略; t++; 略;} や while(t) { if(略){略;t++;} if(略){t++;略;} t++; } などでは、tは初期化されずに、常に新しい値が保存されては、 変化しますよね? goto文や再帰関数などでも変数の値は、常に新しく保存されて、 処理によって変化されますか? tが初期化されたり、保存が切れるような場合を教えてください・・・
>>132 頼むから日本語かC言語かのどちらかで質問してくれ
134 :
デフォルトの名無しさん :2011/03/14(月) 18:43:00.01
>>133 失礼しました・・
常に状況に応じて変化させなければいけない変数が多いというのに
whileやdo,for,ifなどの(){}などの関数構造がかなり複雑で、設定
が難しいなという事です。
どの段階で変数を設定したらいいのかなど良く分からないんです。
136 :
デフォルトの名無しさん :2011/03/14(月) 18:47:17.91
部分的に理解したいのかいな? 一部分のコード晒されても答えられる人はいないだろうに
138 :
デフォルトの名無しさん :2011/03/14(月) 19:27:45.07
多次元配列のイメージがちょっと分からないんですけども (3次元までは家イメージで分かるんですが) こんなイメージでいいのですか。配列の配列の配列の配列の配列の配列の配列の配列って感じですが。 EightDemensionArray[][][][][][] □□□□(1次元) ■ ■ ■△△△△△(3次元) ■ 〇 ■ 〇×××××××(5次元) ■ 〇 ★ ■ (4次元) ★@@@@@@@@@(7次元) ■ ★ ☆ ■ (6次元) ☆ (2次元) ☆ (8次元)
妄想が貧弱だね
大体あってる
そういう多次元配列ってカプセル化の概念で考えてる d1の中にはd2が複数個入ってる d2の中にはd3が複数個入ってる 袋の中に吹く論が入ってるだけ
配列の配列とポインタの配列の区別をつきそこねそうな図だな
143 :
デフォルトの名無しさん :2011/03/14(月) 22:21:50.36
>>138 そのまえに次元とは何かを理解する必要がありそうだな
大輔だろ
大体あってる
147 :
デフォルトの名無しさん :2011/03/15(火) 00:48:30.30
思うんだが、このスレの人は自分で考えたアルゴリズムとかそういう 技術?っていうのかネタっていうのか知らないけど、持ってるんですか?
>>147 誰かが考えたアルゴリズムに到達するだけ
「俺様オリジナル」とか言ってるのはすでに誰かが考えてる
>>147 その場で間に合わせのために
適当なアルゴリズムを捻り出すことは無いわけじゃないだろうが
ほとんどの問題は、ソートとか基本的なアルゴリズムの組み合わせで解決できる
自前のライブラリを持っている人は多いだろうと思う
捻り出すことをしないのが今の人。 何も考えないでコピペして、はまりますって感じ?
float A , B , C if( A == (B||C) ) で今A = Bがちゃんと入ってるのですがこのifを通りません。どうしてでしょうか?
Aと(B||C)が等しくないから
>>152 A=(BまたはC) じゃないんですか?
今A=Bなので
A=B=(BまたはC)って成立してるんじゃないんですか?
AがBもしくはCと等しい場合は、if(A == B || A == C)と書く
>>154 どういうとき(B||C)が1になるのでしょうか?
>>156 B が 0 以外 または C が 0 以外であるとき
ありがとうございました
次はきっと、「a == bのはずなのに等しいと判断してくれません。」かな。 その場合はfabs(a - b) < 1e-10で比較するといいよ、と。
下記Q&Aの回答に配列int a[10]に対して、
関数への変数の受け渡しについて
http://oshiete.goo.ne.jp/qa/6431580.html >int a[10];
>
>また「a」と「&a[0]」は「値は同じ」ですが「意味が違う」ので注意しましょう。
>例えば「a+1」と「(&a[0])+1」は「異なる値」になります。
との言及があります。
Borland C++ 5.5.1 for Win32で、「a+1」と「(&a[0])+1」の値を確かめたところ同じ値でした。
他のOSやコンパイラーでは異なる値になるのでしょうか?
>>160 意図は違うかもしれないけど、意味は同じです
a + 1と書いてしまうと、最早そのaはint *になってしまっているのでa + 1は正しく& a[1]と同じ値になります。 それは勿論、& a[0] + 1とも同じです。
164 :
デフォルトの名無しさん :2011/03/15(火) 17:32:46.90
クイックソートについてなんですが、qsortとライブラリがありますよね? ライブラリ使うのか、普通に配列とかスタックとか使ってクイックソート仕様 でやるのがいいのかどっちなんですか?
>>164 要求を満たすほうを使う
コード記述量が少なくなるほうを使う
信頼できるほうを使う
プログラム書くときに、printfとかscanfとか、わざわざ printf,scanfとか書くのが面倒臭いので、printfの場合は p("helloworld")とかscanfの場合はs("%d",&t)みたいに省略 したいんですができますか?
できます
>>167 ヘッダファイルにそういうライブラリを作るんでしょうか?
良く分かりません。
記述の省略化という観点から、こういう事してるプログラマーって
多いのでしょうか?皆さんどうですか?
>>168 そんな可読性を極端に落とすプログラマーなんて少ないはず
統合開発環境でも使って入力補完したほうがいい
そんな事したら見づらくなるからしないだろ 書くのは楽かもしれんけどな
>>169 printf("%d", x);→pdx
scanf("%d",&x);→sdx
みたいに省略化したいなと思ってましたw
やっぱり見づらくなるんですね。入力補完機能使ったほうがいいですよね。
>>168 C99なら
#define p(...) printf(__VA_ARGS__)
それより前なら
int p(const char *fmt, ...) {
va_list list;
int result;
va_start(list, fmt);
result = vprintf(fmt, list);
va_end(list);
return result;
}
>>164 qsortをクイックソートで実装しなさいという決まりはないので、もしかしたらクイックソートで
実装していないコンパイラがあるかもしれません。
なので、汎用性の高いコード+クイックソートでないと嫌という場合は自分で実装することになる
かもしれません。
>>172 あほなもん勧めるなよ
どうしてもやるなら
#define p printf
でいいだろ
>>164 関数ポインタの実行速度が気になるなら、自前でやるほうがいいよ
>>173 パラメータを調整したクイックソート&マージソートって実装はあるらしい
177 :
デフォルトの名無しさん :2011/03/15(火) 18:39:52.51
あるらしね
while(num){ num--; } ※{}内省略 この文の継続条件式はnumとしか書いてないのですが、num==1とnumって同様の意味なのでしょうか? num>10とか書いてあるなら分りますが、numだけとしか書いてないとどういう意味なのでしょうか?
while(num){ while(num!=0){
numが0になったら臨界です
>>178 while は条件式を評価した結果が 0 以外の場合にループする
あとはわかるな?
独学にしてはお粗末...
183 :
デフォルトの名無しさん :2011/03/16(水) 00:43:15.14
50パーセントの確率で成功するけど、めちゃくちゃ処理が早いとかいう アルゴリズム存在しますか?
シミュレーテッドアニーリングとか
>>183 バブルソート (の変形版)
ならソート済みデータに一つ追加しただけのときは早い
円周率を円に向かってランダムに点打って求める時とかw
>>183 奇数かどうかを判定するアルゴリズム
return i % 2; // 1回の計算を必要とする
return 0; // 1回も計算をする必要がない!高速!しかし成功率は50%
>>183 Bloom Filterのような確率的アルゴリズムは
アルゴリズムが満たすべき条件を緩める代わりに
他の性能が改善されていることが多い
>>188 めちゃくちゃ処理が早いと言うほどではない
まぁ、boolean返す関数で期待値として50%なら
それを決め打ちでtrueかfalseを返せば、めちゃめちゃ処理が早くなるかもしれない
194 :
デフォルトの名無しさん :2011/03/16(水) 06:05:01.41
ものすごく初歩的な質問で申し訳ないんですが、visual studio 2010 ExpressでCのプログラミングはできるのでしょうか? もし設定の変更が必要ならその手順も教えていただけたらありがたいです。お願いします。
コンパイル出来なかったの?
197 :
デフォルトの名無しさん :2011/03/16(水) 06:24:49.13
>>195 Visual C++を使ってWin32(?)で簡単なやつ組んでデバッグすると
1>------ ビルド開始: プロジェクト: hello2, 構成: Debug Win32 ------
1> hello2.cpp
1>d:\mison.d\visual studio 2010\projects\hello2\hello2\hello2.cpp(5): fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "StdAfx.h"' をソースに追加しましたか?
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
学校でやったときは,VSではなかったのですができてたんです・・・
>>196 ありがとうございます!参考にさせていただきます。
Ubuntuのgcc 4.4.3 で以下の文を書くと警告が発生しまた。 Cygwinのgcc 4.3.4では警告は出ません。 実行ファイルは問題なく生成されましたが、この書き方は推奨されていないのでしょうか? char *str = "test str"; printf(str); //strをそのまま渡すとUbuntuのgccでは警告が発生する //警告文 //format not a string literal and no format arguments printf("%s", str); //問題なし puts(str); //問題なし
>>198 strが指す先に、例えば"Hello! %d"なんて文字列がいると破綻するから警告されているのです。
printf()系のフォーマット文字列に(文字列リテラルでない)生のポインタを渡すのは充分注意が必要です。
>>199 詳しい説明ありがとうございました。
次からは注意して使ってみます。
Hello Worldの次のステップは何がいいですか?
203 :
デフォルトの名無しさん :2011/03/16(水) 09:57:19.05
>>194 たいていのコンパイラは拡張子を .c にするだけ
入門書を終えた後はどうすればいいんですか? 入門書:明解C 目標はギャルゲーを作ることです
なるほど!ダ・ワールドッ!!! の表示を出した後に、処理を休止するソフトのほうがいい ただしforループによる停止は不可とする。それは処理休止しているのではないからだ。 「forループが動いている事で操作を受け付けない」だけだから休止とは言わない。
207 :
デフォルトの名無しさん :2011/03/16(水) 14:09:51.29
最近、C言語を始めました。 C言語でスレッドを4つ作って、各スレッドからRS232CのCOMポートにアクセスすることは普通にできるのでしょうか? すみません、お願いします。
普通って?
>>207 Cではやったことはないが、できないということはないだろうな
ただ、1つのポートへ同時に複数スレッドの接続はできないだろうが
しかし、お前のレベルでマルチスレッドプログラミングはやめておけ
マルチスレッドはタイミング的な問題も発生しやすいからバグが見つけにくい
オブジェクトのきちんとした管理や場合によっては排他処理が必要になる
210 :
207 :2011/03/16(水) 15:25:18.32
ありがとうございます。 スレッド1はCOM1、スレッド2はCOM2、スレッド3はCOM3というように、一つのCOMに複数スレッドでアクセスはしません。 各スレッドごとに、CreateFile、SetComm?、Write?、Read?という一連のよくあるサンプルのようにかいたらできるのかなと思いまして。
CやC++をつかってておもうんだけど、ヘッダファイルがどうにかならんものかね。 まあ新しい言語作れって話になっちゃうんだろうけどさ。
けどさ。
Cゲンギ学んでるくせに、 「WindowsAPIやLinuxAPIを使わずに」 「規定秒だけ処理を休止して復帰させるプログラミ」 作れないやつが多い。 嘆かわしい事である。 やれました!とか言うから見てみるとforだし だからそれはfor動いている間、他の処理できてねえだろっていう。 あくまでマルチタスクOSのおかげで、他の処理ができているだけであって 「停止しているように見えてる間もCPUを使っている」のは間違いないのだ。 そういうのがダメ。 休止中はCPUを一切使わずに休止。 シングルタスクOSでも、休止中は他の事ができる。 そういうもの作れちゅうてんのに
CPUは動かないが 時間もしくはそれに相当するカウントを行う 最低でもそれができなきゃCを学ぶ意味はねえ----------------------------------------ッ ここまでいうとピ-------------------------ンと来るやつもいようが まさにそれである それをするためのCだ VBやJAVAではやれないだろ
ここで「?」ってなってるやつは アプリ系だな たわけども
>>213 ノンプリエンプティブなマルチタスクシステムをつくれとな?
まあCなら関数ポインタしってれば簡単につくれるとおもわれるが・・・。
これでよいのかい?
じぶんでおっきするのか、たにんにおっきさせてもらうかでちょいと違いがでるんだけど。
何言い出してんの?って意味で
219 :
デフォルトの名無しさん :2011/03/16(水) 16:39:14.21
CPUじゃなくてAPICにカウントさせりゃいいだけやな
>>219 その割り込みベクタに割り当てられたコードを実行しているわけだから、
CPUが停止しているという縛りははたせていないような・・・。
221 :
デフォルトの名無しさん :2011/03/16(水) 16:41:13.64
APICがカウントする アンダーフローしたら割り込みを発する 割り込み受け取ったCPUがおっきさせる 実に簡単なことだが、それをWindowsでやろうとするとカーネル側のドライバが要る。
222 :
デフォルトの名無しさん :2011/03/16(水) 16:43:08.32
>>220 どこまでも厳密に解釈すると、無理になるがのう
ゲンギとかプログラミとかが気になって「?」ってなってしまう
>>213 何を騒ぎたいのだ?
>休止中はCPUを一切使わずに休止。
>シングルタスクOSでも、休止中は他の事ができる。
休止っていうのはCPU使わないこと?
じゃ、他の事っていうのは誰がするの?
?そんなのCPUに決まってるじゃん
226 :
デフォルトの名無しさん :2011/03/16(水) 16:54:24.68
A起動 Aご就寝 B起動 A御起床 (とともにB死亡) A処理再開 こんなであろうさ
227 :
デフォルトの名無しさん :2011/03/16(水) 16:56:47.97
forでループしてると、A様がご就寝してるようで起きてる状態だからBが起動できない。
何だ、くだらねえ話だったか x86ならHLTしてinterrupt待ちってことね なら純粋なCでは無理、HLT命令が発行できないから
230 :
デフォルトの名無しさん :2011/03/16(水) 17:18:35.25
でもたまにゃやってみるのもいいやね 普段みんなCPUとメモリのことばかり気にするから、周辺チップ使おうって気にはならないよな。 あってもUSBかシリアルポートくらいなもの。 こういうとき、PowerPCだと超ラク。
ごめん揺れた インラインアセンブラ使えば寝ることは出来るけど 起きるタイミングは設定できないからsleepの実装は無理だよね あとOSが管理している以上、次のコンテキストに処理をゆずる というのは絶対にAPI叩かないと実現不可能だよね あってる?
>>229 何だ、
>>213 はアセンブラを学べと主張したかったのか
さすがにそこまでは行間を読めんかったw
233 :
デフォルトの名無しさん :2011/03/16(水) 17:23:21.97
#pragmaで実装できる奴もあるぞ。
>>231 x86だとring0にいなければHLT実行はできない
要はそのOS用のドライバーを書く必要がある
なのでAPI(Application Program Interface)は不要w
235 :
デフォルトの名無しさん :2011/03/16(水) 17:45:12.25
そもそもAPIってよ ハッキリ言えば要らないものなんだぞ。 ラップしてあるだけ。 OSが提供する機能 -> それを隠蔽したいために別名にする それがAPI。 例えば、printf()がCで提供されているが これをラップして print_to()とか、そんな名前の関数を作る それがAPIだ。直にprintf()やれば、APIなんか経由しなくてもいいのだが どうもモダンなOSは互換の問題を気にしているのか、隠したいらしい。
どうぞ御自由にOSなし環境で動かしてください
238 :
デフォルトの名無しさん :2011/03/16(水) 17:56:32.37
ザックリ言えばの話よ
すごいでちゅねー これが不遜メソッドでちゅかー
240 :
デフォルトの名無しさん :2011/03/16(水) 17:58:53.11
ひでーのになるとネイティブ -> API -> 社で決めたローカルAPI -> プロジェクトで決めた超ローカルAPI -> プログラマ なんてのもあるからな。 ここまで来ると、おまえどんだけオーバーヘッド好きやねん、って言わざるを得ない。
241 :
デフォルトの名無しさん :2011/03/16(水) 18:03:39.82
>>213 へー、おまえ作れるの?
上限と下限が両方ある時間的な保証はけっこう難問だぞ
CPU 使用権を明け渡すのではなく本当に CPU を休止状態にするウエイトもできるんだな?
ここまでトンチンカンな奴がいるなら、いくらラップしても足りないな いないほうがマシ
243 :
207 :2011/03/16(水) 18:09:53.77
すみません、初心者のプログラムでなく、スレ間違いかもしれませんでした。
Sleep なり sleep なり以外で CPU を休める方法ってあるの?
select とか poll とか
247 :
デフォルトの名無しさん :2011/03/17(木) 08:55:47.17
static void ttt(int x) という感じで、関数の前にstaticをつける理由はなんですか? どういう利点がありますか?
関数のスコープをコンパイル単位内に限定させます。 つまり、仮にソースファイル内でexit()なんて戯けた名前をつけていても 他のファイルの邪魔にはなりません。 また、gccなどではインライン展開を行なうためのヒントとしても使われます。 ∵他所から呼ばれないことが判っている関数なら実体がなくても困らない。
249 :
デフォルトの名無しさん :2011/03/17(木) 10:02:51.36
>>248 申し訳ないが
意味分からんwww
exit()って名前は、exit1;みたいなのがあるから、混合しやすいってこと?
やっぱプログラミングの基礎は自分で理解するに限る。
250 :
デフォルトの名無しさん :2011/03/17(木) 10:05:30.27
インライン展開とか入門したての人は言われても分からん。
251 :
デフォルトの名無しさん :2011/03/17(木) 10:13:58.68
他のファイルの邪魔にならないため> 2つのファイルで同じ名前の関数、ttt()が使われる時、それぞれのファイルで static ttt()とすればいいんですね?
名前空間が使えるシープラ最強ですね、わかります。
はじめまして 友人が書いたc言語のプログラムを手直しして javaに変換している仕事を頼まれたのですが コードが3,5kステップほどもあり非常に苦戦しています。 c言語で書かれたコードを解析しやすくするようなツールはありませんか?
255 :
デフォルトの名無しさん :2011/03/17(木) 15:26:37.51
staticな関数はグローバルな関数とは違うってことじゃダメかいな?
印刷ですか…w とりあえずなるべく早い段階で完成を目指してがんばりますw
情報系の学科の1回なんですが、アルゴリズムのチャート図や考え方を学んだ だけでそのアルゴリズムをプログラムを組んで実現できるのは普通でしょうか? 本に乗ってるソートのプログラミングのサンプル例はどれも直線的な考えじゃ思い浮かばない ような設定や、要領の良さがあります。 優秀な人で何も見ずに組んでる人はいますが、やはり本に載ってる例に比べたら 劣っています。そういうものでしょうか?
書いてる人のレベルによるでしょ。
mallocも変数
>>258 Doxygen。Graphvizもあれば関数ツリーもできるし、結構解析には有効よ。
詳しくは該当スレで。
解析するのに道具に頼るのはどうかと
へー手作業なんだー そういうのってコンバーターがあるのかと思ってた
単純なアルゴリズムの組み合わせでプログラムは組めると、軽く言うけど それが出来たら皆プログラマーになれるわけで。 C言語何て自由度高すぎて、初心者やプログラム例を初見じゃ理解すら、 出来ないと思うよ。 C言語の入門書は一週間で読めても、ソースを解読するのはかなり手こずる。
○ 初心者がプログラム例を初見しただけでは理解すら出来ないと思うよ。
1つのファイルの100行くらいのプログラムだと1時間で理解できたら かなり優秀な方。
階層構造が複雑だと40行くらいのプログラムでも1時間じゃ厳しくないか?
見辛いのは書いた方にも問題があるかも知れない
271 :
258 :2011/03/17(木) 19:44:48.02
道具があれば、解決するって発想が...
>>272 道具があれば頼る。道具が無ければ買う。道具が売ってなければ作る。
これが健全で正しいやり方じゃないか。
それがわかってる人はいいんだけど、なんとなく甘く考えてるような感じが...
1000行以上のプログラムは書いた人しか分からないですか?
>>275 普通に書いてあれば余裕で理解できる。
理解できないほどひどいのは書いた人も理解できない。
自然に難読化した書き方してるみたいだよ
プログラマー以外でプログラミングで食っていける方法ってありますか? プログラミング好きなんですが頭の回転遅いんでプログラマーは無理かと。 回答者の職業教えてください。
SEやってますがなにか。
自作のアイポンアプリやAndroidアプリを売れば良いんじゃね
>>278 40万円の教材を作るから買ってくれるかい?
5万円分くらいの仕事を発注することは保証するから
っていう商売にひっかかるなよ
283 :
279 :2011/03/17(木) 21:53:06.44
>>281 のんびりやってるから一千万はいかないよ。
284 :
デフォルトの名無しさん :2011/03/17(木) 22:00:16.58
>>266 自分がコンパイラになった気分でソースを個々に読み
自分がリンカーになった気分で全体を取り込んで、
最後に自分がCPUになった気分で実行状態を思い浮かべる。
これで10万行くらいのソースなら楽に解読出来る。
所詮人間の作ったモノだ。
285 :
デフォルトの名無しさん :2011/03/17(木) 22:17:01.11
サーバー管理とかじゃねー
>>284 へーすごいなー何時間ぐらいで出来るのー?
>>287 ざっと流れをつかむだけなら100時間もかからんのじゃね?
>>288 100時間とかなんだよそれ、それでも流れつかむだけだろ
全然楽じゃねーだろw一体何日かかるんだよ
100時間って……一行あたり3秒もかけられ無いような
何をしたくて解読してるかによって時間なんて全然違うだろうに
今スタックオーバーフローを利用した脆弱性攻撃のコード書いてるんだけど今ってどういう対策取られてんだろ? 戻りアドレスをニセのアドレスに書き換えるのがうまくいかん
294 :
279 :2011/03/18(金) 10:14:35.00
>>285 真に高度なプログラムと誰でも書けるようなプログラムの中間辺りかな。ニッチよニッチw
>>291 その見極めをするのに2週間はかかるよね という話
297 :
デフォルトの名無しさん :2011/03/18(金) 14:37:26.17
スタックオーバーフローとスタックオーバーランを混同している悪寒
C言語の勉強を始めたいのですが、オススメのフリーソフトを 教えてもらえないでしょうか? マイクロソフトのVisualなんとかは複雑すぎて、私には難しそうです。 入門以下ですいません…
linux入れてターミナルでgccでa.outしとけ
>>300 マクロを使うか
C++でテンプレートを使うか
>>300 何がしたいかよくわからんけど共用体使えないの?
引数の型が違う同名の関数を作れたような……?
304 :
デフォルトの名無しさん :2011/03/18(金) 17:53:10.28
307 :
デフォルトの名無しさん :2011/03/18(金) 18:34:31.62
C言語が難しすぎる。
310 :
デフォルトの名無しさん :2011/03/18(金) 20:29:25.67
>>308 openモードが間違っている
ios::app で OR を取りましょう
appで開くとシークが不可能になって、先頭にデータの個数を 出力できないと思うのですが・・・
312 :
デフォルトの名無しさん :2011/03/18(金) 22:16:06.23
>>311 appは書き込みの時のみファイルの最後に自動的にシークされます
読み込みもしたいのならios::inもORしておけばよいです
問題のプログラムはios::ateでopenしているので、ファイルを開いた
後にファイルの最後にseekするようになっています
Jout.seekp(0, ios::end);
で、自分でファイルの最後にseekしてから書き込みしているので、
既に書いた部分の上書きはされないと思います
app は書き込みポインタを移動しても必ず最後に書き込まれるフラグですよね でもそれじゃ困ります ファイルをオープンした後、ファイルの一番最初にシークして データの個数を書き込んでから、また最後にシークして新たなデータを追加しなければいけないので 具体的に説明すると、例えば一回目のデータを書き込むと 1 『追加データ1』 2回目は 2 『追加データ1』 『追加データ2』 って感じです ただ単にデータを追加するのではなく、一番最初にデータの個数を書き込みます データを表示させるときに、このデータの個数を読み込んで、個数分while文で表示するためです だから僕はあえてateにしてるんだと解釈してるんですが、違うんでしょうか?
C言語スレで続けるなよw
315 :
デフォルトの名無しさん :2011/03/19(土) 00:31:35.56
あと最後に一つだけ ios::nocreateは非標準ですので、動作は環境依存なので使わない方が無難です
C++で書かれたソースをCで書き直したいのですが、 ダブルコロンの置き換えがよく分かりません。 何の機能がCでは何に当たるのか、を調べる方法ありませんか。
c++覚えたほうが早いんじゃね?
>>317 当たるものはないよ
しいて言うなら命名規則で
アンダーバーやキャメル、プリフィックス、サフィックスなどで
工夫するぐらいしかない
CSTLなどありものの作法に倣うのが楽じゃないかな
>>317 C++ の :: は名前空間
C で名前空間相当の処理を行う場合は接頭辞を使う
接頭辞というのは、gtk_init(), gtk_main() の様に先頭の数文字を同じ単語で揃える事
接頭辞とそれ以外の部分は _ で繋ぐ
つまり、C++ の foo::bar は C で接頭辞を使うと foo_bar になる
ただし std::vector を C で std_vector とした所でそのまま動く訳じゃないよ
std_vector というのは C には存在していないから、自分で実装する必要がある
自分で実装するのは面倒なので、C++ から一行ずつ置き換えるという考えはやめて、
ファイル単位で大体似た様な処理を一から書いて行った方が良いと思われ
みなさんありがとう
>>309 298です。
2ちゃんねる使うの初めてだから、これでいいのだろうか。
レスありがとうございます。
ダウンロードしてみます
323 :
デフォルトの名無しさん :2011/03/19(土) 14:54:38.87
どういたしまして
内部リンケージのグローバル変数を関数越しに値が変更できるのって変に思うんだけど普通?
普通。
そっか。
327 :
313 :2011/03/19(土) 17:16:03.23
313です
ちゃんと
>>1 を読んでいませんでした
本当に申し訳ないです
>>315 さんの紹介してくださったスレで再度質問したいと思います
僕の質問に回答してくださった方、ありがとうございました
とても参考になりました
内部リンケージのグローバル変数 = private変数
ポインタってどんなときでも *があれば「そのアドレスにある値の操作」で なければ「アドレスそのものに対する操作」を 意味するという理解でいいのですか。
>329 だいぶ用語が粗っぽくて、何も理解できていないのではないかと思う。 単に「ポインタ」といっても、型、変数、値があることを意識しなくてはならない。 しかし、普通は文脈で判る場合が多く、単に「ポインタ」と言われる。 前の文章を書き直すと 「ポインタの値」に対して「前置単項演算子*」を適用して評価すると、 評価結果はポインタが指すオブジェクトである。
相手に理解させる気のない知識の垂れ流しってただのオナニーだよね
332 :
デフォルトの名無しさん :2011/03/20(日) 14:18:11.86
>>329 「どんなときでも」ではないが、当初それでいい
あとで出てくる char **argv; などは * があってもアドレスだったりするし
void *ptr; は * で値にすることができない
誰とは言わんが
> 「ポインタの値」に対して「前置単項演算子*」を適用して評価すると、
前置でない単項はないから安心しろ
こいつ冗長な形容で小難しく書き直しているだけで
話がほとんどピーマンだよ
おまわりさんこっちです
散!!!
336 :
デフォルトの名無しさん :2011/03/20(日) 15:45:13.95
消防レベルの自分にC言語がすごい分かりやすい サイトなどを教えてください。 関数とかわけわかりませんw
関数ってのは計算をしてくれる機械 y=f(x) のfだね
339 :
デフォルトの名無しさん :2011/03/20(日) 16:10:00.12
C
341 :
デフォルトの名無しさん :2011/03/20(日) 22:17:45.98
ポインタでつまづいてる初学者なんですけど、 勉強しながらある程度少しは実用的なプログラム習得できる書籍かサイトご存じでしょうか? AmazonのC言語関連書籍一通り見ましたが、しっくりくるのがなかったので。 仕事はプログラミング全く関係ないです。
ポインタの用法 第一ステップ:引数をポインタにして、関数で参照渡しに相当することが 出来るようになろう。 第二ステップ:malloc/freeで変数を動的に生成しよう。NULLの使い方も 学ぼう 第三ステップ:配列とポインタの意図的混同に関連する慣習を 学ぼう 第四ステップ:構造体のメンバにポインタを用いることにより リストや木などの高度なデータ型を取り扱えるようになろう。
第五ステップ:◆QZaw55cn4cのように皆に嫌われ者になろう。
344 :
330 :2011/03/21(月) 00:14:55.51
>331>332 たしかにいきなり小難しい説明をしてしまった。あとで読み返して、 まずったとおもった。申し訳ない。 しかし、正しい用語を使うことは正しい理解につながると思って、 あのような表現になっている。もう少し噛み砕くべきだった。 >329>332 >ポインタってどんなときでも*があれば >前置でない単項はないから安心しろ たしかに単行*は前置しか無いから冗長な表現だった。 しかし*は、(前置)単項演算子、二項演算子、ポインタ宣言子 として登場するので、意識してもらうために明示した。 >char **argv; などは * があってもアドレスだったりするし char **argv;の場合、 argvはchar *を指すポインタ それに間接演算子*を適用すると、評価結果は指している オブジェクトとなるので、その型がchar *になるだけで、 全く話は同じ。 >void *ptr; は * で値にすることができない void *のことは失念していた。指しているオブジェクトサイズが 不定である場合は演算子*,[]を適用できない。
×皆に嫌われ者になろう。 ○皆に嫌われる者になろう。
bitter smile
メモリ管理って誰がやんの? OS? ほしたら何でCでmallocしたメモリはフラングメントすんの? ガベージコレクションが必要な理由は? 言語? 言語は単にOSに頼んでメモリ割り当てしてもらっただけで それもなんか違う気もする
350 :
デフォルトの名無しさん :2011/03/21(月) 04:07:05.89
ていうか誰がメモリの本当のサイズを知ってるんだろうか 確保と開放を繰り返すとフラグメントする、ということは 確保されたぶんがそっくりそのまま開放されるというわけではないわけだ いくらか少ない量、ってことだろ このサイズは誰が知ってんの プログラマがmallocでサイズを数値で見れても信用ならないって事だろ
>>349 >メモリ管理って誰がやんの?
主に OS
ただし、malloc() に関してはリンクされたライブラリもかかわっている。
>ほしたら何でCでmallocしたメモリはフラングメントすんの?
malloc() したメモリは普通 OS には返さない。
そう仮定した場合、「malloc() したメモリがフラグメントを起こす」のなら、その原因は malloc() のアルゴリズム。
>言語は単にOSに頼んでメモリ割り当てしてもらっただけで
メモリは OS からもらうが、再利用は malloc() が管理する。
Mr.マロック (うっうっうっううー)
353 :
デフォルトの名無しさん :2011/03/21(月) 07:34:41.81
わりにこっちには、な〜〜〜んも教えてくれんよな 肝心なことなのに どうすんのさ
354 :
デフォルトの名無しさん :2011/03/21(月) 07:36:54.78
自分でやれってちゅうのもいいが、WindowsやLinuxだとサンダースがやらしてくれんだろ
355 :
デフォルトの名無しさん :2011/03/21(月) 07:43:28.44
やっぱし何ちゅうの? メモリは1ビットたりとも無駄にしたくないわけやん。 しないほうがよい。 「できないからやらない、知る必要がない」ではポロろgグラマー失格なわけやん。 こういうとき組み込みなら、iTronだなんだのメモリ管理には世話になっても 自分でできる下地があるわけで、軽減は出来る。 ならWindowsやその他でもそうすべきだ。
356 :
デフォルトの名無しさん :2011/03/21(月) 10:26:43.26
>>355 Windows はもともと、そういう思想だったんだよ
>>347 自分の頭が悪い点にズバリ切り込まれるとjokeって事にするのですね。
どこまで馬鹿なんだお前は
お前らみずほ銀行のくそシステム組やがってどうにかしやがれ!
再帰関数について質問です。 void merge(int first int last int *A) { if(){ center=(first+last)/2@ void merge(first center *A)A・・・前半起点マージ B void merge(center+1 last *A )C・・・後半起点マージ }} mainで呼び出した関数で中に二つの自分と同じ関数がある再帰構造を持ってます。 で良く分からないのですが Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。) 再帰関数だからA→□1→□2→・□n→・・→□2→□1→Bと戻ってきて次にCの作業 をするので、Cのcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか? そうなると帰納的にcenter=一定値になると思うのですが、何か違いますか?再帰関数がややこしくて仕方ありません・・・
>>358 少なくとも、俺は関わってない。
また、銀行系のシステムで、この手のトラブルの原因となるコードが
Cで実装されてることは、滅多にないと思われ。
>>361 はいC言語です、お願いします。
マージソートのプログラムで、centerは真ん中の配列の添え字ですかね。
再帰関数によって分けて分けて、で作業の末端までいったら
今度はくっつけてくっつけて戻ってくるというプログラムです。たぶん・・
>>359 よくわからんが
>Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致する
>Cのcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
merge が呼ばれるたびに新しく center が作られる
printf("%d %d %d\n", first, last, center);を追加してどういう順番で呼び出されてるか見ればいいだろ
無駄な比較が多いな
>>359 void merge( int first, int last, int *A ) {
if() {
int center; // static int center; // ではない
center = ( first + last ) / 2; // @
void merge( first, center, A ); // A・・・前半起点マージ
// B
void merge( center + 1, last, A ); // C・・・後半起点マージ
}
}
だと仮定して
>Cのcenterは、@、Aのcenterの値と一致するのでしょうか?(※まぁlastもなんですが置いときます。)
一致します
>再帰関数だからA→□1→□2→・□n→・・→□2→□1→Bと戻ってきて次にCの作業
>をするので、Cのcenterの値は□1の部分の作業で設定されたcenterの値じゃないんでしょうか?
centerの型がstaticの場合、再起先と呼出元のcenterの値の格納先が同じ場所となり、
あなたの予想通り、値を上書きしてしまいますが、
今回の場合、staticは使用しないと考えられるので、再起先のcenterの値の格納先と
呼出元のcenterの値の格納先は異なる場所となるため、@・AはCと一致します。
Mr.マロック (うっうっうっううー)
while (!feof(f1)) { ch = fgetc(f1); if (!feof(f1)) fputc(ch, temp); } 教本を読んでいてファイルの入出力の章でこのようなコードが出てきたのですが、 これだと例えば今f1はファイルの最後の文字の位置にあるとすると、 ch = fgetc(f1);でf1が示す位置が1つ先にずれEOFとなり、その後if(!feof(f1))でfputc(ch, temp);をするか判定しているので 最後の1文字がtempに出力されないで終わってしまう気がするのですがどうなんでしょうか。 実際コンパイルしてみると最後の文字までちゃんと出力されていたのですが…… 全ソースはこちらに上げておきました tp://ideone.com/pVv1S 宜しくお願いします。
>371 何故f1の全ての内容がtempに書きこまれるのかがわかりません。 >370にも書いたのですが、if(!feof(f1))があるとその前にfgetc(f1)でf1が示す位置が既に1つ先に進んでいるので、 if文の中のfputc(ch, temp)が実行される回数が1回足りないで処理が終了してしまう気がします。 自分がこの部分を書こうと思って以下のようなコードを書いたのですが(色々違うものが挟まってますが)、 これだとtempにf1の内容のあとFF 00 00 00....(tempのバイト数が4KBになるまで)まで出力してしまいました。 なぜfputc(ch, temp)を実行する前にif(!eof(f1))を判定しなければならないのか教えて頂ければと思います。 while (!feof(f1)) { ch = fgetc(f1); if(ferror(f1)) { puts("FILE1の読み込みエラー"); exit(2); } fputc(ch, temp); if(ferror(temp)) { puts("tempファイルの書き込みエラー"); exit(2); } }
1> screensource00103.cpp 1>d:\ワークステーション\ゲーム開発プロジェクト\rxz project laboratory\programs\rxz_ver0.01\screensource00103.cpp(40): error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 該当の場所 ・ ・ ・ (40)void bg_ctrl(){ (41) DrawGraph( 0 , 0 , Stage_BG , FALSE ) ; (42)} /* リファレンス注釈7参照 */ (43) ・ ・ ・
すいません。 誤爆です。すいません。 よく見てませんでしたすいません><;
feofは最後の一文字を読み込んだときじゃなくて、EOFを読み込んだときに1を返すから
>373 あー…これは読み込んでいるファイルの末端にEOFがないってことです…かね? しかしEOFがないのにどうやってfeof()で判断してるんでしょうか、わけがわからなく…
>376 EOFはどんなファイルの最後にもあるという勘違いをしてたようです、ありがとうございます 改めて考え直したのですが、そうするとif文は if (!feof(f1))ではなくif(!ferror(f1))ではないのでしょうか こうすればファイルの末端を超えたときその前のch = fgetc(f1);でエラーがでているはずで、処理を止めることができるという感じに これはまた違うのでしょうか、申し訳ないのですがが宜しくお願いします。
っとすいません、if(error(f1))でした…
feofはファイルを最後まで読み込んだかを判定する、つまりEOFを読み込んだかどうかを判定する関数 fgetc()でchにEOFが入った後じゃないとfeofは1を返さない
>380 例えばテキストファイルで今末端の位置にいるとき、 <1回目> while (!feof(f1)) { /* ファイルの末端での判定、当然実行される */ ch = fgetc(f1); /* chにファイルの末端の文字を代入*/ if (!feof(f1)) /* このときf1はファイルの末端の次にあるが、その読み出しはされていないのでfeof()は0を返す */ fputc(ch, temp); /* fputc()は行われる */ } <2回目> while (!feof(f1)) { /* ファイルの末端の次での判定、しかし上記と同様にしてfeof()は0を返し実行される */ ch = fgetc(f1); /* chにf1を代入しようとするが、末端を超えているので失敗し、EOF指示子がセットされる */ if (!feof(f1)) /* ここでfeof()はEOF指示子があるので1を返し、fputc()はスキップされる */ fputc(ch, temp); } <3回目> 上記と同様にして、while文は実行されず次の処理にうつる こういうことでよろしいでしょうか……
>>370 while (1) {
if (feof(f1))
break;
ch = fgetc(f1);
fputc(ch, temp);
}
>382 前の処理がファイルの末端の文字だったとして、いまf1、tempがファイルの末端の次の位置になっているとしますと、 <1回目> while (1) { if (feof(f1)) /* EOF指定子がないのでfeof()は0を返し、実行されない */ break; ch = fgetc(f1); /* f1はファイルの末端の次なのでch = fgetc(f1)が実行されchにEOF(-1)が代入され(調べ直したら失敗するわけではないですね)、 EOF指定子がセットされる */ fputc(ch, temp); /* fputc(ch, temp)は実行され、tempにEOFが書きこまれる */ } <2回目> if(feof(f1))で条件が真となり、while文を抜ける この場合だと結果的に>370でできるファイルの末尾にEOFが付加された形になるんでしょうか、解釈があっていればよいのですが
>>383 規格書読んで分からないなら
1つの標準関数ごとにデバッガ使ってトレースして
振る舞いを確かめるといいよ
IDEをつかえばコマンド覚えることなく誰にでも簡単に扱えるから。
>384 なるほど、了解です 一度落ち着いて整理し直し、色々試してみることにします
>>382 これはまずいです。
>>383 のような誤解を招きます。
for (;;) {
ch = fgetc(f1)
if (feof(f1))
break;
fputsc(ch, tmp);
}
とすべきです。読む→テストする→書く、というです。
C言語を始めたばかりの超初心者ですが、質問です。 strtokの返すアドレスというのは実質、文章の終わりまで置き換えが終わったかどうか確認するためだけに使うようなものなのでしょうか?
他の使い方もあります。と言うか他の使い方の方がメイン
そうなんですか 区切った記号までの文字列の先頭アドレスを返すと聞いたのですが、 例えばどのようなときに使うのでしょうか? よかったらお願いします
>>387 等価じゃないと思いますよ。
>>382 ビットパターン 0xff をディスクリプタ tmp に書いてしまいますよ。
ビットパターン0xff は EOF を示すascii 制御コードですらなく、
オリジナルのディスクリプタ f の指すファイルの内容とは、変わってしまいますよ。
>>381 ,383
その解釈であっています。
>>370 のリンク先は、致命的に間違っています。
char ch; ではなく int ch; が正しい。
あと while(!eof())うんぬんは、教科書によくあらわれる書き方です。(たとえば、ハーバードシルト先生は信念があるのかいつもこう書きます。)
while() を無理に使うとこう書かざるを得ないのですが、私見では、残念ながら eof() が重複してしまい無駄ですね。
てか、これってC言語の話題? C言語の標準ライブラリの仕様の話しだが、 今時C標準ライブラリが外部言語処理系に非公開な プラットフォームってまずない。 だからこれは微妙にこれはOSの標準ストリームの 仕様の話になりそうな件
関係ないよ。eof()を使うのがタコ。 int ch; while ((ch = fgetc(f1)) != EOF) { fputc(ch, tmp); }
>>383 EOFはファイルに書いてある値じゃないよ
既にファイルの最後まで読んでいるのになお更に読もうとした時にfgetc()が返してくる値
ファイルに書いてある値以外の値でEOFを表現しなければならないので、fgetc()の型はunsigned charじゃなくてint
ch = fgetc(f1);の次に即fputc(ch, temp);するのはまずい
>>395 アスキーコードのEOFにも対応しといてください。お願いします。
99BASIC
C言語において時間計算量について質問です。 マージソートの計算量は何故nlognなんですか? 例えば要素数16とします。 全て一つだけの配列に分けて、それを二つ配列にする比較回数が8回 二配列を四配列にする比較回数が3×4=12回 四配列を8配列 2×7=14回 最後8配列同士を比較して 15回 で合計49回ですよね? n=16のとき nlogn=1.2×16=19・・計算量19? 49とかけ離れてますよね?
>>398 色々間違っている気がするけど、一番の間違いはlog(10)≒2.3を1.2で計算していることだな。
あー、数字がおかしいので書き直し。
>>398 色々間違っている気がするけど、一番の間違いはlog(16)≒2.8を1.2で計算していることだな。
>>398 最適化のため、比較の最後のを一回省略しているが、それは省略しない
>全て一つだけの配列に分けて、それを二つ配列にする比較回数が8回
一配列を二配列にする比較回数が16回
>二配列を四配列にする比較回数が3×4=12回
二配列を四配列にする比較回数が4×4=16回
>四配列を8配列 2×7=14回
四配列を八配列にする比較回数が2×8=16回
>最後8配列同士を比較して 15回
八配列を十六配列にする比較回数が16回
合計64回
>n=16のとき
>nlogn=1.2×16=19・・計算量19?
マージソートの実装は2分割で行うのでlog2で計算
16*log2(16) = 16 * 4 = 64回
ピッタリですね
捕捉するが、比較の回数と言うより、
置き換えた(実際に置き換えなくても置き換えたと考える)回数なので、
比較を省略できても、置き換えは省略できないため
>>403 の計算量になる
>>366 のマージソートって、図は判りやすくていいんだが、サンプルコードが微妙だな
log16 = 4じゃないの?
もう一回だけ書くが計算量Oは比較の回数ではなく置き換える回数 ソートの実装が2分割になってるから、 16 * log2(16) = 16 * 4 = 64 ソートの実装が4分割(もちろん比較回数は増える)であれば 16 * log4(16) = 16 * 2 = 32 ソートの実装が16分割であれば 16 * log16(16) = 16 * 1 = 16
「あることを行うためにかかる時間」はどうやって計測すればいいですか。 あることを行うためのプランが3つあるとして、その中でどれが一番ボンバーヘッドが少ないか知りたいのですが どれも1秒未満で終わるので、時間の差を取得することでは精度のいい計測ができません。
おなじことを何度も繰り返してみる
410 :
デフォルトの名無しさん :2011/03/22(火) 17:36:28.69
>>408 もしかして オーバーヘッド
…は、ともかくとして
精度のいい計測がしたければ
きっちり同じ条件でテストする必要があるぞ
同じことを繰り返すと2回目以後はキャッシュが効いたりするし
ネットつないだままとかデフラグの時刻をまたいだりとか論外
つーか、大抵の環境でmsec単位のクロックが使えるだろ。 それがないなら、100万回でも1億回でも好きなだけ回せば充分精度は得られる。 後は、もし入力データが必要な場合にどういうデータにするかを検討しておくことだね。
質問です。 #include <stdio.h> int main() { int x = 0; while (x < 10) { printf("%d\n", x); x++; } int i; for (i = 0; i < 10; i++) { printf("%d\n", i); } return 0; } このプログラムで ';' が '型' の前にありません。 または'i' : 定義されていない識別子です。というエラーが表示されます。 int i;の位置を上に持っていったらエラーが消えるのですがC言語は変数を宣言する場所が決まっているのでしょうか? Visual C++ 2010を使っています。よろしくお願いします。
>>413 そうでしたか・・・
今まで一年間やってたのに知らなかったです。ありがとうございました。
>>414 C99では何処でも良いが、それ以前ではブロックの先頭
>>415 調べていたらそのようなことが書いていました。
今まで変数宣言の位置を気にせずプログラミング出来ていたため昔のバージョン?の設定になってしまったのかなと思っています。
C99に戻す方法がありましたら是非教えてください。
なんちゅうクソ仕様やで
まぁCなんてオワコンだから仕方ないよ
VCはC++ベースで書けるからね、いきなりエラーになったら、戸惑うかも...
>>416 うろ覚えだけど、プロジェクトの設定で Microsoft 言語拡張機能 だったかな
拡張子がcppだったというオチでは
>>403 >>407 非常に良く分かりました。全て置き換えた場合を考えるってことは
最悪計算量を想定してるのですか?
後時間量(time)は計算量にだいたい比例するのでしょうか?
例えば計算量、3log3である二つのプログラムを実行した時
処理時間は一緒でしょうか?
423 :
デフォルトの名無しさん :2011/03/23(水) 05:33:13.79
User CPU、 System CPU、 Idle CPUの各値を取得する方法を教えてください
>>422 >非常に良く分かりました。全て置き換えた場合を考えるってことは
>最悪計算量を想定してるのですか?
マージソートのアルゴリズムとしては、
置き換えても置き換えなくても回数は同じ。
トランプとかを使って実際にマージソートと
クイックソートを比較してみれば意味が分かるはず。
>後時間量(time)は計算量にだいたい比例するのでしょうか?
実装では、比較などの演算時間は0でないし、
何らかの最適化が入るので、計算量とは一致しない。
もし、比較の演算時間が0で、最適化が全く入らなければ、ほぼ一致する。
※ある程度の目安にはなる
>例えば計算量、3log3である二つのプログラムを実行した時
>処理時間は一緒でしょうか?
最適化次第
>>423 細かい環境を書いて値の定義をするか、他のスレに行って下さい
ゲーム(ノベル)を作ってみたいのですが、初心者にお勧めの教科書を教えてください
>>426 まずprintfだけで絵無しのADVを作るところから始めるといいよ。
そこが出来ればあとはDirectXなりGDIで絵をだすだけだよ。
音楽は割りと簡単にWindowsAPとかでならせる。
ひとまず絵や音は後回しにして作ることが次の一歩につながるよ。
428 :
デフォルトの名無しさん :2011/03/23(水) 18:35:53.80
計算量を求める時って、何を単位にしたらいいんですか? nlognとかO(1)とかよくわかりません。
DirectXてそんないきなり手出すもんか?
いきなり手を出せなんてかいてあったかいな?
>>428 >計算量を求める時って、何を単位にしたらいいんですか?
好きな単位にすれば?
>nlognとかO(1)とかよくわかりません。
Cの話題じゃない
数学板にでも行ってこい
432 :
デフォルトの名無しさん :2011/03/23(水) 20:08:15.01
>>431 いや違う違う、違います。
どんな単位で数えるじゃなくて、何を単位にするかです。
時間、作業量なのか、領域なのか。
作業量は、収納と判定がありますよね。
433 :
デフォルトの名無しさん :2011/03/23(水) 21:04:35.96
鍵ファイルにパスワードのハッシュ値の認証機能を付けて鍵に直接
アクセスできないようにしたいのですがうまくいきません。32バイト
のハッシュ値を先読みして、それから後続の16バイトの鍵を使おうと
思うのですが、ハッシュ値の認証で失敗したり、鍵生成が無限ループ
になったりします。何が原因か分かりません。どなたか教えてください。
よろしくお願いします。
http://codepad.org/nz55zSBj
>>432 >いや違う違う、違います。
何も違わない
>時間、作業量なのか、領域なのか。
だから時間でも作業量でもメモリでも好きな単位を使えば良い
何に対して何の為に計算量を求めるのかを知ってるのはお前さんだけ
お前さんが
>>398 ならソートの計算量の話だと考えるが別人だろ?
便乗なら、便乗と書け。
同一人物なら、何故上げる?
>>433 > while(a==0){
> printf("lx=%u trace 0\n",x);
> for(i=0;i<16;i++){
> s[i]=c1.m[i];
> s[i+16]=c2.m[i];
> }
> genkey(s,t);
> lk(t);
> fclose(fp);
> }
何をしたいか、良く分からんが、
取りあえず、無限ループするのは仕様に見えるが?
a変化しないね
438 :
デフォルトの名無しさん :2011/03/23(水) 22:12:47.27
genkey(s,t)は外部関数で、lk(t)は再帰呼び出しします。lk()から genkey()は呼び出されます。再帰呼び出しのときに値を買えて計算 し直しているので全ての値に対してaが0でない関数がいつか見つか るはずなのですがものすごく時間がかかります。また同じ値をハッシュ 関数に渡しているのに再帰呼び出しノアとに値が変わっているのは なぜでしょうか?よろしくお願いします。
439 :
デフォルトの名無しさん :2011/03/23(水) 22:26:04.85
>>435 処理時間を見積もる場合は、
アルゴリズムを考える上では収束と発散(≒ステップ数)、
仕様(実装)の段階では時間だな
もちろん、アルゴリズムを考える上でCPUの命令構造なんて考えないし
仕様(実装)の段階で、実機を無視したステップ数を計算しても意味がない。
ソートについても、計算量=命令実行回数(ステップ数)で
計算量を出してるのは見たことがない
普通は計算量=発散(n、n log n、n^2など)であらわす。
>>438 再起先でaが0以外になろうが、呼出元のaは0だから終わる訳がない。
>>420 レスが遅くなりました
ありがとうございました。
>>424 ありがとうございます。
置き換えるというより64個の要素を64個の場所にしきつめる作業ということで
理解しました。
比較などの演算時間、ポインタや配列を使う事によって領域量や時間量は変わって
きますよね。
>>443 所要時間が n秒 だろうと 1000n秒 だろうと計算のオーダーは O(n) と表記することになってる
445 :
デフォルトの名無しさん :2011/03/23(水) 22:54:54.12
再帰先っていうのは、一度ループから抜けますよね。 その時aは再計算されて0かどうか比較されるのではないですか?
>>445 >再帰先っていうのは、一度ループから抜けますよね。
何を言いたいのか分からんが、呼出元の
>>436 でループではaは0のまま
再起先で変更したものを、呼出元で変更したければ、aの値を返して
aの値を変更するか、aをstaticにすれば良い。
って言うか、このコードで再起する意味が分からん。
>>445 そのあと帰ってきたときに0のままでしょ
>>443 >置き換えるというより64個の要素を64個の場所にしきつめる作業ということで
>理解しました。
大体そんな認識でOK
>比較などの演算時間、ポインタや配列を使う事によって領域量や時間量は変わって
>きますよね。
これも、大体そんな認識でOK
基本的にnがある程度の範囲に収まっていればnlognで計算した値に近いものになるが、
実際に処理に必要な時間を計算しようとすると、
キャッシュにのる量か否か、メモリにのるか量か否かなど、実機に大きく左右される。
と言う訳で、アルゴリズムで考える場合はnlognなと、
あるステップを、どの程度の回数繰り返すのか?ってことだけを表す。
449 :
デフォルトの名無しさん :2011/03/24(木) 00:05:40.07
>>448 とてもわかりやすいです、ありがとうございました^^
条件判定の作業量も、置き換える作業量とあんまり変わらないですよね。
加味しないんですね。
2nlognとnlognだと作業効率違いませんか。
450 :
デフォルトの名無しさん :2011/03/24(木) 00:11:48.08
ループを別関数にしてif(a==0)で分岐させ、再帰呼び出しを避けたら なくなりましたが答えが不安です。そんなに一発で見つかるものなの だろうかと。 for(x=0;x<256;x++){ a=f(x); if(a==0){lkb(); break;} } 見たいな感じです。
>>450 >>433 が開かないから確認できないが、多分、そのforのbreakはおかしい。
そこでやるなら、returnのはず。
そもそも、考え方がおかしいので、落ち着いて1から考え直せ。
>>449 >2nlognとnlognだと作業効率違いませんか。
計算量Oはアルゴリズムとしての評価をするための記法。
各アルゴリズムや実装方法によって、計算の基準となる
O(1)(一回当たり)の期待値(クロックや時間など)が大きく異なり、
係数を持つことは、あまり意味を持たないから、
「2nlogn」も「nlogn」も同じ「nlogn」と表記する。
で、実機の負荷の概算は、計算量OにO(1)の期待値を掛けて、
必要であれば+αなどして出す。
ちなみに「nlogn+n」のような場合、nの値が大きくなると「n」は
無視できるほど小さくなるので、これも「nlogn」と表記する。
捕捉として >で、実機の負荷の概算は、計算量OにO(1)の期待値を掛けて、 の「O(1)」は、元が2nlognなら、「2・O(1)」に相当する ※正確には、その「2・O(1)」が、そのアルゴリズムの「O(1)」の期待値となる
O記法には数学的な定義があるが、 あまり深く考えなくても実用できる 「大まかな振る舞い」を示すようなものだと思っておけば十分
455 :
デフォルトの名無しさん :2011/03/24(木) 03:38:45.76
>>452 夜分遅く
ありがとうございます。
非常に分かりやすいです。
でも計算の基準によって、nlognやn^nみたいに、全く次元の違う
計算量になったりすることはないんですか?
1000<n<3000まではnlogn
3000<n<10000まではn^3
100000<n<1000000でn^3×logn
10000000<n<1000000000でまたnlogn
みたいな。
456 :
デフォルトの名無しさん :2011/03/24(木) 03:43:40.00
すいません計算の基準や、nの大きさです。
>>455 ならない。
それはアルゴリズムとしておかしいか、条件によって、アルゴリズムを条件で使い分けてる場合のみ。
ちなみに、O(1)は定数なので、
>>456 にnやlognが出てくるのはありえない。(nの値によってOの表記の方が変わる)
458 :
デフォルトの名無しさん :2011/03/24(木) 19:53:14.24
関数のクローンを作りたいのですが、可能ですか? func1()とfunc2()を同じ処理にしたいという感じです。 二つだと、同じ処理をコピペすればよいが、多数あるときはどうすればよいでしょうか?
>>458 #define func3 func1
460 :
デフォルトの名無しさん :2011/03/24(木) 19:58:34.10
>>459 数が未定なので、動的に関数のクローンを生成したいのです
462 :
デフォルトの名無しさん :2011/03/24(木) 20:01:48.75
>>461 関数ポインタでは困るので、クローンしたいのです。
メモリ上に同じ処理を複数作りたいのです。
>>462 関数ポインタで困るってことは静的な値を使ってたりして、
呼び出し元毎にユニークにしたいのか?
だとすると、無理。(環境依存なら出来るかも知れんが)
まぁ、実装の方を工夫するべき。
464 :
458 :2011/03/24(木) 20:07:12.54
このような感じの処理を行う方法はあるでしょうか? func2 = malloc(sizeof(func1)); memcpy(func2, func1, sizeof(func1));
465 :
デフォルトの名無しさん :2011/03/24(木) 20:08:55.01
>>463 C++風なクラスの関数を作りたいのです。
関数ポインタだと同じ先を指すので、上手くいかないと思いまして…
(C++で実装されているものと、同じような機能をCで提供したい
466 :
デフォルトの名無しさん :2011/03/24(木) 20:10:42.24
>>458 動的(実行中)に関数(命令列)を作る(書き換える)ということか
単にイメージを複製しても位置独立でない可能性を C の範疇では否定できないので
やるならアセンブラだね
>>465 >C++風なクラスの関数を作りたいのです。
テンプレートみたいなもの?
それとも、継承みたいなもの?
前者なら無理。
後者なら同じ先を指して問題ないはず。
※静的な値を使ってなければ
468 :
デフォルトの名無しさん :2011/03/24(木) 20:14:59.23
>>467 後者です。
入門者ですみません。
同じアドレスの関数を実行して、
複数のプロセスやスレッドに実行された場合、正常に動作可能でしょうか?
469 :
デフォルトの名無しさん :2011/03/24(木) 20:16:01.14
>>465 C++ の関数オブジェクトに相当するものなら構造体で作れる
特に変わったテクニックは必要なく素直に作れる
470 :
デフォルトの名無しさん :2011/03/24(木) 20:17:34.39
>>469 単一のプロセスやスレッドならば、関数ポインタで大丈夫なのは理解しておりますが、
複数から呼ばれた場合、問題ないですか?
471 :
デフォルトの名無しさん :2011/03/24(木) 20:17:38.51
>>468 マルチスレッドはCで環境依存の問題。
基本的には、各環境でスレッドセーフに作れば、
同じ関数で、問題ない(何度も書くが静的変数を含まなければ)
473 :
デフォルトの名無しさん :2011/03/24(木) 20:21:09.91
スレッドとか、プロセスなど環境に関係なしに安全を保証する手立てとして 関数のクローンが作れたら良いと思ったのですが、話を聞いていると無理っぽいですね
474 :
デフォルトの名無しさん :2011/03/24(木) 20:22:35.86
>>471 入門編と言う事でお聞きしたのですが、再入可能って難しい概念ですね。。
475 :
デフォルトの名無しさん :2011/03/24(木) 20:23:58.17
>>470 そんならコード自体が別である必要はなさそうだな
データがアクションごとに用意されていればいいんじゃないか?
>>473 無理です。
実装の方で工夫して下さい。
477 :
デフォルトの名無しさん :2011/03/24(木) 20:26:36.63
>>476 ありがとうございます。
否定されると、返って開き直れます。
C++と同じI/Fを提供する手立てがないかと探していましたが、
別の道を探ってみます。
>>474 そんなに難しくない。
自分が書いたプログラム内で、静的変数を使用しない。
後は、そのプログラムから呼び出している関数が、スレッドセーフである。
この2点のみ満たせばOK。
>>473 技術的に可能と能力的に可能は別物
JITとかの動的コード生成ができているので技術的には可能
480 :
デフォルトの名無しさん :2011/03/24(木) 20:31:10.78
>>479 ありがとう。
JITというものは知りませんでした。
可能なら、手だてを考えます
>>479 アホ言うな。
お前さんが言ってるのは、入門者に対して
新しいC言語作れって言ってるのに等しい。
>>481 だから最初に「技術的に可能と能力的に可能は別物」と書いてある。よく読めカス
>>478 >後は、そのプログラムから呼び出している関数が、スレッドセーフである。
スレッドセーフじゃなくて再入可能な
484 :
デフォルトの名無しさん :2011/03/24(木) 20:42:10.24
>>474 誰もが通る試練(大げさだが)だよ
クリアできるかどうかは
おまえさん次第だ
485 :
デフォルトの名無しさん :2011/03/24(木) 20:42:41.34
>>485 違う。C言語でも 技・術・的 には可能。でも 素・人 には無理
>>482 入門者に対してJITコンパイラ作れって言ってるお前さんほどじゃないよ
>>483 そうだね
何で間違えたんだろう…
488 :
デフォルトの名無しさん :2011/03/24(木) 20:47:30.46
>>486 今の俺のスキルでは到底無理な事という事ですね。
>>485 単純にC言語では無理。
環境依存であれば、環境次第。
環境に依存しないのであれば、仮想マシンをC言語で作って
さらに、その仮想マシン上で動いて、
>>473 を満たすCコンパイラを作ればOK。
>>489 ありがとう。
標準ライブラリのみのCで作るには、それなりの手腕が必要である事は理解できました。
>>490 >標準ライブラリのみのCで作るには、それなりの手腕が必要である事は理解できました。
どんな腕があろうと、環境依存しなきゃ無理。
関数名や変数名がそのままコメント代わりになっているようなプログラムをわたしは美しいとおもう
意味を重視すると長くなりやすいし、短さ優先するとわけわかんなくなるしでバランスとるのが難しい
本当に関数のクローンを必要としているわけではなくて、別に目的があってその手段が関数の複製しかないと思い込んでいるパターンだろ
>>494 途中でリエントラントの話に脱線してるが、
基本的には環境に依存しないスレッドセーフを提供するための手段らしい
ビジーループ回して良けりゃ適当な排他アルゴリズム使えばいけるか
初期のC++コンパイラは一旦C言語ソースに変換してたらしいし、 C言語の範疇で原始的なC++的なことはできるだろJK
最近優しいC第3版を読みだして現在Lesson4まで終わって次からLesson5に入る所です。 ユーザーの入力した文字を受け取る関数としてgetchar()が書いていたのですが、文字列を受け取る方法が書かれていませんでした。 もしかしたらこの先に書かれているのかもしれませんが、自分的にはLEsson5から条件分岐や繰り返し処理にはいるそうで、その前に知っておきたいので、文字列を受け取る関数を教えていただけないでしょうか まだ試してないと言うか、違うと思っているので試すつもりもないのですが、文字列と文字は違うと言う事なので、getchar()で文字列を受け取っても多分バグ?りますよね?
fgetsとか
>>498 C言語では文字の配列が文字列だから配列を理解して処理すれば大丈夫
>>500 なるほど
配列を見てみましたがLesson6でようやくでてくる単元のようです。
Lesson6まで楽しみにとっておこうとおもいます
回答ありがとうございました
504 :
デフォルトの名無しさん :2011/03/25(金) 16:43:54.78
>>503 そのサイト主よりおまえさんのほうがきれいなコード書けてるが
ただしポインタを int に変換した結果は処理系定義なので
sizeof(int) を回避してまでそう書くことの優位性はない
506 :
デフォルトの名無しさん :2011/03/25(金) 19:20:35.48
秘密鍵に32バイトの認証ハッシュ値をつけて、アクセス時にパスワードで
認証する機能をつけたいのですがうまくいきません。秘密鍵の計算方法が
正しいかどうかもわからないので公開します。lkbを呼び出すとループの
値が0にリセットされて無限ループになります。機能は動いたはずなのに
今朝動かしたら動かなくなっていました。下にソースのアドレスを書きます。
わかる人がいたらよろしくお願いします。
http://codepad.org/55oSSY2H
codepadめちゃくちゃ重いな
508 :
デフォルトの名無しさん :2011/03/25(金) 20:03:02.20
こんな感じです。 //ファイルkey.binに秘密鍵を書き込む。 void genkey(unsigned char str[256],unsigned char tt[256]){ FILE *fp; int i; fp=fopen("key.bin","wb"); hash(str); fwrite(c1.dd,1,16,fp); fwrite(c2.dd,1,16,fp); fclose(fp); } //関数の値が0だったらもう一度秘密鍵の計算をやり直す void lkb(unsigned char t[256],int x){ unsigned char str[16],m[32],s[256]; int i,a; FILE *fp; flag=0; for(i=0;i<16;i++){ s[i]=c1.m[i]; s[i+16]=c2.m[i]; } genkey(s,t); lk(t); if(mode==2) kk(t); }
>>503 >ans = (int)&(((int*)0)[1]);
これは、Cを規格通り覚えたいなら、やっちゃ駄目な典型
どんな環境でも正しくサイズを取得する場合はsizeofを使う
>>506 またお前か
取りあえず、作り直した方が早いよ
考え方としては、キーを再生成する可能性があるなら、その部分は暗号化の前に終わらせておく。
その為に、暗号化の部分に入ってる、キー再生成の条件を出すコード(aの演算)は別関数にする。
それだけで、見通しが良くなって、何が悪いのかも分かりやすくなる。
511 :
デフォルトの名無しさん :2011/03/25(金) 20:55:47.71
どう作り直せばいいのかわかりません;;
>>511 取りあえず、他のスレに書いた質問を全て終わらせてこい
※前回の質問やりっ放しも含む
513 :
デフォルトの名無しさん :2011/03/25(金) 21:09:09.40
前回の質問の続きで、while文をifに変えて、別関数にしたら動いた と思ったんですけど、今朝見たら動かなかったんです。
マルチうざい
515 :
デフォルトの名無しさん :2011/03/25(金) 21:21:55.66
>>509 おまえ &*(int *)0 を「やっちゃ駄目」だと思ってるだろw
Perl使えよお前ら! Perlはハッカー御用達だぜ!?
クラッカー食べたいです
521 :
デフォルトの名無しさん :2011/03/25(金) 23:07:35.23
バッカー
522 :
謙虚フロンティア戦士 :2011/03/26(土) 09:57:35.24
おちんちんびろーん
ビッツシフツ(複数形かつ動態形) ってなして嫌われるとですか?
質問。使用コンパイラVC++2010(C++独自のクラスとかは一切使ってない。C++とかはそもそもしらん) コンパイルしたらなんか下記のエラー出る… 誰か助け・・・て・・・ error LNK2005: "int * Player1" (?Player1@@3PAHA) は既に functioncode00102.obj で定義されています。 int Player1はヘッダーの中で定義している変数名です。 ファイルは“algrithm.cpp”、“mainsource.cpp”、“functioncode.cpp”、“func_header.h”で cppファイルはそれぞれ#include func_header.hでヘッダーファイル取り込み。 変数とか構造体の定義は全部ヘッダーファイル内で行っています。cppファイルでは一切定義しておりません。デバッグの事を考えて変数は全て1ファイルに収めた方がいいと考えたからです。 で、これで多重インクルードってのがあるんでしょ? だから#ifndef定義とか使って対策した。 その他…ヘッダーの中にstaticはないです。 そしたら↑のエラーメッセージ吐いてきたんだが、もう対策方法がわからん。 そのエラーコードはググったんだけどよくわかんねw 同じ事を質問してる人いたけどよく分からん単語ばっかり言ってて参考にもならねぇわ…(´・ω・)
どれかのcppに int Player1; 書いて ヘッダーには extern int Player1; 書く
#include ってのは単に指定したファイルの中身を書いた場所にぶちまけるだけ int Player1をヘッダーに書いて複数ファイルからinclude すると インクルードしただけint Player1が作られるということ
>>レスさん 出来た…でもさ… やっぱりcppに宣言かかないと無理なのか…?
>>528 .hに宣言、.cppに定義だっちゅうに
どうしても変数定義だけを別けたいならそれ専用の.cppを作れば
player.cにint Player1を書いてplayer.hにPlayer1の操作関数を書いて Player1を使いたいcppでplayer.hをincludeして関数経由でint Player1を操作
プロトタイプをヘッダに書くかソースに書くかで揉めることも しば しば。 どーでもええがなンなもん
>>532 static(extern)の有無でいいんじゃないの?
C言語のファイルに関してのプログラムについて質問!
ファイルの中の文字列の置き換え
test.txtというテキストファイルの"dog"という文字列をすべて"rabbit"に変換し、
rabbit.txtという名前で保存するプログラムである。
http://codepad.org/IRMS82LF ●のところが文字列を置き換える処理らしいんだけど、
これ何?アドレスの足し算、引き算してんの?
教えてください。エロい人さん。
クソコードだなw
>>534 面倒だからちゃんとコンパイルできる形で登録しろよ。
で、問題の3行はこれと同じ。
sprintf(bufw, "%.*s%s%s", p - bufr, bufr, str2, p + strlen(str1));
どうでもいいけどそのプログラムは最後の行が重複するバグがあるぞ。
{...,'d','o','g','\0'}なときもバグるんじゃないのかな
一行に複数あっても変換されるのは最初だけ
540 :
デフォルトの名無しさん :2011/03/28(月) 11:07:19.92
Cって覚える事が少ないって聞いたことありますが本当にそうなんですか? Windows APIとかたくさんありすぎて丸暗記できないのですが
APIとかは言語自体ではないから、Cの言語だけの話ならそうかもな
542 :
デフォルトの名無しさん :2011/03/28(月) 11:54:19.89
そういうことだったんですね Cはやっぱり勉強して損はないですか? あと初心者からCを覚えきるまで何時間掛かりますか? 秀丸エディタで勉強しても大丈夫ですか? やっぱりVC++をインストールしないとダメですか? いちおうBCCいれてます
おまえは自分の行動すらいちいちママにきいてんのか? どこの首相だよ
損得は自分で判断したまえ 50時間ほどあればいいんじゃね 何エディタでもいいよ もうBCC動いてるんなら面倒だろうしそれで問題ない
545 :
デフォルトの名無しさん :2011/03/28(月) 13:08:25.57
入門サイトは苦しんで覚えるC言語はいいですか?
まずは日本語から勉強してください
入門書買ってやった方がいいと思う 俺も初心者だから偉そうなこと言えないけど
>>545 間違いがあるし、判り難い。文字通り苦しんで覚えたいなら止めないけれど。
苦しんで覚えた方が、いい場合もある。 たまに、「XXXX入門書終わりましたが、プログラムが作れません。」 と言う初心者が現れる。 おまえ、入門書を眺めて、サンプルCDから実行しただけじゃないかと小一時間突っ込みたい。
実際入門サイトで何か一つ選ぶなら何がいいんだろう 自分は「猫でも分かる」と「ゲームプログラミングの館」ってとこ使ってたけど、やっぱ入門書が一番だったな もっといいところ無いんだろうか
一つを選ぶ、という発想が馬鹿だよね、そんな奴PGにむいてないよ
552 :
デフォルトの名無しさん :2011/03/28(月) 16:42:50.69
>>552 そのサイトの手順を0からやってれば、そんな質問出ないはず。
仮に、0からやってて、その段階で、その質問が出てきたのなら、C言語あきらめた方が良い。
質問スレで上から目線わろち
一貫して重宝するのは「正しい」標準ライブラリの解説やサンプルがあるところだな 解説や使い方が正しくないサイトは全てが疑わしくなる 筆者がC言語を理解できてないことの証明だから
過去スレに 副作用完了点の取り扱いが怪しいサンプルコードを載せてた書籍名があったような…
>>556 副作用完了点の取り扱いが間違ってるなら分かるけど怪しいって何?
誤字脱字で初心者を惑わすクソ書籍とかもあるしな
この1冊またはこのサイトっていうのありませんか? 自薦自演OKです ダメだったら袋叩きにします
C実践プログラミングでLinuxでターミナルでviでgccでa.outするのがベスト
563 :
デフォルトの名無しさん :2011/03/28(月) 19:14:52.29
逆境に耐えきれるかどうかが非情なふるい分けなんだが
C言語のポインタで躓いてしまいました。
http://codepad.org/gim0E9pN このプログラムなのですが、
エラー E2342 11.c 18: パラメータ 'num1' は int * 型として定義されているので int は渡せない(関数 main )
エラー E2342 11.c 18: パラメータ 'num2' は int * 型として定義されているので int は渡せない(関数 main )
とエラーが出てしまいます。
どこがおかしいのでしょうか?
間接参照演算子をつけたポインタは変数の値・アドレスを参照するのではなくて、変数そのものを参照すると思っているのですが、間違えていますでしょうか?
add(x1,x2,a); じゃなくて add(&x1,&x2,a);
>>564 関数addの第一と第二引数はintのポインタなのでmain側ではint型変数のアドレスを渡す必要がある
具体的に言うと
add(x1,x2,a);
を
add(&x1,&x2,a);
に変える
>>564 addは引数に(int*型, int*型, int型)をとるようになってる
でも実際使ってるほうは
add(int,int,int)になってる。引数の型が違ったら使えないよ
>>565-566 addのreturnに対する突っ込みは無しでつか?
いや、構文としては間違ってないけどね…
まだ「でつ」とか使ってるやついるんだw
現役はどこ叩いても皆死ぬほど忙しいっていうのに暇だねぇ
>>565-567 なるほど引数で&をつけてあげないといけなかったんですね
つけてなかったから型違いになってエラーと・・・
解決しました
ありがとうございますm(_ _)m
>>568 addのreturnは自分でも思っていたのですが、
num3も返してあげた方がいいんですかね?
自分的にはnum3は加算する点数ようの引数なので返す必要ないとおもって返してないのですが
>>570 暇も何もソースみたら一目瞭然だろ
つーか、こんなんで暇だねって言われたら
( ´∀`) <オマエモナー
現役に憧れてる子なんだからわかってあげなよ
>>571 C言語では引数は一つしか返せない
int add(); // returnされる値はint型
複数の値を返したければ、
>>564 のように参照を使って
引数が指している中身を変更するか構造体を使う
引数が一つしか返せないってアホだ俺…orz 返せないのは返値(戻値)ね
>>574 なるほど
今僕は「優しいC第3版」と云うのを見ながらやっているんですが、
return文のところで、「return 式」と書いていたので複数でも返せるものと思っていました。
構造体と云うものが何か分からなかったので今目次を見てみましたが、Lesson11でするようです。
(因みに自分はいまLesson9の最後の練習問題の所です)
>>576 途中で書き込み押してしまいました。
ミスです。
まあどうでもいい話ですが、構造体というものをするのが楽しみになってきました。
ありがとうございましたm(_ _)m
return *num1,*num2; で実際に返してるのは*num2の値
>>578 returnで*num1指定してもその後に*num2と指定すると戻り値が上書きされてしまうということでしょうかね
今returnで戻り値を0にしてみても動きました。
正直予想外で、本当は動かないと思ったいました。
戻り値は理解してるつもりでしたが出来ていないような気がしてきましたので、今から戻り値の単元を再度読み返そうと思いますm(_ _)m
rubyだとそういうやり方できるね
>>579 return a, b;
これは単純にコンマ演算子でaを評価したあとbを評価する。
その結果、aは捨てられてbを返す。
return 0;
これは0を返しているだけ。
意味が分からなければ、main()に int b;を用意して
b = add( &x1, &x2, a);
で、add()のreturn;を色々と変えてbの内容を確かめてみると良い
582 :
524 :2011/03/28(月) 20:43:50.04
>>533 全て解決した。
俺が持ってる入門書にはstaticとかの記述は一つもなかった。
だから知らなかったよ
ごめんね(笑)
Windowsで正規表現が使いたいのですが、いいライブラリありますか?
BSDライセンスだけど鬼車とか HPにサンプルも載っけてあるから見てみれば
>>588 何この遅レスって思ったら11日か…
もしかして、やっと書き込めるようになったとか?
C解説サイトを立ち上げようとしたとき タイトル名を「小手返し及びドラゴンスクリュー教えるツェー言語」にしようとしたことがある。 手取り・・・・手を取るのは小手返しである 足取り・・・・足を取るのはドラゴンスクリューである よって、小手返し及びドラゴンスクリューで教えるとは 手取り足取り教えるということであるからウィットが効いておろう、 と思ったが長すぎるのでやめた。
ここの先輩方なら初心者に正しい入門サイトを作れると思うのですが私は間違っていますか?
作ろうと思ったが一日目で嫌になった
よく、長い変数名の記述を、簡略化するためにマクロを使ってる人がいますけど、 個人的にあのような記述方法は、厄介なコードへの近道だと思う。 たとえば struct AAA { int a,b,c; }; これのインスタンスを大域変数として struct AAA aaa; として宣言してあるとします。 この aaa を読んだり書いたりするには、たとえば void f(void) { aaa.a = 1; aaa.b = 2; aaa.c = 3; } などとすれば、読んだり書いたりできますが、この aaa という長い名前を簡略化するために、マクロによって短い名前にしてる人が時々います。 つまり #define w aaa void f(void) { w.a = 1; w.b = 2; w.c = 3; } となって、タイピング量が減って楽になるという理由でしょうけど、個人的に、マクロによってタイピング量をラクする、こういうコードを好んで書く人は、 ちょっと思慮が浅いと思います。というか、センスが良くないと思います。
595 :
594 :2011/03/28(月) 23:38:58.36
なぜなら、これは書いた本人にとっては、読みやすく、記述しやすい、簡略化されたコードなのでしょうけど、一方、 他人(もしくは数ヶ月後の自分)にとっては、読むにも、改変するにも、余計なワンクッションを思考に挟む必要のある、「無駄に読みづらくされたコード」として映ってしまうからです。 また、読みづらさだけならまだしも、これはマクロの罠を潜在的にコードに潜り込ませることになります。(バグの温床) 「マクロは、あくまでマクロでしかない」これはK&Rで戒められてることです。(うろおぼえ、いや、ストラウストラップの本の方だったかもしれない。) つまりマクロはC言語を知らないんです。マクロはマクロでしかない。 たとえば、将来、別の誰か(もしくは数ヶ月後の自分)が、struct AAA にメンバー変数 w を追加するとしたら、どうなるでしょうか? struct AAA { int a,b,c; int w; }; #define w aaa void f(void) { w.a = 1; w.b = 2; w.c = 3; w.w = 4; // エラー。 マクロによって実際には aaa.aaa = 4; という文字列に置き換えられてしまう。 } 厄介なことが起こりました。 wという名前をメンバー変数に使うのを諦めるか、もしくは #define w aaa を別の名前に変えるか、いずれにしても『余計な問題』が発生してしまいます。 でも、これはまだコンパイル時にエラーが出るのでマシです。
一度覚えちゃうと初心者向けに系統立って解説するって普通の人にはかなり苦痛 きっと使えると説明できるって異なる能力なんだろうね
597 :
594 :2011/03/28(月) 23:45:01.70
では、 もしも struct AAA { int a,b,c; int w; int aaa; }; だとしたら? #define w aaa void f(void) { w.w = 4; // マクロによって実際には aaa.aaa = 4; という文字列に置き換えられてしまう。 そう! なんとメンバー変数 w は不定のまま! しかしコンパイルは正常に通ってしまう。 w.aaa = 5; } こういうコードを、「”ぱっ”と見せられて」、 w.w への代入が失敗してることに、つまり w.w にバグの原因があることに気づけますか? 少なくとも自分は、かなり気づきにくいと感じます。 (例では、#define w aaa がすぐ近くにあるけど、実際のコードでは数百行の彼方に記述されてるかもしれません。 それでも簡単に気づけますか? こういう「コンパイル通る類のバグ」は本当に厄介だと思います。気づきづらい。 ましてや他人の書いた膨大なコード中だと、尚更気づきづらいでしょう。)
構造体をtypedef使わずに、マクロ使うヤツがタコなだけ
599 :
594 :2011/03/28(月) 23:50:32.00
もう一個、バグの例、 まったく aaa 界隈とは無関係の処理で、同じソースファイル中に以下のようなコードを追加した場合、 struct BBB { int aaa; int w; }; // ~~~ #define w aaa // ~~~ void g(void) { struct BBB bbb; bbb.aaa = 1; bbb.w = 2; // マクロによって実際には bbb.aaa = 2; という文字列に置き換えられてしまう。(wは不定のまま。つまりバグ) しかし、コンパイルは正常に通ってしまう。 } まったく struct AAA aaa; と関係無いような処理にまで、#define w aaa の魔の手が伸びてきます。 たとえばこのコードがバグを起こしたとして、はたして原因として、まったく数百行彼方の(しかも一見、まったく関係無い)#define w aaa が原因だなんて、 容易に連想できます? 少なくとも私は半日コードを凝視しつつ延々と悩みつづける自信があります…orz こういうマクロ関連のバグって、ほんとに気づき難いものです。実際に起きたら。 では、じゃぁ、このバグの原因がマクロだということに気づけたとします。 では原因を発見できたとして、このバグをを回避するためにどうしますか? どこに手を付けますか? やりようは、いくらでもありますが、しかし、それにしたって、余計な面倒が増えてしまうのです。 #define w aaa なんていうマクロのせいです。(もともとタイプ量をラクするためのものが、コードの成長とともに、いつのまにかコードの癌へと変化してしまってる様子です)
実は最近、某氏の書いたコード中で、文字どうり、こういう #defien の使われ方がされてて、かなり辟易としました。 そのコードでは、システムのワーキングメモリとして構造体のインスタンスを大域変数として宣言し、タイプ量を少なくするために #define で w という名前に置き換えられてました。 ・・・wですよ? もう、恐ろしいですよ、こういうコード・・・ だから、ワーキングメモリのメンバ変数には、その子世代にも続いてずっと、メンバ変数として w という変数名に(容易には)アクセスできませんし、ソースコード中に w という変数を作ることすら(ほぼ感覚的には)禁止されてしまってます。 たとえば、 int width; の意味で int w; というメンバー変数名を使うのはよくあることだと思いますが、この w という変数名が(事実上)禁じ手にされてしまってるのです。 (もちろん #undef など工夫すれば w という変数名にもアクセスできますが、はたして、これを本末転倒と言わずに、なんと言うのでしょうか? もともとタイプ量をラクするためのものだったのに。) もしもマクロではなく、ポインターなど「C言語の記述として」 w を用意してれば、マクロの罠は起こりません。 なぜなら、当然ですが、C言語はC言語を知っているからです。 たとえば struct AAA* w = &aaa; void f(void) { w->w = 4; // ちゃんと aaa.w へ代入される。 w->aaa = 5; // ちゃんと aaa.aaaへ代入される。 } ただし、ポインターを用意する分だけ、マクロよりも処理速度もメモリー効率も落ちます。(最適化されない前提で考えれば) でも、個人的には、それでも #define w aaa なんてマクロをコードに潜り込ませるよりは、遥にマシだと思います。 ようするに、何が言いたいって、マクロは注意深く使ったほうが(なるべく使用は控えた方が)良いんじゃないの? という個人的な感想ですw というか、保守する側の身にもなれや・・・的なグチですorz 「おおさまのみみはろばのみみ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜!!!!!!!!!!!!!!!!!!!!!!!!!!」 ああ、スッキリした・・・orz
はいはい。 型の名称を省略したい場合は、typedef使いましょうね。 あと、ソースは、ちゃんと分割して管理しまょうね。 最後に、依存関係は、ちゃんと管理しましょうね。 以上。
あっ、型名じゃなくて、変数名を省略したのか。 んじゃ、最初から、命名規則に則った短い名前を付けましょう。 以上
なんだ、単なるドライベントだったのかw
604 :
デフォルトの名無しさん :2011/03/29(火) 00:14:54.24
俺もそれなりのオチを期待してずっこかされた こんにゃろう
Javaで質問なんでsが、System.out.println("変数aの値は" + a + "です。 "); とあったのですが、+ a + とはどういう意味ですか?
C言語なら俺に聞け(入門編)Part 80
C言語で記号の入力判定をしたいのですが、関数等は何を使えばいいのでしょうか。 試しにgetchar()、char testと定義してscanf("%c", &test);としても駄目だったもので。
>>607 >記号の入力判定
とは具体的になにをすればいいのでしょうか?例をあげてみてください。
>>608 すいません書き方が悪かったですね。
単にどうすれば記号をユーザーの入力から取得できるか知りたかったのです。
具体的に云うと、
if(test == '+'){
...
}else if(test == '-'){
...
}else if(test == '*'){
...
}else if(test == '/'){
...
}else if(test == '&'){
...
}else if(test == '%'){
....
以下省略のように、入力された記号に応じた処理をするプログラムを作りたいので。
>>609 さっぱり分からないが
あなたが求めているのは
#include <conio.h>
と
getch() もしくは getche()
かもしれない
>>610 私が求めていたのは若干事なりましたが大体そんな感じなのでとても助かりました。
EOFという知らない単語もあり、検索をしてみたところ良い勉強になりました。
ありがとうございました。
>>611 getch(),getche()どちらも知らない関数でありましたので調べさせていただいたところ入出力関数のようですね。
自分にはまだまだscanf getcharなどとの使い分けが今いち分かりませんが、新しい関数をしれたという意味ではいい勉強になったのではないかなと思います。
ありがとうございました。
慣れてくると、if〜elseや、同様の働きをするswitch〜caseを使ってはいけないような気がし始める。 「キーボーから入力があったら通知あんねんから、それ直に捕まえて関数ポインタで飛ばしたったらええんや」 とか思い出せばしめたものである
switch caseとかほとんど(というか全く)使う機会ないな if (A==B || A==C || A==D || A==E) { } else if (A==F || A==G || A==H) { } みたいな場合分けぐらいじゃなかろうか>switchcaseを使う場面
switch文はなんかかわいいから使う
「ちょっとまて。その分岐は本当に必要か?」
「そんな分岐でだいじょぶか?」
いつのネタだよ
>>613 キーボードからの入力を捕まえて関数ポインタで飛ばすって何?
iphoneのアプリを作る場合ってCとObjective-Cどちらから先に勉強したら後々楽ですか?
ガタガタ言ってねえで実際に作れよ 必要なものはその時わかる
>>620 目的がiPhoneアプリなのだから、独力で学習できるならObjectiveCだけでいい。
そうでないなら、情報量の多いCから入った方がいいかもしれない。
まぁ、そんな質問をしている段階でどうせ無理だと思うが。
623 :
607 :2011/03/29(火) 11:46:47.01
>>610 が書いたものを参考にプログラムを書いてみたのですがどうもうまくいきません。
http://codepad.org/DaZzmWhv -が入力されたときは上手く処理をするので、-の所との違いをチェックしていきましたが、演算の違いだけで他に見当たりません。
また、エラーがでているわけでもありません。
どこがおかしいのでしょうか
mark = getchar()を先にすんのかな
>>623 mark = getchar() は最初の一回のみ
後は、markと記号の比較でOK
626 :
607 :2011/03/29(火) 11:57:29.02
>>624 mark = getchar()を先にするのは昨日やってみました。
するとちゃんと+などを打っても、
else{
printf("対応してる計算式を入力してください。\n");
printf("もう一度始めからやり直してください。\n");
}
の部分へ行ってしまいます。
あ、それと何故かchar型のans2定義してますが意味ないです
627 :
607 :2011/03/29(火) 11:58:18.92
>>625 ほんとうですか・・・
もう一回試してきてみます
>>626 定義じゃなくて宣言でしたorz
628 :
607 :2011/03/29(火) 12:03:55.16
ああ別に先にしなくても最初のとこ以外markだけにしとけばいいのか
>>626 変な動きをする理由はscanfのあと入力バッファに改行が残るからです
例えば 1<改行>2<改行>+<改行> のように入力すると
最初の scanf("%d", &num1); は 1 を読み込みます
次の scanf("%d", &num2); は改行を読み飛ばして 2 を読み込みます
次の getchar() は改行を読み込みます
次の getchar() は + を読み込みます
次の getchar() は改行を読み込みます
解決方法は・・・マンドクセ('A`)
631 :
607 :2011/03/29(火) 12:10:22.99
>>628 やってみましたが
>>628 と同じ処理になってしまいました。
>>630 なるほど
getcharで改行を読み込ませないか数字入力する時点で改行が無いようにしてあげればいいってことですかね
やってみます
あーそういえばそんなの聞いたこと有るなー
633 :
607 :2011/03/29(火) 12:25:39.34
できました! getcharをscanfに変えて%*cで空白を読み飛ばしました。 入力バッファという言葉自体しらなかったのでggってみたらscanfの問題点というのがあってそこに空白の読み飛ばしと云うものがありました やっぱプログラミングって難しいですね 何が原因とかわかってたら最初からggっていれば、これだってすぐ解決できるようなことだったのに そういう言葉を知らないために検索のしようもないですからねー でも難しいけどできた時が嬉しいので楽しいです ありがとございました
だからscanf()なんか使わずにfgets()+sscanf()にしろとあれほど……
1日から内定先で働くのに何にも打てねぇ 先輩に殺されるかも・・・・・・・・・・・・・・・・・・
636 :
デフォルトの名無しさん :2011/03/29(火) 18:29:47.11
www
すまん!教えてください!BCCとVC++ってどっちが使われてるんですか? 会社でよく使われてるほうのコンパイラを使って勉強したいです!
コンパイラなんかどうでもいいよ HSCでもGCCでもBCCでもVCでもそれぞれクセがあって、結局書き直さないといけなくなる。 GCCは頑なにANSIで認められたものしか実装しようとせずstrnlengthとか使えなかったり BCCはもう古くてlong long とか使えなかったりするし VCはWindows専用でほかのシステムにまったく対応できないし
640 :
デフォルトの名無しさん :2011/03/29(火) 18:39:13.61
会社に入ってからC言語の教育してるところってあるけど何なの? あえて一から教える事で飲み込み能力を見てるわけ? C言語の飲み込み能力見るために、つまり天性的なものを見るために あえてC言語経験者は取らない会社ってあるの?
>>639 GCCって変な拡張がいっぱいあるいようなイメージだけど。
642 :
デフォルトの名無しさん :2011/03/29(火) 19:01:50.00
>>637 「どっちが」という前提からもう違う(クロスを完全に考え落としている)
「よく使われてるほう」に山はっても容赦なく外れるが、どうする?
具体的な案件が決まらないうちに予習するなら
手当たり次第全部だよ
C言語出来たからってPHPでWEBサイト作れるってわけでもないんだな Zend Frameworkでサイト作る事になったけどさっぱりわかんない
関数ポインタ使いこなしてる俺様カッコイイと主張したいだけの厨ニ病患者
C言語の話しではないが ifやswitchを使わないでクラスを継承してポリモーフィズムしてみる みたいだな。
缶ススポインタでなくてもいいけど、直に捕まえるといつどんなときでも受け付けてくれてサイコー 極端に言えばOSが固まってても受け付けてくれる。
>>644 気にするな、getchar()からEOF返されて暴走するコードなんだからw
649 :
デフォルトの名無しさん :2011/03/29(火) 21:18:57.79
x86の割り込み処理ってのはめんどくさい。 ベクタがまずムカつく。 こういうときPowerPCなら、直接アドレスにスッ飛ばすからンなもんいらねえのに
if() pf=f1; else pf=f2; // ゴメンナサイ if つこてました
pf=test=='+'?f0:(test=='-'?f1:(test==…)))))); // いいえ使ってません!
俺は初心者にこそ、定数を使わないことをまず徹底して教えるべきだと思う for(i=0; i < 6; i++){ for(ii=0; ii < 12; ii++){ for(iii=526309629; iii > 5555; iii--) みたいなのは、例えば i の値を変えたくなったときに困る。 カウントに使うだけならまだしも、それに付随して何かさせたいとき i の値が変わったらそれみんな設定しなおしになる。 配列要素数もそうだ 定数で決め打ちするから、それ変えたいときにみんな変える羽目になる。
> みたいなのは、例えば i の値を変えたくなったときに困る。 > カウントに使うだけならまだしも、それに付随して何かさせたいとき > i の値が変わったらそれみんな設定しなおしになる。 iにconstつけとけよw
>>652 気持は伝わるんだが、いいたい事が分からん
>>646 関数ポインタ無しで if と switch だけでポリモフ機構の実装は…
ぱっと思い浮かばんね。
それ以外で関数ポインタ使うのって qsort や Windows APIのように
それを要求してるから仕方なしに渡してる って場合がほとんど
>>655 適当に型に対して番号振って、その番号で分岐すれば良いじゃん
最初は、ifififififififififiififififififififって重ねるのもいいが 実務ではそれは絶対に認められない。趣味でも効率が悪いだけだ。 if を重ねるのは3つまで。 3つで終わらないものは別の方法を考えたほうがいい。
658 :
デフォルトの名無しさん :2011/03/29(火) 22:22:11.75
>>655 WndProc なんか switch だけでポリモしてるじゃん
ぺぞるととか
659 :
デフォルトの名無しさん :2011/03/29(火) 23:56:10.43
constとstaticの違いが分かりません。 どちらも関数に渡しても中身を変えないって意味ですか?
constは何をやっても値を変えられないもの (キャストするなどやれば変えられるようになるが普通はやらない) staticは値は変えられるがプログラムが終わるまで値を保持し続けるもの グローバル変数もプログラムが終わるまでの寿命を持つが グローバル変数はありとあらゆる関数や式で参照できるのに対し staticは宣言した場所でしか参照できない 「与えたり計算して変更した値を死ぬまで持っているローカル変数」 「staticグローバル変数」というものもあり これはそのソースファイル内だけ有効なグローバル変数 他のソースファイルからはexternを付けても見えなくなる
661 :
デフォルトの名無しさん :2011/03/30(水) 01:05:26.49
バッファ領域って何ですか? バッファの意味が分かりません。
>>661 バッファはいろんな用途に使われるけど、例えばI/Oバッファ
I/OはCPUの速度に比べて圧倒的に遅いのが普通なので、入力もしくは
出力コマンドを送ってから作業が終了した事を割り込みでCPUに知らせる
その時にI/Oの回数を少しでも減らせばそれだけ速度が上がる
>>661 バッファ:緩衝装置→緩衝記憶領域・緩衝増幅器(アナログ/デジタル)・pH緩衝液
他になにかあったかなあ。
>>649 PowerPC 系って、CPU に割り込み信号が入った後、割り込みコントローラ(8259みたいな奴ね)はバスに物理アドレスを送るんですか?
じゃあ、割り込みコントローラにあらかじめアドレスを登録するとかするのですか?それは大変だ。
665 :
デフォルトの名無しさん :2011/03/30(水) 01:40:17.68
>>662 I/Oって何ですか?
さすがにググルのは面倒です。
どうせ調べても分からないし。
>>665 CPUが受け取ったり、出力したりする信号線。インアウトの略。
普通、CPUの速度よりも遙かに遅い。
>>665 例えばハードディスクへの読み込み、書き込みもI/O
バッファ領域を取っておけばI/O回数が減らせる
C言語で何か習作したいんですけど、習作するならこんなのいいよ!みたいなのってありますか? CUIのみでWin32APIは使わない方向でお願いします。
>>668 では、最古のアルゴリズムである、ユークリッドの互除法はどうでしょうか。すでに体験ずみならごめんなさい。
>>669 今wikiみて来ました
楽しそうですね
やってみます
671 :
デフォルトの名無しさん :2011/03/30(水) 03:01:56.98
動画サイトで動画見てて、動画が止まったときバッファリングとか 出てきますよね?バッファ32%とか。 そのバッファですか?
672 :
デフォルトの名無しさん :2011/03/30(水) 03:06:50.38
バッファ=メモリということでOKですか?
>>671 それも一種のバッファですね
>>672 そうとも限らない
HDDやSSDがバッファになる事もある
674 :
デフォルトの名無しさん :2011/03/30(水) 03:11:39.85
バッファは半導体ですか?
675 :
デフォルトの名無しさん :2011/03/30(水) 03:13:45.94
>>673 HDDやSSDがバッファになる事もある
仮想メモリのことですか?
PowerPCは例外を受けたときに飛ばすアドレスが完璧に決まっているので 単純にテーブルを置いておけばよい。
a まあいいや
678 :
デフォルトの名無しさん :2011/03/30(水) 04:03:59.61
CGIとC言語って何か密着した関係性ありますか? CGIプログラムってなんでしょう? C言語でも書けるんですか?どうやって実行するんでしょう?
>>678 CGIってのは何か物の名前じゃなくて、仕組みの名前だと思う。しらねーけど。
インターネットエクスプローラー6とかから、どっか別のパソコンの中にあるプログラムを、遠隔操作みたいな感じで実行して、
その実行結果の文字列とかを送り返してもらって、自分のとこのIE6とかで表示できる。 って感じだとおもってる。 たぶん。
。oO「○○ってプログラムを実行しろ」
自分のIE6 → どっか別のパソコン
。oO「は〜〜い。 ○○ってプログラムを実行しま〜〜す☆」
自分のIE6 どっか別のパソコン
。oO「○○ってプログラムの出たやつです。おくりまーす」
自分のIE6 ← どっか別のパソコン
。oO「キター♪」 。oO「よかったね(^_^/」
自分のIE6 どっかのパソコン
この○○ってプログラムには、実際のところ、パールをつかったり、ジャバーをつかったり、シーをつかったり、それは何を使ってもいいってことなのかもしれない。って思う。
よくしらねーけど。
Ring Bufferとかを調べませう
682 :
デフォルトの名無しさん :2011/03/30(水) 08:51:31.23
うん
683 :
デフォルトの名無しさん :2011/03/30(水) 11:42:31.88
ファイルからリダイレクトで変数に値を代入するときに、4番目だけ手入力 させたいのですが、できません。どうしたらいいか教えてください。 よろしくお願いします。 cin >> ax; cin >> ay; cin >> az; scanf("%s",&tt);
Cでmp3再生するフレームワークってありませんか? 自分で1からコード書くの難しくて
>>683 fgetpos
dup
freopen
dup2
close
clearerr
fsetpos
9時に音楽を鳴らす 12時に音楽を鳴らす 18時に音楽をならす ただし土日は何もしない パソコンを起動したらスタートアップに入れてプログラムを自動起動する 対象はXP〜だが.netフレームワークが導入されているとは限らない この用途の場合は何の言語を用いるとよいですか?
688 :
デフォルトの名無しさん :2011/03/30(水) 14:21:58.69
char配列から signed int に型変換する。 char 2つで 一つのint値に対応している。 この変換は、以下のような認識であっていますでしょうか。 上位 char値(c1)がマイナス int val = c1 * 256 - (unsigned の c2) 上位 char値(c1) がプラス int val = c1 * 256 + (unsigned の c2) よろしくお願いします。
690 :
デフォルトの名無しさん :2011/03/30(水) 15:01:21.55
>>685 何をしているのかわかりません。ファイルには書き込みません。
標準入力から入力するときは止まってくれるのに、ファイルを
リダイレクトすると入力すべきところをスルーしてしまいます。
止まって入力させることはできないのでしょうか?
C言語の質問と云わず全部の言語での質問になりそうなので此処で質問していいのか分からないのですが 計算問題が色々と置かれてあって、それをプログラムで書きましょうみたいなwikiがあるのですが、誰かご存知ありませんか? ご存じある方が居ればURLを教えていただきたいのですが
>>690 標準入力は一つしかないからファイルからもコンソールからも入力したいと思ってもそう簡単ではない。
>685のように切り替えて使うか、
コンソール入力を別の手段で行なうか、
ファイル入力を自分でファイルを開くか、
どれかを選ぶしかない。
>>692 >C言語の質問と云わず全部の言語での質問になりそうなので此処で質問していいのか分からないのですが
ダメ。板のトップを見ましょう。
695 :
デフォルトの名無しさん :2011/03/30(水) 16:40:53.95
>>680 分かり安すぎワロタww
分かり安すぎて、これからC言語の勉強をする前に挫折しそう。
696 :
デフォルトの名無しさん :2011/03/30(水) 16:49:01.36
すいません。質問です。 mac os xで、c言語をやろうと思っています。 設定を、できません。 ターミナルに、gccとうつと、i686-apple-darwin10-gcc-4.2.1: no input filesと、 でます。 どのように、変えたらよいでしょうか/
gcc に続けてファイル名を打つとよいです
698 :
デフォルトの名無しさん :2011/03/30(水) 17:22:48.30
ありがとうございます 実験しましたが、駄目でした。 ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc sample.c ooguma-katsuki-no-MacBook:programs 12we56ty$ コンパイルをしてみました ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc -o sample.c i686-apple-darwin10-gcc-4.2.1: no input files 駄目でした どこの設定が、おかしいでしょう?
どのへんが駄目? エラーメッセージが出なければ成功だと思うが
説明が足りないか 最初の gcc sample.c はエラーメッセージが出ていないので成功している sample.c は正しくコンパイルされ、実行ファイルが生成されているはず 出力ファイル名は指定していないのでデフォルトの a.out のはず 次の gcc -o sample.c はオプションの使い方が間違っているからエラーメッセージが出た -o は出力するファイル名を指定するオプションだが、同時に入力するファイル名も当然必要なので、 gcc sample.c -o sample とか gcc -o sample sample.c のようにすると、 sample.c をコンパイルして sample ができる
>>698 自分linux(ubuntu10.10)なのでマックよくしらないけど、ギーシーシーならわかる〜〜
たとえば sample.c ってのをコンパイルしたければ、
コンパイル後の名前(実行形式の名前)を考えます。 とりあえず aaa でいいです。
gcc -o 実行形式の名前 ソースファイル1.c ソースファイル2.c ソースファイル3.c ................................
だから、sample.c をこんぱいるしたければ
gcc -o aaa sample.c
とすればいいです。たぶん。
あと、ライブラリーってのが必要な場合は、(たとえば #include <math.h> とかしたなら)
gcc -o aaa sample.c -lm
ってやります。 -lm
これは、たぶん libm.so とかなのだけど、この lib のところを取った名前を -l に続けて書く作法みたい。だから -lm
だから libaaa.so なら -laaa になるみたい。
マックントッシュは持ってないんで、もしかしたらルールが違うかもしれないけど。よくしらない。
余談:
gcc -o sample.c ってやると、たぶん、sample.cのファイルが破壊されてるかもしれません。(中身がぐちゃぐちゃになったり、消えてたり、なんか変になってるかもしれない)
702 :
デフォルトの名無しさん :2011/03/30(水) 17:51:09.50
ありがとうございます できました! ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc sample2.c ooguma-katsuki-no-MacBook:programs 12we56ty$ ./a.out Hello World!\nooguma-katsuki-no-MacBook:programs 12we56ty$ ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc -o sample2 sample2.c ooguma-katsuki-no-MacBook:programs 12we56ty$ ./a.out Hello World!\nooguma-katsuki-no-MacBook:programs 12we56ty$ ありがとうございましたm(_ _)m
> ooguma-katsuki-no-MacBook:programs 12we56ty$ gcc -o sample2 sample2.c なら ./a.out ではなく ./sample2 とすべき
704 :
デフォルトの名無しさん :2011/03/30(水) 18:18:45.98
ありがとうございます 勉強になります
705 :
690 :2011/03/30(水) 19:38:35.10
>>676 調べてみましたが、256バイトまでのハンドラを配置し、割り込みでは、そのハンドラが直接コールされる仕組みなんですね。
256 バイトを超えるようであれば別途工夫が必要なようですね。割り込みは何種類まで設定できるのでしょうか?
8086 はたしか 128種だったかな?
>>705 freopen("con", "r", stdin);
あのVC++ってダウンロードサイズいくつか分かりませんか? 21時から速度規制がありましてテレホーダイ時代の速度になってしまうのですよ
709 :
690 :2011/03/30(水) 20:14:05.59
だめです。止まりません。次のように使いたいです。 ファイルPの中身 53585524541702942078802276995470987148022575395067806084418252847286965358370 66374938992110997276702207311816358295672473702142926007886483976217087914527 1 です。4番目の変数に値を初期化するのに、手で入力したいのですが 止まりませんでした。 freopen("con","r",stdin); とやると、鍵が短すぎますというエラーが出て終わってしまいました。 どうすればファイルリダイレクトの跡に主導入力できるかわかりません。 よろしくお願いします。
>>709 説明する気あんのかよ
何もかもがダメだから諦めたら?
711 :
690 :2011/03/30(水) 20:32:02.06
説明不足でした。Pの中身は709に書いたとおりです。プログラムa.exeに a.exe < Pのようにしてファイルを読み込ませます。 このとき3つの値が初期化されますが、a.exeには4番目の変数があり、 それだけを手動で入力させたいのです。4番目の変数はパスワードなので ファイルPを受け取った本人が設定しなければなりません。ファイルに 書き込むという手もありますがなんだか違う気がします。パスワードは 長さ9文字以上です。しかしファイルには3つの値しか存在しないにも かかわらず、プログラムは4番目の変数を初期化しないまま終了して しまいます。これではパスワードは設定できません。この状況を 何とかしたいです。お手数おかけしますがもう少しわかりやすく説明 してくれると助かります。よろしくお願いします。
先に打ち込めば
>>711 分かりやすく言うと、うまくいくはずなのにダメだってことはあなたのやり方がマズイ
今どうやっているのかソースコードを出さないとどこが悪いか分からないよ
ってこと
リダイレクトでファイルを読むのをやめろ
715 :
690 :2011/03/30(水) 20:39:21.54
手動入力からファイル入力への切り替え方法がわかりません。
手動入力したいときはstdinを使って、ファイルから入力したいときはそのファイルfopenしたfp使えばいいだろ
書けるけど、読めません(わかりません)って人が増えてきてるね。
718 :
690 :2011/03/30(水) 20:55:45.23
パスワードだけ引数で読み込むようにしました。 質問に付き合ってくれた方々、ありがとうございました。
途中でstdinをファイルからキーボードに切り替えられないのか
721 :
690 :2011/03/30(水) 21:06:04.90
どうやるのか知りたいです。
freopen 使ってどうやったらうまくいかないのか分からん
723 :
690 :2011/03/30(水) 21:17:51.26
使い方がよくわからなかったのです。 ググってもファイル入出力がどうとか書いてあって、リダイレクトからの 切り替えに関してはさっぱりでした。
だめだにゃあ。。 // test.c #include <stdio.h> int main(void) { int ax; int ay; int az; int bx; int by; int bz; scanf("%d", &ax); scanf("%d", &ay); scanf("%d", &az); freopen("con", "r", stdin); scanf("%d", &bx); scanf("%d", &by); scanf("%d", &bz); printf("ax:%d, ay:%d, az:%d\n", ax, ay, az); printf("bx:%d, by:%d, bz:%d\n", bx, by, bz); return 0; } // text 100 200 300 // $ ./a.exe < text ax:100, ay:200, az:300 bx:1628704768, by:47, bz:1628883074
725 :
690 :2011/03/30(水) 21:27:54.46
すごいですね、そうなりますね。
726 :
690 :2011/03/30(水) 21:31:21.49
conって何ですか?
知らん。ネットで出てきた。コンソールということらしい。
ああ、freopen( "/dev/tty", "r", stdin ); に変えたらうまくいったわ
729 :
690 :2011/03/30(水) 21:43:18.02
conでもうまくいきますよ
リダイレクトなんかに拘らず、ファイルを読んでしまえばいい。 4項目目のデータが何か特別な文字列なら、 標準入力から入力するようにすれば良い。
732 :
690 :2011/03/30(水) 21:58:49.48
一行ずる整数のデータ(アスキー)を読むってできますか? fgetsだとうまくいかないんですけど。後ファイル名も決まってないから。 メールで鍵交換するソフトなんです。
なんだ鍵の人か
鍵の人キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
コイツ何人だよ 日本語おかしすぎだろ
736 :
690 :2011/03/30(水) 22:10:36.35
だめならいいですけど・・・
>>678 みたいな人を甘やかしてると第2 第3の鍵の人が誕生すると思う
鍵の人はウザコテに似てるから 例のスレで2人でよろしくやってくれれば 自分の欠点が見えるようになるんじゃないかな
>>736 モリタポ払っても良いって言ってみな
誰かが名乗り出てくれるかも
プログラミング作法って本に定数マクロは#defineじゃなくてenum使えって書いてあるけど、 配列の添え字に使っても問題ないのかな まあカーニハン先生がOKって言ってるから、いいんだろうけど
DLLを作成したいのですがコンパイルできません どなたか助けてください include <stdio.h> function text() { return "Hello world!!"; }
>>739 モリタポじゃなくて俺の糞ならいくらでもあげますけど
>>741 お前は一体なに言語を書こうとしてるんだ
>>742 何れもらうかも知れない。
それまで大事に取って置いてくれ。
モリタポわからないので、BitCash(セブンイレブンのコピー機で売ってるウェブマネー)に対応してほしい。
enumは初心者向きの書き方だからでしょ
>>741 JavaScriptでDLLは作れません
>>740 enumは最終的にint型になるからおk
#define を使えない人が多かったから enum が出来たんですけど
#defineってただの置き換えマクロじゃないの?
enumって、勝手にintに拡張されるから、好きじゃないんだけど
ふーん、#defineはどうなの?
最近のは調べたことないので、わからん
昔、口先の知ったかが enumを使え とか言ってたからかもしれん
そいつの書いた短いコード見たけど、センスのかけらもなかったな
758 :
デフォルトの名無しさん :2011/03/31(木) 02:37:57.30
#define に整数拡張がどうたらとかあるわけねえだろ
759 :
デフォルトの名無しさん :2011/03/31(木) 03:08:18.43
宿題片付けますスレ147がたたないのでここで質問します。 任意の5ケタの整数(int型)を入力し、その整数を二乗した数の下5ケタを 始め、以降二乗された数の下5ケタの二乗を計算していく作業を再帰的に 行い一回の作業ごとに下5ケタの数を表示していくプログラムを作れ。 できるだけ簡単なプログラムでお願いします。
>>759 その言い訳はいらないので自分でスレぐらい立ててください
761 :
デフォルトの名無しさん :2011/03/31(木) 03:44:23.29
>>759 #include <stdio.h>
f(a)
long long a;
{
a = (a * a) % 100000;
printf("%lld\n", a);
f(a);
}
main()
{
char s[123];
f(atoi(gets(s)));
}
スタックオーバーフローするのですがどうするばいいでるた?
aがゼロ以下?になったら、止めんと
765 :
デフォルトの名無しさん :2011/03/31(木) 04:32:37.41
>>762 できるだけ簡単なプログラムでお願いします。
下5ケタの中に0が現れたら再起崩壊という事でお願いします。
そもそも問題文おかしいだろ 時々いるんだよな日本語できないヤツ
終了条件がわからんと終わらん
なんで再帰すんの?
>>765 #include <stdio.h>
static int b[100000];
f(long long a)
{
a = (a * a) % 100000;
if(b[a]++ == 0) {
printf("%lld\n", a);
f(a);
}
}
main()
{
char s[123];
f(atoi(gets(s)));
}
0がでたらとかワケわかんないんで、
循環したら再起崩壊という事でがんばってみました。
static int b[100000]; これってメモリとか大丈夫なのかな? 俺みたいな素人には良く解らんけども
Intが4byteだから100000だと400kbyteかな? たいしたことないか
772 :
デフォルトの名無しさん :2011/03/31(木) 06:35:55.77
>>768 概念的に再起。日本語でうまく説明できないし。
プログラム的には再起構造じゃなくてもできるかな。
>>769 すげーな・・・
必ず条件満たして終了する件。
時々 3ケタや4ケタの数字出てくるんだけど0が省略されてるのかな?
%lldのおかげじゃね?
>>772 そういうとこちゃんと出題者に聞かないと駄目じゃん
CとJava両方を両立して勉強するのは効率悪いですか? どっちかを1年頑張ってからもう片方を学ぶほうがいいですか?
777 :
デフォルトの名無しさん :2011/03/31(木) 11:00:16.96
>>776 おまえさん次第だね
C と他の言語を並行でやると、ともすると似て非なるところを混同しがちだが
そのあたり「今は C の話」「これは Java の話」ときっちり区別できる人かどうかによるし
C でも Java でもできる積集合にしか関心を持たなくなるのが一番問題だ
1年は長すぎるかも知れないが、片方ずつというのは無難かも
ありがとうございます どっちが学習期間が短いですか?なるべき短いほうから学習したいえうs
×学習したいえうs ○学習したいです すいませんあまりにも良い回答に興奮して誤字打ってしまいました
780 :
デフォルトの名無しさん :2011/03/31(木) 11:12:56.55
そりゃ C でしょ 身軽さが売りの言語だかんね
Cすらまともに理解できない俺じゃ他の言語はムリか・・・ 1年頑張れば何とか理解できるかなぁ
783 :
デフォルトの名無しさん :2011/03/31(木) 12:41:28.07
> Cすらまともに これは相性があるから C がダメでもあきらめることはない
Cは出来ないけどPHPの某有名オープンソースの開発に関わってる俺みたいなのもいるしな
>>778 実際には言語以外の要素も小さくは無い。
特にCは言語としては未定義にしてあるところがいっぱい有る。
まともなソフトウェアを作ろうと思うと各OSのAPIとかに頼ることになる。
アーキテクチャ依存、処理系依存の要素も考慮するとCがJavaより楽とは言えない。
言語だけで言えばCの方が学習期間は短いと言えると思うが…。
n=6,r=3と入力されて 111000 110100 110010 110001 101100 101010 101001 100110 100101 100011 011100 011010 011001 010110 010101 010011 001110 001101 001011 000111 こんなのを出力するプログラムを言語なんでもいいのでideoneか何かに書いてください。 再起処理だと思うんだけど苦手で。丸投げで悪いけどすぐ実行結果だけ使いたいので。
(道路の)穴埋めで、残り資材がr個として、埋めるということだ。
それはnが32にくらいになると、解は少なくても実行が終わらなくならないか。
あと再帰を使うのも30段くらい行くとスタックオーバーフローの可能性。 全数や再帰を使わないのがいいんでは?
コンソールプログラムで char time = "2000年3月09日 14時02分01秒"; これの1時間36分35秒後の日時に直す方法を教えてください
char time = "2000年3月09日 14時02分01秒の1時間36分35秒後";
>>791 方法。
たとえば1970年1月1日0時0分0秒を基準として0から初めて、その10000秒後の日時を求めるプログラムを作る。
そしたら簡単だ。
794 :
デフォルトの名無しさん :2011/03/31(木) 13:50:57.91
文字列リテラルがメモリの 0x00 - 0xff 番地にないとまずいかもな
796 :
デフォルトの名無しさん :2011/03/31(木) 14:34:02.16
BOOL Func(Pram_a,Pram_b,Pram_c); 関数呼び出しの前に、関数の戻り値を指定して呼び出しているソースを見付けたのですが、 これはどんな意味があるのでしょうか? 通常は省略しているのが一般的だと思いますが。
単にプロトタイプ宣言が 関数のスコープ内にあったという話ではないの? (Param_a Param_b Param_c は型名)
プロトタイプ宣言
>>786 のn=100 r=20が出来るやつはいないのか。
800 :
796 :2011/03/31(木) 14:46:10.61
すいません、間違ってました。 BOOL Func( 型名 Pram_a, 型名 Pram_b,型名 Pram_c) { if( Func1()) { } if( Func2()) { } } という様な感じで続いていますので、 プロトタイプ宣言ではないと思います。
>>796 それは呼び出しではなくプロトタイプ宣言です。
803 :
デフォルトの名無しさん :2011/03/31(木) 14:53:00.00
>>800 お前さんは
int main()
{
...
}
とか書いたことは無いのか?
>>788 おかげで数学の検算ができた。感謝してる!
___ / || ̄ ̄|| ∧∧ | ||__|| ( ) 逆に考えるんだ、回転してるなら | ̄ ̄\三⊂/ ̄ ̄ ̄/ | | ( ./ / ___ ゴキッ / || ̄ ̄|| <⌒ヽ )) 自分の首を回転させればいいと! | ||__|| < 丿 | ̄ ̄\三⊂/ ̄ ̄ ̄/ | | ( ./ /
>>795 お前天才だな俺もトライしたが書けなかった
インクルードでstdio.hとか○○.hっていうのはどういう時にどれどれを読み込むかって言うのはどうやって分かってるのですか?
使おうとしてる関数のリファレンスに何々をインクルードしてね と書いてある が、手が勝手にタイプしてることが多い stdio.h と stdlib.h
>>812 すいません関数のリファレンスってどこのサイトにあるのですか?自分で調べます
816 :
デフォルトの名無しさん :2011/03/31(木) 16:27:08.62
>>814 その関数の作者が発信している情報
標準関数なら ISO や JIS の規格票(書店か日本規格協会から取り寄せる)
特定のコンパイラで通るかどうかは信じないほうがいい
stdlib.h で memcpy が使えたり、標準ぽい関数が実は非標準というのがよくある
ttt
818 :
デフォルトの名無しさん :2011/03/31(木) 18:07:23.30
APIなどのプログラムコードを全く必要とせず、純粋にC言語のみで組める ゲーム製作環境ってありますか?
白黒のオセロとか、テキストのRPGとか。
CGIでブラウザゲームとか
821 :
デフォルトの名無しさん :2011/03/31(木) 18:19:28.44
>>820 ブラウザならhtmlやらないとダメなのでは?
ChromeでCだけで何か作れませんかね。
822 :
デフォルトの名無しさん :2011/03/31(木) 18:26:10.87
純粋なC言語といったら開発環境は関係ない件
apiなど便利なツールは使っていいだろ。なぜ使わないんだ。 標準化されている部分だけでは、テキスト以外に画面へ出力できないわけだが。
画面に描画する機能ってあまり聞かないと思ってたら標準じゃなかったのか
826 :
デフォルトの名無しさん :2011/03/31(木) 18:41:40.33
NTLという演算ライブラリを使って開発しています。GCCでコンパイル するときはg++ -O2 -I /include a.cpp ntl.a でエラーなしで コンパイルできるのにVisual Studioのコマンドプロンプトから cl /O2 a.cpp ntl.a とやると13個の未参照のシンボルエラーが 出てきます。なぜなのでしょうか?配布にはなるべくアプリケーション 単体で配布したいので余計なDLLは入れたくありません。どうすれば 解決できるでしょうか?よろしくお願いします。
827 :
デフォルトの名無しさん :2011/03/31(木) 18:42:46.21
>>824 APIコードがC言語で代替できてるような環境ないですかね?
>>826 gcc の .a って Visual Studio で読めるの? Visual Studio のライブラリって .lib じゃなかったっけ
>>826 気にするな。DLL同封しろ。
たいしたことではない。
インポートライブラリは、開発環境ごとにいる。
APIコードって何のこと? C言語で代替するってどういうこと? 記述言語はCでAPIを呼び出し、それを利用する という話なのか?
>>827 OSによる保護がない環境でVRAMとかに直接アクセスするとか?
832 :
デフォルトの名無しさん :2011/03/31(木) 18:59:36.39
ゲームソフトの目標はユーザを楽しませること 単なる文字列を見て楽しいと思わせるアイディアがあるなら 標準 C だけで作ることも考えられるが それなくしては空疎の極みだ
ゲーム作るなら標準Cも、C言語にもこだわる必要なし。 HSPでもいい。
>>815-
>>816 なるほど、ありがとうございます
頑張ります
>>834 アドレスタイプが不明とでていけないのですが、リンクミスですか?
>>818 CGIでWebプログラムにすればグラフィックも音声もいけるぞ
PHPerがC言語を勉強する際に気をつける10つの事 を 教えてください 10つじゃなくてもかまいません
1. 「10つ」とかいう間違った日本語を使わない
何かスレが臭いと思ったらペチパーか
C:\testに100個(1ファイル1MB)のファイルが入っています これをD:\testにフォルダごとコピーする場合 CでやるのとDOSコマンドでやるのはどちらが早いでしょうか? Cは早いとよく言われるのでDOSよりも高速ですか?
DOSコマンドもCで書かれているとは思わないのか?
843 :
デフォルトの名無しさん :2011/03/31(木) 23:54:58.56
DOS コマンドは主に MASM で書いてたな
コード書いてコンパイルしてテストする時間考えたらあるもの使った方が速いよ
春だからか急にWeb系のネタが増えたね
DOSの時代、zcopyとかxcopyとか、普通のcpoyより高速なコマンドって あったけどああいうのってどうやって高速化してたんだろ。
>>841 win98の頃は、単純コピーならcopyコマンドより
自作したコマンドの方が速かったが、最近は分からん。
でも、copyコマンド自体、あまり速いとも感じないので、
作り方次第だけど、速くなると思うよ。
>>842 DOSってCでできてたの!?
Windowsで出来てるものだと思ってたけどCで出来てるならDOSのほうがいいか
849 :
デフォルトの名無しさん :2011/04/01(金) 00:13:13.60
xcopy はメモリ容量にものを言わせての一気読みがポイントで copy が seek read seek write seek read seek write とやるところを xcopy は seek read read seek write write で済ませるようにしていた あと /s が使えるのも大きなメリットだった スレ違いすまそ
>>848 お前はwindowsをなんだと思ってるんだ?
>>848 昔のWindowsはDOSから起動してたな
windowsの下回りは汗ベースだよ
ぬるぬるしてそうだな
854 :
デフォルトの名無しさん :2011/04/01(金) 00:30:12.58
スーパードンキーコングの1が発売されたのって1994年だけど、 Windows出る前だよな?それなのにあんなに綺麗なグラフィックなのが 信じられない。
Windos 1.0 の発売は1985年6月 遙か昔だが何か?
×Windos ○Windows
厳密にいえばそうなんだろうけど Windowsは95からってのが、WIndowsとかに詳しくない一般人の感覚だからね
Windows95 より前は DOS上で動く Window System であって OS じゃないイメージ
最初のWindowsって、Excelのおまけだったし
861 :
デフォルトの名無しさん :2011/04/01(金) 02:55:05.48
1980年代レベルで、スーパードンキーコング並のCGやアニメーション作るのは 可能なの?
863 :
デフォルトの名無しさん :2011/04/01(金) 03:22:00.22
すげーな、プリ
(あそこいつも電気付いてるな) ::::::::::::::::::::::::::::::::::::::::::::o::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::゚::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ブロロォ・・・............γ_⌒_ 、 ........................ ....... .....................___ U ´д`)_ .............../\........| ̄....ニ .......... |_i_|( ー O=(O=O ;;) .:) /,=、(ヽ ヽ::| |ニ|#| ⌒):. て , (φ)ヽ(__ノ//(O))
1985年のみなさん、こんにちわ。 未来から書き込んでます。 こちらは現在2011年。 21世紀に入ってから10年くらい経ってます。 パソコン一台50万円という話に驚きました。 最新鋭のインテル386、12メガヘルツ、メモリー2メガバイト、ハードディスク50メガバイトですか… 最新型ですか… そうですか… ぼくらの時代だと、パソコンは5万円でおつりが来ます。 CPUのクロック周波数は、たったの3000メガヘルツ程度です。(2005年頃から回路の微細化での、物理的な限界問題が顕著に現れ始めて、以降はあまり伸びていません) そのかわり、CPUの中に、同じCPUがいくつも存在するようになってます。 マルチコアと呼んでます。 昔のデュアルCPUみたいな感じですかね? 2、3万円のパソコンでも、今はマルチコアが当たり前です。 2個か4個が普通ですね。 むしろ、シングルコアのパソコンを探す方が大変なほどですw あと、メモリーは4000メガバイトが当たり前になってますね。 アキバで5000円くらいで買えますよ? (余談ですが、アキバ、すごい風俗街になっちゃってます。 女の子がメイドの恰好で接客してる”メイド喫茶”なんてのが出来てたり、女の子が道路の真ん中でパンツ見せたりしてます。はぁはぁ) 32ビットで扱える数字の範囲は、0から4ギガ程度までなので、32ビットOSで扱えるメモリー量の少なさ(たったの4ギガバイトしかないw)が問題になってます。 CPUは内部的には64ビット化してるのが主流です。 いや、4ギガバイトはメモリーです。 メモリー。 ハードディスクは1テラバイトくらいが普通ですかね。 アキバで7000円で買えますよ。 あと、3Dグラフィックス用のグラフィックスカードが、安いのなら1万円くらいで売ってます。 安物だと性能悪いんで、秒間1億ポリゴンくらいですかね。 よく知りませんが。
そうそう、 OSは今でもマイクロソフトのOSが主流です。 ウインドウズって名前です。 マッキントッシュみたいな感じですね、見た目。 あと、UNIXが無料で配られてます。 ソースコード付き、ソースの改変も自由です。 Linuxって名前ですけどね。 コンパイラーも無料で配られてますよ。 LSI-C86みたいな、ちゃんとしたCコンパイラーがフリーソフトであります。gccって名前ですけどね。 C言語、BASIC、他にもいろいろな言語のコンパイラーが、有志によって作られて、インターネットで配られてます。 そういえば、マイクロソフトもコンパイラー含め、統合開発環境を無料で配ってました。 そちらはBASICが主流ですか… へぇ、2万円ですか… 大変な時代ですね… MS-DOS??? ああ、聞いたことありますw へぇ2万円ですか… へぇ〜〜〜… 大変な時代ですね… そういえば、関係ないですけど、 先日、大地震がおきて、福島で原子力発電所が爆発しましたよw なんか原子炉の建物が吹っ飛んで、鉄骨とかグシャグシャになってる映像がNHKでやってましたw こっちはこっちで大変な時代です…www (毎日ニュースで「東京の飲み水が放射能汚染されました〜〜」とかやってますw なんという世紀末www) あ、でも安心してください。 ノストラダムスは外れましたからw 1999年7月は、ふつうにふつうの夏でしたよw
867 :
デフォルトの名無しさん :2011/04/01(金) 07:52:42.35
int main(void) がデフォだと思うのに main() と省略してるプログラムとか何のつもりなのでしょうか?良く見かけます。
) ( ,, ) ) ゙ミ;;;;;,_ ( ミ;;;;;;;;、;:..,,.,,,,, i;i;i;i; '',',;^′..ヽ ゙ゞy、、;:..、) } .¨.、,_,,、_,,r_,ノ′ /;:;":;.:;";i; '',',;;;_~;;;′.ヽ ゙{y、、;:...:,:.:.、;:..:,:.:. ._ 、} ".¨ー=v ''‐ .:v、,,、_,r_,ノ′ /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._ .、) 、} ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′ /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、) 、} ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′
) ( ,, ) ) ゙ミ;;;;;,_ ( ミ;;;;;;;;、;:..,,.,,,,, i;i;i;i; '',',;^′..ヽ ゙ゞy、、;:..、) } .¨.、,_,,、_,,r_,ノ′ /;:;":;.:;";i; '',',;;;_~;;;′.ヽ ゙{y、、;:...:,:.:.、;:..:,:.:. ._ 、} < おまえ、実務経験あるのか? ".¨ー=v ''‐ .:v、,,、_,r_,ノ′ /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._ .、) 、} ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′ /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、) 、} ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′
ウンコに言われちゃおしまいだね
どうせなら int main(int argc, char* argv[]) { int a = 1 + 1; return 0; } をデフォにしてみてはどうでしょうか? きっと先生も満点くれるとおもいます。
Cをマクロとして使うのは普通ないですか? PythonとかRubyでやるべきでしょうか?
10桁の数字の上から2桁目から下から2桁目までの数字をint型で表示したいです。 どうしたらいいですか? 123456789→2345678
学校の宿題は自分で考えたほうがいいぞ
int i = 123456789, j; char buf[128]; sprintf(buf, "%d", i); buf[8] = '\0'; j = atoi(buf + 1); printf("%d\n", j);
>>876 たとえば、指定したフォルダに特定のファイルやフォルダを作成するとか
特定のデータをデータベースに記録するなどです
>>880 バッチファイルとかシェルスクリプトとかワンライナー的な雑務用途に
それらスクリプト言語の代わりにCを使いたいということか?
まぁ使いたければ別にいいんじゃない
大抵は面倒が増えるだけだと思うけど、処理の内容によってはCで書くしかないこともあるかもしれないし
C言語ってスクリプト言語に分類される?
C言語インタプリタってスクリプト言語?
>>867 何も問題ない
省略されれば暗黙でintだ
引数はvoidでもなんでもお好きなように
>>884 どっちがベースかによる。
perlだってコンパイルできる。
887 :
デフォルトの名無しさん :2011/04/01(金) 15:53:37.98
次の動作を自動化したいのですがどうすればいいですか? スクリプトで処理するほうがいいのでしょうか?よろしくお願いします。 1.ecdh 0 > P (自分の公開鍵を生成する) 2.ecdh 1 P > Q(自分の公開鍵に署名する。この時256ビットの乱数を手で入力する) 3.P,Qをメールで送る。 4.相手の公開鍵 Rと署名Sをもらう。 5.ecdh 2 R < S 相手の公開鍵の署名を検証する。(That's Trueと出ればよい) 6.ecdh 3 < R (相手の公開鍵Rをリダイレクトして共有鍵を生成する。アクセスパスワードの設定が必要) 7.オリジナルの鍵key.binのバックアップを取り、seed.keyをkey.binに変更して相手との通信に使う。
鍵の人キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
CとC++について 1.両方覚えるべきか? 2.どちらを先に覚えるべきか? 3.どっちを切り捨てるべきか? お願いしますっ!
890 :
デフォルトの名無しさん :2011/04/01(金) 16:35:22.03
C言語ほど低級な言語は無いと思う、自由度が高すぎる。 C++はコードが難し過ぎる。
>>889 CとJAVAの両方覚える、その後必要ならC++ と個人的には思った
C++だろ。 Cはすべて使えるし、便利になっている。 文字列とか、ポインタなどC言語の特徴的なものを使わずに 同じ事が可能。
893 :
デフォルトの名無しさん :2011/04/01(金) 17:08:25.94
C言語はポインタや配列のおかげで非常に分かりやすい。 C++はわかりにくい。
>>889 C++はCの要素が内包されてるからC++だけ覚えればいい
VSインストール後に再起動しないとOSがアップデート出来なくなるバグが発生するんだけど俺だけ?
C〜Java or .NET〜C++がいいよ
C++はいろんな「道具」が揃っている Cはポインタ「しかない」 どちらを選ぶかは自由
901 :
デフォルトの名無しさん :2011/04/01(金) 17:56:39.84
C++は見にくいから嫌い。 Cは複雑だけど分かりやすい。
C:奇怪 C++:複雑怪奇
>>786 #include <stdio.h>
void func(char *p, int n, int r, int indx)
{
if(r == 0) {
printf("%s\n", p);
return; }
if(r > n - indx) return;
p[indx] = '1';
func(p, n, r - 1, indx + 1);
p[indx] = '0';
func(p, n, r, indx + 1);
}
int main(void)
{
int i, n, r;
char buff[256] = {0};
scanf("%d%d", &n, &r);
for(i = 0; i < n; i++) buff[i] = '0';
func(buff, n, r, 0);
return 0;
}
904 :
デフォルトの名無しさん :2011/04/01(金) 18:41:42.60
>>902 アセンブラ:超常現象
C:怪奇
C++:怪異
906 :
デフォルトの名無しさん :2011/04/02(土) 04:34:35.25
&&, ||の演算子について質問です。 手元の入門書に、&&(||)は無駄な処理を省いていて、 a && b はまずaの式を評価して、もし偽ならばbの式は評価しない。 a || b はまずaの式を評価して、もし真ならばbの式は評価しない。 といったことが書かれてありました。 上の説明では先に左のオペランドから評価されているんですが、逆に a && b はまずbの式を評価して、もし偽ならばaの式は評価しない。 a || b はまずbの式を評価して、もし真ならばaの式は評価しない。 と、右から評価される可能性も考えられませんか? 一般に式の評価順序は決まっていない(コンパイラに依存する)と聞いたことがあるので、 コンパイラによっては、右から評価される可能性も考えられると思います。 それとも&&(||)の演算子だけは、必ず左のオペランドから評価されなければならない、 と決まってるんですか? まだ初心者なので、用語の使い方が間違ってたらごめそ
昔は、コンパイラに依存してたけど 今時のコンパイラは...
初心者は余計なこと考える必要はない
>>906 >一般に式の評価順序は決まっていない(コンパイラに依存する)
そのとおりなのですが例外があって、少なくとも、&&, ||, は左から右に評価します。
cf. ISO/IEC 9899:1999 6.5.13.4, 6.5.14.4,
三項演算子(条件演算子)についても、第一オペランドの後に副作用完了点がくる、という記述があるので、もしかすると左から右に評価すると定義されているとしていいかもしれませんが、私には言い切る自信がありません。
cf ISO/IEC 9899:1999 6.5.15.4
入門書に左から右って書いてあるのに、聞いたことがある程度の知識でそれが間違ってるとか思えるのがすげえ
ま、キチガイだからな
>>906 入門書のまえがきを読んでみ
コンパイラは○○でだとか
○○規格に準拠だとか但し書きがあるはず
なんでもそうだけど
なんらかの前提(ルール、共通言語、共通認識)がなければ
会話が成り立たないんだな
そうじゃなくC言語の標準があるでしょ。標準に実装依存と書いて あればコンパイラによるし、その順番に依存するコード書いたら いけない。標準に順番が書かれていればそれを守らないコンパイラ はC言語のコンパイラといってはいけないんだから、その順番は 前提としていい。それだけのことでしょ。
初めて書き込みます、初心者ですみません 前々からアプリの自作に憧れており、つい最近C言語に手を出そうと決めました 慣れてきたら次はC++を学びたいと考えています まずは入門書をいくつか流し読みし、まだ最初の数ページを実践している段階なのですが…… 例えばIEのような、ウィンドウ?を表示する為には何が必要なのでしょうか? C言語を使って表示するより、C++言語を使って表示した方が簡単でしょうか? アプリ完成までの全体像をイメージ出来ればやりやすいのですが…… 未だプログラミングについて知識が曖昧なので、変な質問だったらすみません
入門書に書いてあることは正しいが、順番に依存するような実装はするなってことだな
ウィンドウズAPI
テキストファイルの中にtest0101という文字列があるか確認するのは難しいですか? Windows APIを使うほどの高等な技術でしょうか? C言語の基本文法でできますか?
strpbrk
>>919 テキストファイル全体が一度にメモリに読み込めるなら
strstrが使える。
読み込めない場合は、分割して読込すれば良いだろうけど、
対象文字列が切れた時の処理が必要。
fopenはC89の範疇だろうが
このスレの先輩方の温かいお言葉と励ましでC言語の勉強をスタートした者です VC++の無料の奴をダウンロードしました あの自分が作ったコードを先輩方に見てもらってどこがダメだとか指摘してもらえるかもしれないスレはどこに行けばよいでしょうか?
>>924 ここでいいよ
長かったら直接書かずにどっかにうpしてもらえれば
あと、こういう結果が欲しかったのだけどこうなってしまった、とかいうような状況説明も付けて
926 :
デフォルトの名無しさん :2011/04/02(土) 11:45:52.44
構造体の型の宣言ってmain関数内か、ヘッダのすぐ下でするのかどっちですか? どっちでもいいですか?
mainの中でしか使わないならmainの中でいんじゃね?
>>919 分割で考えてみた
fpよりfdの方が分かりやすくて好き
#include <stdio.h>
#include <string.h>
#define BUF_SIZE (1024)
int search_str(const char* path, const char* str)
{
FILE* fp;
char buf[BUF_SIZE], *str_pos;
int read_cnt = 0;
if((fp = fopen(path, "r")) == NULL) return -1;
while(fread(buf, sizeof(char), sizeof(buf), fp) > 0){
if((str_pos = strstr(buf, str)) != NULL){
fclose(fp);
return (int)(str_pos - buf)
+ (sizeof(buf) - sizeof(str)) * read_cnt;
}
fseek(fp, -((long)sizeof(str)), SEEK_CUR);
read_cnt++;
}
fclose(fp);
return -1;
}
readはこうした方がいいか size_t ret; while((ret = fread(buf, sizeof(char), sizeof(buf), fp)) > 0){ memset(buf + (char*)ret, NULL, sizeof(buf) - ret);
930 :
デフォルトの名無しさん :2011/04/02(土) 12:22:49.13
ヘッダファイルって #stdio.hとか #stdio.mathのことですか?
stdio.math というのはありませんぜ旦那 stdio.h とか math.h とかのことです
>>929 freadでbuf一杯のサイズ読み込んだとき、strstrに渡しても大丈夫?
せっかく作ったのに誰も見てくれなくて哀しい……
ウィンドウズのコマンドプロンプトで動くハローワールドを作った
http://www1.axfc.net/uploader/Sc/so/220703 遊び方
c:>hello
Hello World!
c:>hello "Good Morning!" good.exe
で good.exe ができる
c:> good
Good Morning!
となる。good.exe も当然同じ機能を持ってる。
(勿論、どんな文字列でもいける)
あほみたいだけど、一応コンパイラコンパイラなんだ
>>933 実行ファイル置いても、誰も動かさないのでは?
>>933 それだけなら自分の複製を作って
初期化する文字列部分を書き換えるだけでできるし面白くない
前提(ルール、共通言語、共通認識)なんてないね。 誤認識してるほうが多いような?
>>935 勿論、真面目な奴だとBNFパーザを内包して、自前のスクリプト言語で
超言語代入分の部分に関する動作を記述して、まともに動くコンパイラ
コンパイラを作ってるよ。
<NTSYMBOL>::=<><><>:action;
アクションの部分の書き方が定まったものがないから人には勧められないけど……
確かに上にだしてるのは、ランタイムが無しでサイズが1KBなのが売りだけかも
938 :
デフォルトの名無しさん :2011/04/02(土) 12:57:51.72
static const typedefを重要度で順位で付けるならどうなりますか?
優勝:static 2い:typedef 3い:const
typedefとconstは使えなくても人力で何とかなるけど、 static使えなきゃグローバルにしなきゃいかんからな
#include <stdio.h>なんですが #include <"stdio.h">という風に囲わなくてもいいのですか? stdio.hの部分は絶対パスで書くことはないのですか?
#include <stdio.h> か #include "stdio.h" のどちらかです 混ぜてはダメです 絶対パスで書いてもいいけど、面倒臭いでしょ
絶対パスで指定する利点がわからない
944 :
Lv1 :2011/04/02(土) 13:29:28.68
>>942 ありがとうございました
Lv1に昇格しました
945 :
デフォルトの名無しさん :2011/04/02(土) 13:37:17.07
プログラミング技術卓越してる奴ならstatic使わなくても大丈夫なんじゃね?
>>945 そう言う奴はmainだけでプログラムが書けそうだな
947 :
デフォルトの名無しさん :2011/04/02(土) 13:40:49.43
>>945 だね
外部シンボルの制限がきつかった頃の痕跡器官といっていい
アフォかstatic普通に使うだろC++でprivate変数一切使わずにクラスを作るようなもの
プログラミング技術卓越してる奴ほどstaticを有効に使ってる ということが分からのがプログラミング技術未熟者
関数内とそれ以外でstaticの意味が違うじゃん
951 :
Lv1 :2011/04/02(土) 14:01:06.28
#include <stdio.h> int main(void) { int a[3]; a[0] = 4; a[1] = 6; a[2] = 9; int i; for (i=0; i<3; i++) { printf("%d\n", a[i]); } return 0; }
952 :
Lv1 :2011/04/02(土) 14:02:05.42
#include <stdio.h>
int main(void)
{
int i;
int a[3];
a[0] = 4;
a[1] = 6;
a[2] = 9;
for (i=0; i<3; i++) {
printf("%d\n", a[i]);
}
return 0;
}
>>951 だとエラーになって、
>>952 ではエラーになりません
int i;の位置がaよりも後に来るとエラーに来るのは何故ですか?
変数はブロックの最初でまとめて宣言しないとだめだから
954 :
デフォルトの名無しさん :2011/04/02(土) 14:05:00.94
static VS キャスト演算子 static VS typedef static VS 配列 sitatic VS enum 便利度で言えば全部staticの負け?
プログラマに向いてないから別の道を探した方がいい
956 :
Lv2 :2011/04/02(土) 14:06:34.20
関数と大域変数は、 外部ソースからアクセス可能にするという、運用上の特別な理由が無い限りは、 基本的に全て static として定義した方がよいです。 これはソースを書いた人間が、思慮深い優秀なCプログラマーか否かを判断する、一つの指標にもなります。 C++ の class のデフォルトが private なのも、もともとの根拠は C の static と同じ理由です。
958 :
デフォルトの名無しさん :2011/04/02(土) 14:09:20.93
プログラミング向いてない人程、マニアックで技巧的でユニークなプログラム、アプリを作る。 プログラミング向いてる人程、単純でありきたりなプログラムを早く作る。
959 :
デフォルトの名無しさん :2011/04/02(土) 14:47:57.83
>>957 private がデフォつーのは、あくまで C++ から以後の考え方で
C が public をデフォにしているのは当時なりの善だったんだよ
アセンブラでは private がデフォだった(外部シンボルを手間をかけて「作る」必要があった)
それを C では public をデフォにわざわざ変えた(使えるものは自己責任で使えという思想)
その後 C++ で再び private をデフォにした(隠しコマンドを気安く使うなという思想)
言語自体の設計思想とずれてる奴がこういうマクロを作る
#define begin {
#define end }
おまえの言ってることはこれに近い
960 :
デフォルトの名無しさん :2011/04/02(土) 14:50:22.84
#include<stdio.h> #include<stdlib.h> #include<ctype.h> main() { printf("%c",('c'&'b')); }
961 :
デフォルトの名無しさん :2011/04/02(土) 14:56:26.73
汗上がりの人には隠蔽とかいう認識がなかっただけでしょ
staticって呼び方、どうにかならなかったのか
965 :
Lv2 :2011/04/02(土) 16:04:24.53
ポインタというのは int x = 10; int型の変数xを宣言して10を代入する int *p; ポインタ型の変数pを宣言する p = &x; pにxのアドレスを格納する *p = 30; xのアドレスに30を代入する printf("%d", x); 30が表示される という認識でよいでしょうか?
966 :
デフォルトの名無しさん :2011/04/02(土) 16:11:47.66
バッチファイルってVisualC++の場合どうやって実行させたらいいですか?
>>959 もうかなり前から、みんな
>>957 みたいな考え方じゃない?
モジュール毎にソースファイル割って、グローバルは極力使わない
設計思想とか言っても、その言語設計者がそういう使い方推奨してるし
>>954 どれもいるけど、staticはプログラムの構造自体変わっちゃうからなあ・・・
>キャスト演算子
memcpyとmemsetで何とかなるかな
>typedef
まあ使わないでも
>配列
ポインタ+mallocで何とかなるか?
malloc禁止なら、静的領域を固定で確保か・・・
>enum
#defineでいいな
969 :
デフォルトの名無しさん :2011/04/02(土) 16:50:42.19
どんなに精密なアプリでも厳密には分からないバグは発生してるものなんですか?
970 :
デフォルトの名無しさん :2011/04/02(土) 17:03:02.66
>>967 グローバルはグローバル
いくら static で五十歩百歩なスコープを付けても
構造化プログラミングからは外れるものだ
この意味ではマクロも同類
言語の設計者がああしろこうしろと押しつけがましいことを言わないのが C の思想の1つで
珍しくそのようなことを言っているのは goto に対してくらいだ
# もっとも goto のスコープには別な理由があるんだが
それから「もうかなり前から」とは C ができる前からで
監視モードや主記憶キーで隠蔽はしていて
「ここは使わないでね♥」みたいな甘ちゃんなやり方じゃなかっただけだ
>>970 > グローバルはグローバル
> いくら static で五十歩百歩なスコープを付けても
> 構造化プログラミングからは外れるものだ
ちょっと何言ってるか分からないんですけど
> それから「もうかなり前から」とは C ができる前からで
> 監視モードや主記憶キーで隠蔽はしていて
> 「ここは使わないでね♥」みたいな甘ちゃんなやり方じゃなかっただけだ
かなり意味分からないんですけど
C以前の話とか、無意味だと思いますが
グローバルにするのは初期のBASICのやり方かも BASICのコード、そのままCにしましたってコード見たことあるし
初心者なんですが for文とかの条件でつまずくんですが 1回多かったり、どう回せば上手く出力できるかわかりません。 やっぱ、こういうのは慣れなんでしょうかね?
>>965 いいよ
>>973 どう書いたらどう動くのか、正確にfor文や条件式の意味や動きを理解できてないだけだろう
975 :
デフォルトの名無しさん :2011/04/02(土) 17:31:45.53
976 :
デフォルトの名無しさん :2011/04/02(土) 17:32:30.86
構造体のメンバーについて質問です。 ->と.はどう違うのでしょうか? 構造体penのメンバーx1はpen->x1なのかpen.x1とするのかどっちですか?
>>973 症状から考えると
配列をa[n]で宣言したらa[0]からa[n-1]のn個の領域しかアクセスできないよ
か
浮動小数点数を比較するのはやめておけ
のどっちかだろ
979 :
デフォルトの名無しさん :2011/04/02(土) 17:35:02.15
>>970 > グローバルはグローバル
> いくら static で五十歩百歩なスコープを付けても
> 構造化プログラミングからは外れるものだ
その理屈でいくと構造化プログラミングなんてものは存在しないのでは?
main関数のみで#includeも出来ないよね
とりあえずあれだ、老害のいるプロジェクトのメンバーには入りたくねえってこった 使わないグローバルが見えてるプログラムなんて見たらアチャーって思うし、後輩なら指導する
983 :
デフォルトの名無しさん :2011/04/02(土) 17:39:42.20
>>981 #include ?? どっから出てきた?
少なくともそれは構造化プログラミングを肯定も否定もしないぞ
グローバルスコープ云々って構造化と関係ないじゃん
>>983 グローバル自体が構造化を否定(笑)ってのがお前の持論じゃないの?w
986 :
デフォルトの名無しさん :2011/04/02(土) 17:44:52.03
>>984 だからそう言ってる
static をつけても同じことだと
Cなんてどこがいいの? C#が最強でしょ。GUIも簡単だし。 Cのいいところ教えてください
988 :
デフォルトの名無しさん :2011/04/02(土) 17:47:04.00
>>986 スコープが違うのに、何が同じなんだ?
>>987 Windowsアプリ作ってる人ばかりじゃないんだよ
991 :
デフォルトの名無しさん :2011/04/02(土) 17:49:05.30
仕事で書くプログラムの量って毎日何行くらいですか? 300行くらい?
992 :
デフォルトの名無しさん :2011/04/02(土) 17:50:12.90
>>989 同じだと言っているのは構造化プログラミングの観点からだ
構造化プログラミングとは何かは他で調べればいい
以前、ぐローバル変数は禁止というプロジェクトで、 「共通テーブルなのでいいでしょ?」と言って認めさせ、 でっかい構造体を置いたっけ。 後からメンバーがどんどん追加されて行ったのには笑った。
994 :
デフォルトの名無しさん :2011/04/02(土) 17:52:01.67
職業プログラマは専門用語自重しろ。
>>992 君は構造化プログラミングとオブジェクト指向の区別がついてない
>>992 だから、言語関係なく隠蔽は大事だよね、ってのが世の中の流れだって
いくら屁理屈並べて言語仕様でデフォだからとか言ったって、通用しないよ
>>993 まあ全部get/set関数ってのはやりすぎ感があるね
997 :
デフォルトの名無しさん :2011/04/02(土) 17:56:13.97
>>995 隠蔽=private みたいな矮小な思考の持ち主がよく言うぜ
>>991 一ヶ月で300行くらい
会議、資料作成、調査が8割
999 :
デフォルトの名無しさん :2011/04/02(土) 17:57:22.61
アプリ作るだけなら一つの言語覚えとけばいい、色んな言語覚えるのは 時間の無駄に過ぎない。
>>999 web開発なら最低4つはいるもんな
HTMLとJavaScriptとSQLとPHPかCGI書けるやつ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。