なぜかC#スレに立てろと来たので立てました 依頼者は心のそこから詫びて自殺してください
※スレが荒れるので、◆QZaw55cn4cは書き込み禁止です
>>1 >★分からない事をなるべく詳しく書いて下さい。
「何が判らないのかをできるだけ詳しく」。
分からないことは詳しく書けない。
6 :
デフォルトの名無しさん :2011/04/03(日) 10:28:49.22
「test.c」 #include <stdio.h> #include "func.h" int main(void) {int a = func();printf("%d\n", a);return 0;} 「func.c」 #include <stdio.h> #include "func.h" int func(void) {int a;printf("input number: ");scanf("%d", &a);return a;} 「func.h」 int func(void); 単品のファイルに書いた場合はエラー無くコンパイルできます。 vcvars32.batを実行した後[cl test.c func.c]を実行すると以下のエラーがでてコンパイルできません。 /out:test.exe test.obj test.obj : error LNK2019: 未解決の外部シンボル _func が関数 _main で参照されまし た。 test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
typedef struct hoge{ ... } hoge_t; のように書いているサイト様が多いのですが、この"_t"はtypedefの意味ですか?
>>6 VisualStudioスレへ。恐らくC++としてコンパイルされているんでしょう。
>>7 単に「type」かと。
9 :
デフォルトの名無しさん :2011/04/03(日) 10:42:02.38
了解しました そちらのスレで聞いてみます
11 :
デフォルトの名無しさん :2011/04/03(日) 18:57:22.76
ポインタについて分からないので教えて下さい。 int *t; int s; t=&s; とすると tとsが表すアドレス番地は一緒ですか? printf("%u",&t);@ printf("%u",&s);A @Aは一緒ですか?
printf で比較すべき値は t と &s じゃね?
13 :
デフォルトの名無しさん :2011/04/03(日) 19:16:40.17
#include <stdio.h> #include <time.h> int main(void) { int cpu; int i; int result; int user; printf("0:グー\n1:チョキ\n2:パー\n"); scanf("%d", &user); srand((unsigned)time(NULL)); cpu = rand() % 3; result = (user - cpu) % 3; switch (result) { case 0: // あいこ printf("あいこ!"); break; case 1: // 負け printf("負けました。。"); break; case 2: // 勝ち printf("勝ちました!!"); break; default: printf("resultの値がおかしいですよ?\nresult=%d\nuser=%d\ncpu=%d\n", result, user, cpu); break; } }
14 :
デフォルトの名無しさん :2011/04/03(日) 19:19:07.69
>>12 おそらく違うと思うんですね。
tはsを操作するための拠点アドレスがあり、t*==&sは実際にsの場所でしょう。
printf("&u",&t)とprintf("%u",&s)は違う値が出力されると思います。
15 :
デフォルトの名無しさん :2011/04/03(日) 19:20:59.24
>>13 のコードはジャンケンをするプログラムです
resultの値が-1になってしまうのですが原因は何故なんでしょうか?
0あいこ
1まけ
2かち
0グー
1チョキ
2パー
(0-0)%3=0 あいこ
(0-1)%3=2 勝ち
(0-2)%3=1 負け
(1-0)%3=1 負け
(1-1)%3=0 あいこ
(1-2)%3=2 勝ち
(2-0)%3=2 勝ち
(2-1)%3=1 負け
(2-2)%3=0 あいこ
(user - cpu + 3) % 3
17 :
デフォルトの名無しさん :2011/04/03(日) 20:52:53.02
ありがとうございます3を足したら良くなりました
数学で言う余りと % 演算子の違いに引っかかったか
>>18 すうがくでいう余りは、除数、被除数のいずれかが負のときは文脈定義だし、 C の % も、最小非負剰余であるか絶対値最小剰余であるか、あるいはそれ以外になるかどうかは(仕様書にははっきり書かれていないが)処理系依存だった記憶があります。
20 :
デフォルトの名無しさん :2011/04/03(日) 21:55:38.95
関数プロトタイプの利用価値を教えてください。
>>20 一つのプログラムがを複数の c ファイルで構成されるときに威力を発揮します。
22 :
デフォルトの名無しさん :2011/04/03(日) 22:12:21.80
a.outとa.exeの違いって何ですか?Cygwin使ってます。 a.outって何でしょう? 実行ファイルがtの場合 t a.outとするのでしょうか?
>>22 >a.outって何でしょう?
コンパイル時の伝統的な出力先
>実行ファイルがtの場合
>t a.outとするのでしょうか?
a.exeなら「t a.exe」で実行するのか?
なら、それで良いと思われ
配列ってのが具体的に良く分かりません。 配列を表すときはint char何ですか? int pip[]="ABCD"; としてはダメなのでしょうか? 配列とは具体的にどういうのを配列というのですか?文字列も配列だし int[]={1,2,3}; も配列だそうです。
25 :
デフォルトの名無しさん :2011/04/03(日) 22:35:40.45
>>23 a.outのaは何を表すのですか?
a.exeのaは実行プログラムの名前ですから
t.exeでもk.exeでもいいんですよね?
char型の計算で-1とか-3とか-の数字はないのでしょうか?
>>26 signed char ならありうると思います。
単に
char c;
と宣言したときに、signed char、 unsigned char のどちらになるかは、処理系依存だったはずです。
環境依存だからコンパイラのマニュアル見れ
>>24 char s[] = "abc";
は、
char s[] = { 'a', 'b', 'c', '\0' };
の特別な表現(便宜上設けた表現)である。‥‥@
ということだけ、理屈ぬきに丸暗記しておけばいいと思います。
どんな型の配列でも、その宣言と初期化は
int a[3] = { 1, 2, 3 };
double b[3] = { 3.1415926, 2.71828, 0.57721566 };
と書くのが基本です。‥‥A
>int pip[]="ABCD";
@でもAでもないので不可です。
>>25 aはassemblerのa
ぶっちゃけunixつーかリンカができる前の遺物
>>29 charって文字型ですよね。
char s[]={'0','1','2,'3'};として
sの文字を出力すると
char整数 0 1 2 3に対応する文字コードの列が出てくるんですか?
DEFGみたいに。
ポインタって何が難しいの?
>>29 C言語に文字型という型は存在しない。
(charはただ単に符号有り1byte型って事。)
質問にある文字コード列が出るか?は、恐らくprintfを使うと思うので、
char s の値を、数値として出力するか文字として出力するか、で変わるよ。
下に適当なサンプル載せました。試してみてちょ。
int main(void)
{
char test[5] = "11230";
char i;
printf("CPU値:");
for( i = 0 ; i < 5 ; i++ )
{
printf( "%d", test[i]); /* ←数値として出力 */
}
printf("\n\n文字列:");
for( i = 0 ; i < 5 ; i++ )
{
printf( "%c", test[i]); /* ←文字として出力 */
}
}
初期化値のある配列の要素数を自分で数えるのは下策。 int array[] = {1, 2, 3,}; と言った要領で書けばいい。
>>34 string型ってありませんか?
%sとすると文字列が出てきますよ?
文字列リテラル内のシングルクォートを バックスラッシュでエスケープするのは 間抜けに見えるな。
>>37 >
>>34 >string型ってありませんか?
>
ねぇよ。
>%sとすると文字列が出てきますよ?
だから何?
>>37 string 型というのは厳密には c にはありません。
printf の %s は、
与えられた数値を特定のアドレスとみなし、そのアドレスから先にいずれ '\0' が格納されているアドレスがあるものと仮定して、
与えられたアドレスから '\0' が格納されているアドレスまでのあいだのアドレスの内容を(文字を示すものと仮定して)全部表示する、
というだけです。
これを文字列型、というのなら、あるいはそう考えていいかもしれませんが、巷の言語の「文字列型」と比べると制限がいろいろときついのです。
>>41 つまり文字型があるとまた違った事ができるんですね。
だから、文字列型なんてねぇってば。 書式指定子には%%もあるんだ。 まさか、こいつをパーセント文字型なんて言う訳ないだろが。
>>44 文字列型なる変数に自由に文字列を代入したり、文字列と文字列を連結したり、
といったことは、C では制限付き、いいかえるといろいろと下工作した上でやっと可能になります。
java や ruby の文字列型のようには C は自由にはできません。
だから「C には文字列型はない」と考えたほうが無難です。
C言語においてはmain引数を設定する時は、必ずint main(int argc, char *argv[])の形じゃないと だめなんですか? int main(int 3 , int t )とかint main(int argc, char *argc, float argt) とかだめなんですか?
>>48 そもそも、その引数を、どうやってmain()に与えるつもりだ?
>>49 端末のコマンドラインから入力します。
どのサイトでもint main(int argc,char *argv[])となってた。
デフォですか?
>>48 あなたがどのように書いたところで、
mainの外からやってくる引数が変わるわけではありませんよ
mainが引数取るって何かメリットあるんですか?
int t; t='3'; と t=3; と t="3"; は全部可能ですか?
>>50 main() はコマンドラインから直接呼ぶ為の物ではなくて、
プログラム実行のお膳立てをしている OS さんが呼ぶ為の
インターフェイスだから、形式は固定です。
プログラムが実行されたら直ぐに main 関数が実行されると
思うかもしれませんが、実際には main が呼び出される前に
メモリの用意やライブラリのロード等、沢山の処理が実行
されます。
>>52 どんな内容のプログラムを作りたいかによって、
プログラムの外から引数を与えたいこともありますし、
そんなことをする必要がないこともあります
>>53 >t='3';
可能です。t には '3' という文字の文字コードが入ります。
>t=3;
可能です。t には 3 が入ります。
>t="3";
不可能です。
>>56 int t;
t='3';
printf("%d",t)=??
それとも
int t;
t='3';
printf("%c",t)=??
??には何が?
>>56 嘘はイカンぜよ
>t="3";
"3"へのポインタをint型にキャストした結果が入ります。
>>56 文字の文字コードって何でしょう?
文字=文字コードですか?
'3'の文字コードは3?
よく分かりません。
>>57 printf()に代入は出来ません。
出力結果という意味なら両方「3」が表示されます。
>>59 '3'の文字コードが何なのか分からなくても問題ありません。
数値を表示したいときに"%d"を指定する。
文字コードを表示したいときに"%c"を指定するなど、ルールを覚えて下さい。
int t;
t = 3 + 3;
printf( "%d\n", t ); // 6が表示される
t = '3' + '3'; // 文字コード同士を足しても意味のある値にはならない
printf( "%c\n", t ); // 何が表示されるか分からないので↑はやっちゃ駄目
文字コード同士の足し算に意味を持たせることもできるけどな
C言語を書くときに、なぜみんな拡張子をcにするんだろう? 別にオブジェクト指向っぽく書かなかったとしても、 とりあえずcppにしておけば、少なくともコメントで//が使えたり 変数の宣言が自由な位置で出来たり、bool型やデフォルト引数使えたり 純粋に言語の機能があがって良いと思うんだけどな。
>>63 当然知ってると思うけど、大抵の C コンパイラなら // コメントとか
自由な変数の位置とかサポートしてるんだぜ
>>63 .cpp にするくらいなら .m の方がマシだわあ。
わざわざスマフォで使えないマニアック言語を使う理由は無いね。
>>64 もちろん知ってるが、//コメントを書くたびに心にちくっとこない?
gccだと-ansiオプションでコンパイル出来なくなるし、変数宣言も
正確にはc99仕様であってfor(int i = 0;;)という表記は出来ないしね。
俺は C99 を前提に書いてるから何の問題も無いよ。 もう直ぐ C1X も来るしね。
わかるわ 拡張子をcで書いているくせに // コメント使ってるソースコードは お前移植性のためにc言語にしているんちゃうんかと問い詰めたくなる
しかし現実問題、C99は使われてないよな ・MSのVisual StudioはC99非対応(というかC++のみ対応でC言語すらない) ・gccを前提にしているプロジェクトは、C99どころかgcc拡張使いまくり(関数内関数とか) ・一般的なLinuxのオープンソースのコードはANSI-C完全準拠 C99で書くくらいならC++かANSI-Cにしろと思うけど。何の意味があるの?
>>68 21 世紀になってまで // コメントを使えないコンパイラを使ってるなんてお気の毒様。
ちなみどのコンパイラ使ってるの?
>>69 gcc拡張よりGNU拡張が一般的な言い方だ。
よく「C99で書いてます」とか言うやついるけど、
ただのGNU拡張だったりすることは多いよな
何がC99の機能で何がGNU拡張か理解していない奴がほとんど。
>>67 みたいなやつなw
>俺は C99 を前提に書いてるから何の問題も無いよ。 wwwwww
>>72 見えない敵と戦うのはさぞ大変だろうな。毎日ご苦労。
>>71 お前みたいなやつがMSの独自拡張に拍車をかけるんだろうな
>>74 地獄のみさわさん、C99前提お疲れ様ーっす
ベターCってどこがクソなのかね?
まあ何にせよ .cpp は無いわ。 C との互換性は無くなるし、わざわざ過去の言語と心中する必要は無い。
>>79 別にその意見は否定しないけど、
2行目が思いっきり矛盾してる気がするんだけどw
>>80 君の中ではそうなんだろうな。そんな貴重な情報をわざわざ知らせてくれてありがとう。
ちょっとしたプログラムでcpp拡張子でベターCを書くのは特に問題ないんじゃない? 上にもあったけど、C99だとfor文の中での初期化が出来ないのがイケてないから それだけのためにcppにすることがある
ないな。
84 :
デフォルトの名無しさん :2011/04/04(月) 04:07:02.67
ないという奴は論拠がないな
86 :
デフォルトの名無しさん :2011/04/04(月) 04:16:28.56
>>85 言いづらいけど、馬鹿なのを隠して口出さないでくれない?
>>82 よく勘違いされるが、for文の中での変数宣言はc99では出来る。
gccでは出来ないんだが、最近のだと-std=c99オプションをつければ出来るはず。
GNU拡張とc99をごっちゃにするやつが多いのはこういうgccの挙動のせいなんだよな。
90 :
デフォルトの名無しさん :2011/04/04(月) 04:24:00.74
>>87 言葉も書けない馬鹿だって自己紹介は1度で十分です^^;
>>88 知らなかった。GNUはデフォルトでC99だと思ってた。サンクス
C99で書く奴氏ねよ
gccはそもそもC99を完全サポートしてないからな
>>93 お前晒しあげられてんだよ、ちょっと黙ってろ
結局 better C とか言ってる奴は C を知らないだけなんだよな・・・
>>97 むしろC++とCの境界線をしらない、というのが正しい気がする
cppを否定する材料が出てないんだけど。
>>98 ああ、確かに C だけじゃなく C++ も知らないという可能性もあるね
102 :
906 :2011/04/04(月) 04:38:51.64
前スレで&&(||)演算子に関する質問をしていた者です。
>>908 >初心者は余計なこと考える必要はない
確かにそうかもしれませんね。初めのうちは、こういうことを
考えなくても知らなくてもプログラミングに支障はなさそうですし。
でも、いつかこういうことを意識する時が来るかな? と思って
今のうちに質問してみました。
>>909 規格で決められていること、丁寧に教えていただきありがとうございました。
条件演算子の評価順序についても参考になりました。
gccしか使えない猿のC++拒絶反応が出てるだけだろ
最終的にCに落とし込む プロトタイプとしてのベターCならありだけど 最終的にcppなのにベターCってのはありえないなー 困惑するだけでしょ・・・
多分 ◆QZaw5 5cn4c がコテ外してファビョってるんだろ
>>104 クラス使ってたら許す、とかそんな感じ?
>>104 俺もそう思うわ。どっちの言語のプログラマにとってもメンテし辛いコードが出来るだけ。
C99だとfor文の中での初期化が出来ないのがイケてないと思い込んでいたから それだけのためにcppにしてた人はC++と手が切れてよかったね!
>>106 サジ加減はどうでもいいよ。
ただ、携わる人が不満を抱く事無く
明確な規則が設けられるのかと考えたとき
厳しいでしょって話。
ApacheプロジェクトだとC99のfor文初期化を使っちゃいけないんだけどね。 Linux関連のオープンソースもそうじゃない?使っていいのはGNU拡張までのはず。 そうでないプロジェクトがGNUもしくはApacheであれば是非教えてほしい。 ただでさえfor文初期化については歴史的に問題があったんだよ 初期のC++ではfor文の外までスコープが通った時代があって for(int i = 0; i < 10; i++) { printf("%d\n", i); } printf("%d\n", i); // エラーにならない こんな感じ。今でもコンパイラオプションでこう出来るはず。 MSの場合はバージョンによって挙動が変わったりするので、MS死んでくれ。 だからGNU拡張ではfor文の初期化は導入されていない。 でも時代とともにいずれ導入されるのは間違いないだろう。 C99でしかコンパイル出来ないコードを書く奴は オープンソースでもゴミ扱いされるから、 for文の中の初期化は今はやめておけ。
つまり Google や Mozilla の C++ のコーディングガイドでは例外を使う事を禁じているから、 C++ で例外を使ったコードを書く奴はゴミ扱いされる訳か それはそれは大変ですなあw ご苦労様なこってす
いや、普通にC++で例外使う奴はゴミじゃないか?
そか、じゃあ仕方ないねw
論点がずれてるんだよ ・一人で書く分にはcppでもC99でもおk ・多人数のプロジェクトの場合はベターC的cppとかGNU拡張にないC99とかやめておけ これだけの話だろ
>>110 とはいえ
C99でしかコンパイル出来ないプロジェクトもあるよね
楽なのは分かるけどそこを耐えて頑張って欲しいねぇ
>>111 for文の初期化式での宣言のみ可
それ以外はすべて不可
というベターC コーディング規約に比べたら天国ですね
Cスレでする話題じゃないな どっか他所行ってやってくれ
118 :
デフォルトの名無しさん :2011/04/04(月) 07:36:36.01
良く出てくるスコープという用語はどういう意味ですか? コンパイルとまた違うんですか?
寿命を伴った有効範囲
120 :
デフォルトの名無しさん :2011/04/04(月) 09:36:04.64
ランタイムライブラリってC言語のコードで記述したり呼び出したり する必要ないのですか?
C++プログラマはC99やC1Xが憎くて仕方ない。 C++と互換性が無いから(でも、どこに互換性が無いかは知らない)。 だから何かと難癖付けてC99の普及を妨害しようとする。
C言語にも規格とかあるんですね。そもそもC言語環境を提供するのはOsですか? それともコンパイラですか?
>>121 お前がそう思うんならそうなんだろう、お前ん中ではな
ぶっちゃけVisual Studio以外じゃC99は実用的なレベルで実装されてるし、 WindowsじゃC++自体オワコンだから ベターCとやらのためにC++にする理由なんて無いんだよね。
125 :
デフォルトの名無しさん :2011/04/04(月) 09:45:02.88
>>50 main(int argc, char **argv, char **envp)
なんてのはあって処理系定義(規格違反でないことに注意)
処理系定義でないのが
main(int, char **) と main(void) だけで
それでたいていのサイトがこれで書いている
>>124 でもオープンソースで採用されてない!不思議!
まぁぶっちゃけ、GNUでデフォルトの挙動がC99になった瞬間に
C99が普及してC90は終焉だと思うけどね。
あとVisual StudioはそもそもC言語をサポートしていない。C++のみ。
それでC99をサポートしないというのはちょっとフェアじゃない。
Visual Studio人気ですねぇ。
というか世の中にgccとVisual Studio以外にコンパイラなんてあるんだろうか bcc?メール?
>>129 まぁ実際のところbccは環境が良いですね。後はIntel Cとかかな。
bccはC++対応してC99非対応、Intel Cは部分対応(正式対応予定)
流れとしてはC++かC99か片方という感じなのかな
数値計算屋はiccを好んで使うよ 最近はgccも速いけどね
Visual Studioってcshやbash可能ですか?
LLVMってCコンパイラーなんでしょうか?
C99で採用されたrestrictに相当する定義を C++で行うことは可能?
gccにバージョンとかありますか?
>>135 あります。詳しくはgccスレへ。
>>134 コンパイラによってはC++でも処理系拡張でrestrictをサポートしています。
>>133 いいえ。
>>132 質問が意味不明です。VisualStudioスレへでも行きやがれ。
自作コンパイラとか作る人いたら天才だな。
140 :
デフォルトの名無しさん :2011/04/04(月) 10:47:58.43
>>139 何だとっ!?!?志を持った若者だぞ俺は。
それではその志を以って、シェルスクリプトとCの入門との関係を詳らかにしていただこうか。
142 :
デフォルトの名無しさん :2011/04/04(月) 10:55:46.14
あーあー!ヽ(`Д´)ノ!!
C99とかなんかいろいろあるんですね 初心者の場合は何を使えばいいのでしょうか? 今はVC++ 2010 Expressを使ってます
VC++ 2010
145 :
デフォルトの名無しさん :2011/04/04(月) 11:37:11.11
基本的な図形などの描写をプログラムを兼ねて勉強したいので Xwindowsを利用したいんですが、Windows7上では無理ですか? cygwinも使ってます。Unixをダウンロードしないとだめでしょうか?
>>143 何も考えずにそのまま使っていればよいよ。知っているに越したことはないけどね
>>145 tcl tk windowsで検索してみたら?
>>145 cygwinにもXWindowのpkgは含まれているから利用はできるよ。
でも、今時XWindowを生のまま使うのもナンセンスだけど。
詳しくは、cygwinスレ辺りで。
149 :
デフォルトの名無しさん :2011/04/04(月) 12:13:24.16
>>147 環境がごっそり変わるのはちょっと・・・
あくまで自分が利用したい範囲で・・
150 :
149 :2011/04/04(月) 12:21:33.38
>>148 ありがとうございます。スレ移動します。宿題なんで仕方ないです・・
プログラミングが好きじゃなくていやいや宿題やるようなら今すぐ学校やめろ
>>151 義務教育でいやいや宿題したことがない奴なんていないぞw
153 :
デフォルトの名無しさん :2011/04/04(月) 12:42:53.35
義務教育でプログラミングなんてねえよ
155 :
デフォルトの名無しさん :2011/04/04(月) 14:37:29.66
>>126 main()
{
auto class, virtual, template, new, operator, dynamic_cast, typeid;
return class= virtual= template= new= operator= dynamic_cast= typeid = 0;
}
↑VC で通るぞ
ブラウザのフォームのインプットエリアにカーソルがあるかどうか判定するのはどのような関数を使うのでしょうか? 用途はjavascriptでペーストが禁止されているページに文字列をプログラムでタイピングする為です コマンドラインで動作させるのは無理でしょうか? GUIじゃないと無理ですか?
>>154 オレ30歳だけど中学の技術でN88BASICやったぞ
学校によるんじゃね?
中学でプログラミングやってる奴はどんだけ頭良いんだよ。 あまりにも専門用語多くて挫折する。
>>159 「これ」ってどれ? やりたいことを具体的に書いてくれ。
Cライブラリのパスを確認するシェルコマンドってどうしたらいいですか? 例えば"stdio.h"とかprintf関数のパスを調べたいです。
>>162 環境によって違うし、入門レベルでやることでもないし、Cとも直接関係ないのでお使いの環境スレにでも逝きやがれ。
164 :
デフォルトの名無しさん :2011/04/04(月) 20:30:44.82
環境めんどくさいよねー プログラマーとしてはあんまり意識したくないところだよね SEさんちゃんとしてくださいなと言いたいところなのだが SEは総じて丸投げ体質だったりする
165 :
デフォルトの名無しさん :2011/04/04(月) 20:50:37.19
まともな丸投げならまだいいんだけど たのむから数学的に破綻した要求だけはやめてくれ
方程式をC言語で書くとどうなるの?
tp://codepad.org/fBo1Ye24 fwrite()がどうにも上手くいきません 例えばcountに書き込んだものをバイナリエディタで見ると、iが1だったときは01 00 00 00となってしまいます sizeofの使い方がおかしいのでしょうか…… gcc version 3.4.2 (mingw-special) OS: Windows 7 Home Premium 64bit すいませんが、宜しくお願い致します
>>167 バイトオーダーとかエンディアンとかで調べるといいよ
170 :
167 :2011/04/04(月) 21:21:59.68
>168 リトルエンディアンでしたので、それで逆(00 00 00 01ではなく)で出力されたのですね ビッグエンディアンへの変換を試みてみます 大変ありがとうございました
リトルインデアンな環境で sizeof(int) == 4 なら そういう動作が正常 (int型で 1 をバイナリ書き込みした時 00 00 00 01 を期待できるのはビッグインデアンな環境) utnion { int int_val; unsigned char char_val[4]; } val; val.int_val = 1; val.char_val[0] 〜 val.char_val[3] を調べるよろし ------------------------- 逆にファイルのフォーマットが決まってて 00 00 00 01 と書かれているものを int 値として取りだしたい要求であれば、自前で並べ替えとかを行うんだ
次に00 00 00 01を読み込んだら1にならないとか言い出しそう
173 :
167 :2011/04/04(月) 21:35:09.66
>171 >172 あー、バイナリエディタで直接見てるのがいけないのですね freadしたときには(01 00 00 00)を(00 00 00 01)として読み込める、ということでよろしいでしょうか お手数おかけして申し訳ないです
>>173 fwrite()で書き込んだデータは同じ環境であればfread()で正常に読み込める。
エンディアンを気にする必要があるのは、他の環境へ移植した場合など。
※同じ環境であれば実際に書き込まれたデータの形を気にする必要はない
175 :
167 :2011/04/05(火) 13:19:38.94
>174 なるほど、わかりました これからはエンディアンのことも覚えておくようにします ご丁寧にありがとうございました
176 :
デフォルトの名無しさん :2011/04/05(火) 13:35:33.06
>>16 すいません何故3を足さないと-1になるのでしょうか?
何度もgoogle電卓で計算しても(user - cpu) % 3で全てのパターンで-1になることはありませんでした
>>176 (-1)%3
が -1 になるか 2 になるかは処理系依存
178 :
デフォルトの名無しさん :2011/04/05(火) 13:43:33.86
そうでしたか 割り算したり余りを出したりするときはマイナスの数字にならないように気をつけたいと思います
179 :
悪いけど誰か↓スレ立ててくれ :2011/04/05(火) 15:20:38.45
スレタイ:Objective-CとiOSフレームワークならオレに聞け! 名前:ビル・ジョブス インスタンス変数には、xxx_、@synthesize xxx=xxx_で入力楽々、可読性低いが、setXxxでセッターオーバーロードも時にはアリ? @class PreviewStillImage; PreviewStillImage previewStillImage_; @property (nonatomic, assign) PreviewStillImage* previewStillImage; [self.navigationController pushViewController:self.previewStillImage animated:YES]; retainしないでassignならpop後にdeallocされてまさしくエレガント! エレガントなObjective-CでUIKit最高ですな。IBも使おうぜ!さぁ質問あるヤツは来い!有償アプリは遠慮してね。
180 :
悪いけど誰か↓スレ立ててくれ :2011/04/05(火) 15:32:51.60
すまん訂正 × PreviewStillImage previewStillImage_; ○ PreviewStillImage* previewStillImage_;
181 :
デフォルトの名無しさん :2011/04/05(火) 17:47:07.45
ポケコンでゲームを作って遊んでいます ゲームの移動手段としてカーソルキーを使いたいのですが、そのプログラムがわかりません。 誰かヒント下さい・・・
183 :
デフォルトの名無しさん :2011/04/05(火) 19:33:58.42
難しくてよくわかりませんでした
ポインタのポインタの宣言って なぜポインタ宣言子を2つ重ねるのでしょうか? どんなけ繋がってても単に「アドレスを格納する」だけなのに。
2次元の配列を無理やり1次元で考えようとしてるようなもん
unsigned int と unsigned long の違いを教えてください。
188 :
ビル・ジョブス :2011/04/05(火) 21:44:53.11
>>185 ポインタが指し示しているものがポインタだからさ
毎回キャストして使うなら環境に応じて別にunsignedとかでもいいんだよ
しかしプログラムが読みにくいだろ?
>>185 char*a=0,**b=0;++a;++b;
アドレスの進み方が違うから。2個以上は同じになるけど。
190 :
ビル・ジョブス :2011/04/05(火) 21:48:23.48
>>187 intが32bitでlongが64biやintもlongも32bitの処理系があるから処理系によっては同じ
まさかunsignedについて聞きたいわけじゃないよな?
>>185 格納している値の違い
int型へのポインタ
格納された値はアドレスで、そのアドレスにはint型が格納されている。
int型へのポインタのポインタ
格納された値はアドレスで、そのアドレスにはint型へのポインタが格納されている。
192 :
ビル・ジョブス :2011/04/05(火) 21:51:04.36
>>189 それは間違ってないが解釈の方向性がちょっと違う
193 :
ビル・ジョブス :2011/04/05(火) 21:54:13.62
添削しといてやるよ △格納された値はアドレスで、そのアドレスにはint型へのポインタが格納されている。 ○格納された値はアドレスで、そのアドレスにはint型を指すアドレスが格納されている。
>>193 添削する必要はない
※「int型へのポインタ」をその上で説明してるため
195 :
ビル・ジョブス :2011/04/05(火) 21:59:43.76
失礼した
196 :
デフォルトの名無しさん :2011/04/05(火) 23:03:53.08
>>190 16bit だと、unsigned int も unsigned long も同じでしょうか?
32bit だと、unsigned int = unsigned long ということでしょうか?
>>196 何に対して16bitとか32bitとか言ってるのか分からんが、
CPU・メモリに関係なく、各環境によってintやlongなどのビット幅が定義されている
198 :
デフォルトの名無しさん :2011/04/05(火) 23:13:11.64
すみません。例えばCPUが16bit ならunsigned int や unsigned long はもてないということでしょうか?
200 :
デフォルトの名無しさん :2011/04/05(火) 23:17:57.74
何度も申し訳ありませんが、 16bitでunsginede long をもった場合2バイトになるのでしょうか? 16と32bitで何で持ち方がかわるのかがよくわからないのです。
>>200 C言語を使う限りCPUのビット数なんて気にする必要はない
intもlongも、そのコンパイラで定義されたバイト数で構成される
202 :
デフォルトの名無しさん :2011/04/05(火) 23:28:53.49
>>201 なるほど。よっぽど古いコンパイラでもunsinged long くらいは定義してますよね?
そういうのって、コンパイラのマニュアルかなにかみればよいのでしょうか?
サイズが知りたければsizeof使えばいいだけのような
204 :
デフォルトの名無しさん :2011/04/05(火) 23:31:53.52
>>203 簡単に確認できる環境でもないので・・・
>>204 どの程度古いかにもよるが、ANCI(C89)に準拠してれば大丈夫
それ以前なら、マニュアル読むか、開発元に問い合わせるか
206 :
デフォルトの名無しさん :2011/04/05(火) 23:38:44.60
>>205 ANSIに準拠していれば、unsigned int = unsigned long だと思っていいわけですよね?
>>206 sizeof(unsigned short) <= sizeof(unsigned int) <= sizeof(unsigned long)
を満たしていることは期待していい
>>208 short < longを忘れたら誤解しかねない
210 :
デフォルトの名無しさん :2011/04/05(火) 23:42:12.99
>>206 >どの程度古いかにもよるが、ANCI(C89)に準拠してれば大丈夫
は
>なるほど。よっぽど古いコンパイラでもunsinged long くらいは定義してますよね?
に対する回答
大きさは
>>201 なのでマニュアルに載ってなかったり、問い合わせできなければ
>>203
213 :
ビル・ジョブス :2011/04/06(水) 00:16:33.27
なぜ、unsigned int と unsigned longについて知りたいか処理系も含めて質問してもらえますか?
データ長が大事な場合は、char/short/longを使う
何が大事なのか(メモリ量or1バイト==8bit)にもよるな
>>212 俺の勘違いだった
K&Rの読み杉らしい
charが32bitならsizeof(long)が1でもいいのか 実際の使い道とかは別にして
218 :
ビル・ジョブス :2011/04/06(水) 01:03:42.97
さて、では大抵の環境ではということろで答えておこう。
16bit CPUの場合、sizeof short == sizeof int ポインタとshortとintは16bit、longは32bit、long long intは64bit
32bit CPUの場合、sizeof int == sizeof long shortは16bit、ポインタとintとlongは32bit、long long intは64bit
64bit CPUの場合、sizeof int == sizeof long shortは16bit、intとlongは32bit、ポインタとlong long intは64bit
>>217 sizeof演算子の評価結果はあくまでバイト数かと
>>218 >sizeof演算子の評価結果はあくまでバイト数かと
sizeof(char)は仕様に準拠してれば常に1なんだが?
64bit CPUの場合は複数あるでよ
221 :
ビル・ジョブス :2011/04/06(水) 01:07:33.89
222 :
ビル・ジョブス :2011/04/06(水) 01:14:13.12
>>220 コンパイルオプションでも変わりますかね。long doubleとかも12バイトとか16バイトとか。
64bit CPUネイティブのコード生成した場合、longは8バイトが主流かもしれませんね。
>>221 >sizeof演算子の評価結果はあくまでバイト数かと
の意図は?
仮令何bitあってもsizeof(char)は1
常にUTF32だけを使うならcharが32bitでも誰も困らないな
intとlongを使い分けるほうが個人的には好きです
227 :
ビル・ジョブス :2011/04/06(水) 01:29:27.98
>>223 単位がなければ、記憶サイズ計算できないというか、ただ1では困りますよね。
charが32bitならsizeof char==4なのでは?
http://ja.wikipedia.org/wiki/Sizeof 主にCとC++において、sizeofは、データ型の大きさを求める単項の演算子である。
sizeofは原則としてコンパイル時計算される演算子で、式もしくは括弧で括った型指定子を与えるとその大きさをバイト単位で返す。
>>227 ちゃんとよめ
>厳密な大きさはsizeof (char)が1であることを除いて標準に定められていない。
>>227 char が 1 バイトってのは定義
何bitあるかは limits.h でも眺めてろ
だから、sizeof charは1であると定義されているの
231 :
ビル・ジョブス :2011/04/06(水) 01:33:33.94
だから、charが32bitなら だろ? その特殊な処理系はsizeof char==4を返すべきだろ?
コテを変えても馬鹿は直らんよなw
>>227 堂々と間違うなよ
>組込型の大きさは処理系定義となっており、厳密な大きさはsizeof (char)が1であることを除いて標準に定められていない。
って書いてあるだろ?
CHAR_BITが8でも32でも、sizeof(char)は常に1で、C言語ではそれを1バイトと呼ぶ
234 :
デフォルトの名無しさん :2011/04/06(水) 01:36:54.55
malloc に sizeof(char) を書いてないコードを追認するために 仕方なく汚い限定があるというだけ それに合わせてコードを書くのは美しさの観点から本末転倒
最小単位は8bitの方が楽な気がするけど CPUによっては最小単位が違うことがあるみたいだし
>>231 お前のところではcharが9bitのマシンでsizeof(char)が1.1ちょっとを返すのか?
Cだとビットフィールドで逃げる手もあるけど
>>236 先生、charが9bitでshortが12bitのマシンでsizeof(short)が1.3ちょっとを返してくれません。
>>238 bit単位でアクセスするのか
型によって記憶域が違うのか知らないが
かなり特殊なマシンだな
仮に存在したとしても short とかいう型名じゃないか
コンパイラが規格に沿ってないだろうな
240 :
デフォルトの名無しさん :2011/04/06(水) 01:51:06.37
ワード幅が2のべきじゃないマシンは広く出回ってるよ
241 :
ビル・ジョブス :2011/04/06(水) 01:51:58.47
そうだな、昔1byte 9bitマシンもあったな。当時Cコンパイラは無かったが。
242 :
ビル・ジョブス :2011/04/06(水) 01:56:45.33
しかし「sizeof charは1」なんて抽象的と言うか哲学的と言うか、現代でここまで議論というか仕様の対象になるのか・・。 とは言うものの、ま、標準で定義だから、char 9bitなんて標準じゃサポート無いだろうし色々無理あるだろうな。
2のべき乗じゃないこと考えるほうが
244 :
ビル・ジョブス :2011/04/06(水) 02:03:41.84
色々と後付けする暇なやつが居るよな〜感心するよな。
>>239 何かのネタで、そんな環境があるってみた記憶があるけど、間違いかもしれん。
ただ、そのネタの中でshortで12bitになってて、規格満たしてねーじゃんって思ったり
charが9bitなのに、他の型が2のべき乗になってて、sizeofは?って思ったりしたので、
そんな環境があることも確からしい。(幸か不幸かあたったことないけど)
246 :
ビル・ジョブス :2011/04/06(水) 02:12:31.13
char 9bitだとするとアドレッシングして9bit出してくるのか・・ intが倍の18bitだとすると18bit出すかマルチプレクサでバスサイクル2回回して出すのか・・ char 12bitマシンとか組込み用途向けに結構実用的かもしれんな・・しかし周辺デバイスが手に入らないな・・ 少しがっかりした。
NECのメインフレームが1バイトが9bit つか36bit機 Cコンパイラももちろんある でも実際に組んだことはないからsizeofがどうなるかはわからんのだよなぁ
248 :
ビル・ジョブス :2011/04/06(水) 02:23:24.13
ま、完全64bit CPU時代に向けてchar 16とか32bitになる布石なんだろうな。 今でもバイト単位のアドレス線なんて無くてレジスタ内部シフトで実現してるけど、 メモリを8bit単位でちまちまアクセスされちゃオーバーヘッドが大きすぎるしな。 ただ1byteが16とか32bitになるのは少し抵抗あるな〜。
>>247 構造体のパディングと同じで切り上がると予想
って36bit機だと、そのまま普通に表せるのか
まぁ、大昔は3の倍数が流行ってたから、8進数とか、その名残だね
250 :
ビル・ジョブス :2011/04/06(水) 02:33:20.84
>>247 あ!!!大昔ワードマシンって呼んでたよ!変なbit長のマシン!
Cコンパイラなんてあるんだ・・ってなきゃ困るよな。
C言語は中坊の頃PC-8801のCP/Mで覚えたんでスッカリC言語=バイトマシンの感覚なんだよね〜。
>>250 そうか
お前はPDP-11を変なマシンというのか
大昔のマシンの中身なんて知らないでしょ
メインフレームのことをマシンと呼ぶ奴は本物を見たことがない奴だ
ミニコンは見たことあるけど
255 :
ビル・ジョブス :2011/04/06(水) 02:46:21.95
PDP-11知ってるよ。使った記憶は無いな。変なCP/MみたいなコマンドラインのVAXは触った事ある。よくハングしたな。 直ぐにSophiaのマシンに変わっちゃったけど。
256 :
ビル・ジョブス :2011/04/06(水) 02:47:25.34
メインフレームってあれ淀物置だよなw キャビネットにしか見えんw
International Business Machines
258 :
ビル・ジョブス :2011/04/06(水) 02:48:40.82
IBM-3090 in JAL
メインフレームって呼び方は、フジテレビで深夜やったアニメで初めて聞いた記憶が
ACOSしか触ったことないけど、確かにホストと言っても、メインフレームとは、あまり言わないね。 でも、ホスト知らない人に対しては、メインフレームの方が通じる。
261 :
ビル・ジョブス :2011/04/06(水) 02:55:18.48
昔の汎用機のCPUというか概念的にスタックエリアって無いのにサブルーチンコールとかしてたんだぞ 戻り番地をレジスタに格納してさw
262 :
ビル・ジョブス :2011/04/06(水) 02:59:12.97
コントロールxxとかって呼び名で無限ループや保護違反起こすと淀物置の上にあった赤色灯が回るんだよw 確かにホストコンピューターという呼び名が当時中心だったような。
ジジイ多そうだな さすがC言語
いずれ、ジジイになるのに
265 :
デフォルトの名無しさん :2011/04/06(水) 09:33:42.86
ULONGをPUCAHRにキャストするにはどうすれば良いですか? いまは↓こんな感じですが美しくできないかと思ってます。 UCHAR dst[4]; ULONG src=0x12345678; dst[0] = src & 0xFF; dst[1] = ( src & 0xFF00 ) >> 8; ... func( &dst[0] );
共用体使えばいいじゃん
*((ULONG*)dst) = src;
268 :
デフォルトの名無しさん :2011/04/06(水) 09:54:27.68
この前ジャンケンを書いた者です いろいろ書いて慣れていきたいと思いますが、ジャンケンのように初心者に向いたサンプルみたいなお題って何がありますか?
ヒットアンドブロー
270 :
デフォルトの名無しさん :2011/04/06(水) 10:32:01.07
おおおおもしろそうですね!作ってみたいと思います!
マスターマインド
ラーメンタイマー
ラーメンタイマー(チキンラーメン対応晩)
274 :
デフォルトの名無しさん :2011/04/06(水) 11:33:59.74
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; int rnd; srand( (unsigned)time(NULL) ); rnd = rand() % 8999 + 1000; while (1) { printf("4桁の数を入力してください(0で終了): "); scanf("%d", &a); if (0 == a) { printf("終了します\n\n"); break; } else if (rnd == a) { printf("正解\n\n"); break; } else if (rnd > a) { printf("入力した数より高い位置にあります\n\n"); } else if (a > rnd) { printf("入力した数より低い位置にあります\n\n"); } } return 0; }
275 :
デフォルトの名無しさん :2011/04/06(水) 11:34:57.10
ヒットアンドブローを書いてみました ここを直したほうがいいなどのご指導お願いいたします
それはヒットアンドブローじゃないw
ラーメンタイマーまだ? もうお昼なのだが
278 :
デフォルトの名無しさん :2011/04/06(水) 12:15:41.27
ラーメンタイマーってなんですか?
281 :
デフォルトの名無しさん :2011/04/06(水) 13:06:09.34
あれ?4桁の数字を当てるゲームですよね? >>279 それも作ってみたいですおもしろそうですね
4桁の数字を当てるゲームだが、「ヒット」とか「ブロー」とか表示するはずだ
283 :
デフォルトの名無しさん :2011/04/06(水) 14:47:06.04
>>191 >
>>185 >格納している値の違い
>
>int型へのポインタ
>格納された値はアドレスで、そのアドレスにはint型が格納されている。
>
>int型へのポインタのポインタ
>格納された値はアドレスで、そのアドレスにはint型へのポインタが格納されている。
なるほど。ではint型へのポインタのポインタのポインタを宣言する時は、型がint型へのポインタのポインタだから、
((int*)*) *p
こういう意味ですか?
285 :
デフォルトの名無しさん :2011/04/06(水) 15:23:03.74
ラーメンタイマーってこれで合ってますか? #include <stdio.h> #include <time.h> #include <windows.h> int main(void) { time_t end_time; int m = 180; // カウントダウンの時間(秒数) end_time = time(NULL) + m; while( time(NULL) < end_time ) { printf( "%ld\n", end_time - time(NULL)); Sleep(1000); } printf("時間です!!"); return 0; }
>>285 プログラムを先に起動しておいて、Enterでカウントダウン開始
で、0になったら、ブザーをならすのが使いやすいタイマー
あと、細かいことを言えば、time_tは1秒とは限らないし、
その仕様は、まれに何処かの1秒を飛ばすことがあるが、細かいことを気にしなければOK
>>284 日本語の言葉で考えるなら、そうなのだが、C言語としては、そう考えない
*演算子や()が色々と評価された結果
((int *)*)*p;
は
([int型へのキャスト] *(乗算) ) [ポインタp]
と解釈され、*(乗算)に右側のオペランドがないためエラーになる
書き方としては
int ***p; // int (*(*(*p)));と同じ
となり、解釈は、pはポインタで、その格納先はポインタで、その格納先はポインタで、その格納先はint型と考える
>([int型へのキャスト] *(乗算) ) [ポインタp] >と解釈され、*(乗算)に右側のオペランドがないためエラーになる 間違えた。 キャストがあって、左側のオペランドがないから、*は乗算ではなく、アドレス演算になり *(アドレス演算)に右側のオペランドがないためエラーになる
>>285 time_tはlongとは限らないので、差の値をintでキャストして"%d"で受ける方がいい。
>>286 time_tは必ず秒単位。
291 :
デフォルトの名無しさん :2011/04/06(水) 16:35:11.88
先輩方のアドバイスを下に修正してみました。 #include <stdio.h> #include <time.h> #include <windows.h> int main(void) { time_t end_time; int m = 180; // カウントダウンの時間(秒数) int c; // エンターキーを押すまで待機する printf("エンターキーを押すとタイマーが起動します"); c=getchar(); end_time = time(NULL) + m; while( time(NULL) < end_time ) { printf( "%d\n", end_time - time(NULL)); Sleep(1000); } printf("\a時間です!!\n"); return 0; }
>>290 また、初心者をだまして、何が楽しいんだ?
time_tは数値型であることが保証されてるだけで、精度と単位は処理系依存
伝統的にUNIX Epochが使われることが多いだけ
293 :
デフォルトの名無しさん :2011/04/06(水) 17:36:04.83
コンソールアプリケーションでもドラッグアンドドロップのソフトは 作れますか?
windows の dos窓での話 ファイルを D&D でdos窓へもってった場合、そのファイルのフルパス名が文字列として渡されるから… それなりには作れるんじゃね? ※ プロンプト上では↑の動作だが、実行ファイル実行中の標準入力にも適応されてるのかは未確認
アイコンに対してのドロップなら普通に引数として渡される。
入力値が偶数か奇数かを判断する練習問題が全くわからない・・・ 本を読みながらやってるんだがorz
>>296 入力方法が分からないの?
それとも、判定方法が分からないの?
>>297 説明不足ですまない
判定方法がわからない;;
2で割り切れるかどうか 余りを見るとよい
300 :
デフォルトの名無しさん :2011/04/06(水) 19:19:13.16
ジャンケンとヒットアンドブローとラーメンタイマーは先輩方のお知恵を拝借して作る事ができました。 8年前に挫折して、6年前に初心者本を買ってみるも挫折して、2年前に初心者講座サイトを見て挫折して・・今回は初めてプログラミングが面白いと思えました。 他にも初心者向けのお題ってありませんか? もしくはそういうネタを集めたサイトはありませんか?
>>300 ヒットアンドブローの正解に使われる数値の条件
1〜9 で 0 は使用しない
同じ数字は2回以上使用されることはない
>>285 メッセージ表示するだけじゃタイマーにならん
最後のメッセージを
printf("時間です!!\a\a\a");
に変更するよろし
303 :
デフォルトの名無しさん :2011/04/06(水) 19:47:38.80
お前ら何でこんなに優しいのwww
>>300 ではジャンケンとヒットアンドブローの戦歴をファイルに保存するように改良してみれ
ゲームでいうセーブファイルを作るのだ
305 :
デフォルトの名無しさん :2011/04/06(水) 19:55:48.93
連射メーターでも作ってみては?
あれだろ。数当てゲームだろ。 >数値を入力してください: 64 >正解はもっと小さい数です。 >数値を入力してください: みたいな
何故俺が文字列を扱うと毎回文字化けするんだ・・・orz
あ
セブンイレブンで山頭火のカップ麺買ってきたんだけど、想定外の事態が発生いたしました。 なんと、待ち時間4分なのだが・・・どうすんだよこれ・・・バリ堅で食えと? あ?
ポインタの指す文字を確かめるプログラム #include<stdio.h> #include<string.h> main(int ac,char **av) { --ac; ++av; printf("*av=%s\n",*av); printf("**av=%c\n\n",**av); ++*av; printf("++*av=%s\n",*av); printf("**av=%c\n\n",**av); ++**av; printf("++**av=%c\n",**av); printf("*av=%s\n",*av); } ******************実行結果***************************** $ ./a 1234567 *av=1234567 **av=1 ++*av=234567 **av=2 ++**av=3 *av=334567 下から2番目がわかりません 予想では*av anser=34567なんですが・・・ 解説おねがいします
++*av;と++**av;の違い
>>291 >printf( "%d\n", end_time - time(NULL));
printf("%d\n", (int) difftime(end_time, time(NULL)));
これでtime_tがlong longだろうがdoubleだろうが、秒単位でさえなくても大丈夫。
314 :
ミカミ :2011/04/06(水) 23:26:07.75
■ハッカー急募■ あなたの知識お金にしてみませんか? 内容によっては100以上十分可能です。ご連絡お待ちしております。 請けでのお仕事です。通勤等はありません。 匿名可能。お仕事は沢山あります。 ひやかしはご遠慮ください。 mikami100023あっとyahoo.co.jp
>>313 何が大丈夫なの?
駄目に決まってんじゃん
>>310 圧力鍋に入れて2気圧位にすれば3分でいけんじゃね?
++*av;は'1'を指していたポインタを'2'を指すようにする ++**av;は*avが指している'2'に+1して'3'にする
while(〜〜〜){ if(クリックしたとき) swich = 1; 〜〜〜〜〜〜〜 ☆if(swich = 1) //クリックしたときしてほしい処理 〜〜〜〜〜〜〜 if(swich = 1) swich = 0; } こんなプログラムでやっていると、クリックしてなくても☆の部分が暴発します こういう書き方が悪いのでしょうか?それともここにない他が原因と思われるでしょうか?
321 :
デフォルトの名無しさん :2011/04/06(水) 23:42:10.75
324 :
デフォルトの名無しさん :2011/04/06(水) 23:47:13.18
>>304 ネタありがとうございます。
ジャンケンのほうで挑戦してみます
>>322 >313のどこにend_timeに関する問題が?
って、なんだ。要は>313の触れていないend_timeの計算の仕方にケチつけているのか。
>291で言えば、end_time = time(NULL) + m;の代わりに
localtime_r()でstruct tmにばらしてtm_secにmを足してからmktime()でtime_tに戻せばOKだな。
>>322 なるほどわかりました
if文の条件は=はダメってことですかね?
327 :
326 :2011/04/06(水) 23:52:06.97
>>325 ケチじゃねーよ
>>313 で「秒単位でさえなくても大丈夫」って謳ってるんだから
end_timeも直してなきゃ、駄目に決まってんじゃん
329 :
325 :2011/04/06(水) 23:56:48.10
おっと、localtime_r()はPOSIX拡張か。localtime()でやるべきか。
>>328 だから、>313はそこには触れてないだろ。って、私が言っても仕方ないんだけどw
>>323 完全に解決できましたありがとうございます
332 :
デフォルトの名無しさん :2011/04/07(木) 11:38:51.75
今から学ぶとしたら C++0X と C1X のどちらがオススメですか?
C++0x
どっちも趣味言語以上のものにはなりそうにないけど
何故?
アホな質問で悪いけどスレタイの”俺”って誰? 俺って言う人いないんだけど どうすれば質問できるの?
俺、俺、俺だよ俺
俺って言う人いないのに、質問してるじゃないか
デフォルトの名無しさんに決まってるだろ!
Perl好き:C++0X Python好き:C1X
C言言吾ナょらイ奄Iニ聞レナ
343 :
デフォルトの名無しさん :2011/04/07(木) 14:35:14.40
Ruby好き:Objective-C
struct list *head; 〜〜〜〜 method_A(head); int method_A (struct list* a){ } この時3行目はアドレス渡しですか?値渡しですか?
>>344 値渡し(call of value) であり、渡す値はアドレスです。これをアドレス渡しと仮にいうのであれば、
>>344 は値渡しかつアドレス渡しになります。
値渡しの対義語は参照渡し(call of reference)ですが、C には厳密には参照渡しはありません。pascal や C++ にはありますが。
a = [ 3, 0, 0, 2, 0, 1, 4, 0 ] このa中の0をすべて左によせて a = [ 3, 2, 1, 4, 0, 0, 0, 0 ] ってしたいんですが、右が0ばかりになったことを確認するにはどうすればよいでしょうか? t = 7; for( i = 0; i <= t; i++ ){ if( a[ i ] == 0 ){ for( j = 0; j <= t - i - 1; j++ ){ a[ i + j ] = a[ i + j + 1 ]; } a[ t ] = 0; i -= 1; } } ここまで考えました。
2行目の文章は このa中の0をすべて右によせて でした
自己解決しました
for(i = j = 0; i <= t; i++) if(a[i] != 0) a[j++] = a[i]; for(i = j; i <= t; i++) a[i] = 0;
>>349 そんなに短くなるのれすか…
a[j++] = a[i]; ←これの意味を教えて下しい…
あ、なるほど理解しました… ちょっと感動しました…
>>353 そうなんですか納得
28行目のエラーはどうしてですかね
>>352 char s[11];
↓
char *s;
s[i]=m[i];
s=&(s[0]);
↓
s = m;
_wfopenが使用可能かチェックする方法はありますか? なければfopenに切り替えたいのですが。
358 :
357 :2011/04/08(金) 08:01:45.11
_wfopenが使用不可なら、 コンパイルの時fopen(とchar、string)へ切り替えたいのですが。 手間のかからない方法はどうやればいいですか。
そも、_wfopen()とfopen()は完全に等価ではないんだからそれだけ切り替えても意味がないのでは?
scanfの入力制限を、"%79s"といったリテラル数字を直接書くのでなく、BUF_SIZEを使って BUF_SIZE - 1にしたいのですが、どのようにすればいいのでしょうか? #define BUF_SIZE 80 char str[BUF_SIZE]; scanf("%79s", str);
現実的でない一案。 #define BUF_SIZE (80) char str[BUF_SIZE]; char format[20]; sprintf(format, "%ds", BUF_SIZE - 1); scanf(format, str); そも、scanf()を生のまま使うのは止めよう。
363 :
デフォルトの名無しさん :2011/04/08(金) 10:21:47.42
> #define BUF_SIZE (80) その昔、「なぜ0を足しているんだろう」とか 「偽にしかならなさそうな式をなぜか if で見ている」といった 謎のコードが流行っていたが今やる奴っていかにも温室だな
#define LEN 79 #define FMT(len) "%##len##s" char buf[LEN+1]; scanf(FMT(LEN), buf); みたいな?
main () { Ni shi shui? }
byte str = new byte[100];
byte[] str = new byte[100];
newって何ですか(このスレ的に
class とんきん : ジャップ { } class おおさか : ジャップ { }
C言語は永久に不滅です
PHPでこう書くコードをCではどうやって書いたらよいですか? class Test { public function a(){ return 'a'; } private function b(){ return 'b'; } public function(){ $this->b(); } }
コレクションって最強だね ファイル使わなくてもこれで一通りの事ができる
373 :
デフォルトの名無しさん :2011/04/08(金) 15:23:41.63
専ブラのMonoViewのようにコマンドラインで選択メニューみたいなのを作りたいのですが どのようなキーワードで検索したらようのでしょうか?
良く分からないんだけど エスケープシーケンスコードって事?
CUIのメニューは俺も20年以上前には良く作ってたが基本的に自力で作るものだと思ってる ガンバレ
えええええ
Д
379 :
デフォルトの名無しさん :2011/04/08(金) 20:23:17.92
プロジェクトファイルを読み込めませんでした。指定されたエンコードに無効な文字があります。 と、表示されて先に進めません。文章は別のパソコンならビルト出来るのでソフトの設定自体に何かあると思うのですが、どうしたら解決できるでしょうか。 あと、スタートメニューからvisualstdioをドラッグ&ドロップしたらvisual studioのマーク(無限マーク)が表示されなくなってしまいました。どうしたら直るでしょうか? 本当に困っているので宜しくお願いします。
>>381 ありがとうございます!!!!!!!!
でもVC++ 2010 Expressにはcurses.hが入っていませんでしたorz
せっかく教えていただいたのに申し訳ございません
>>382 SetConsole〜
GetConsole〜
>>385 sの先を確保してない
ってかNULLのまま
>>385 //strcpy(s,m);
s = m;
>>385 >char *s;
>s=NULL;
>strcpy(s,m);
端的にいって、NULL にコピーできません。
このコードをみて、文字列型のある言語を触られたことがあるのかなと感じましたが、
s = NULL
で文字列を空に設定する、ということにはならないのです。
そもそも C には文字列型はありません。
389 :
デフォルトの名無しさん :2011/04/09(土) 02:40:11.37
mallocやcalloc全く使わないと処理が遅くなったりするでしょうか?
>>389 malloc を使わないってどういう事?
全部スタックにアロケートするという事?
それとも、mmap や sbrk を使うという事?
何で malloc を使わないの?
メモリリークが怖いの?
元々どういう処理で malloc を使っていたの?
みたいな疑問が湧いてくるから、3行以上で状況を説明しておくんなまし。
質問者じゃないけどメモリリークは怖いです
392 :
デフォルトの名無しさん :2011/04/09(土) 11:00:15.19
>>392 大体あってる
1bit目と1bit目、2bit目と2bit目って
bitごとに処理されるの
>>392 まず、何ビットで考えるかはっきりと明示するとわかりやすいと思います。
論理積 ∧ について、1ビットで考えると、
0∧0 = 0∧1 = 1∧0 = 0,
1∧1 = 1
型 char は 8 ビットであると仮定して、8 ビットで考えると、
1 & 1は二進数8ビットで 00000001 & 00000001 = 00000001 = 1
0 & 10 は二進数8 ビットで 00000000 & 00001010 = 00000000 = 0
10 & 10 は二進数8ビットで 00001010 & 00001010 = 00001010 = 10
14 & 7 は二進数8ビットで 00001110 & 00000111 = 00000110 = 6
>391 1 & 1は 1だぞ。 >395 ワザワザ誤解しやすい'∧'なんて記号使わないでくれよ。 排他的論理和'^'と思って混乱したじゃないか。
おじちゃんNEETなの?
>>392 & は 『両方1なら1。 それ以外は全部0』
1 & 1 は両方1だから1
0 & 1 は両方1じゃないから0
0 & 0 は両方1じゃないから0
例:
1100 & 1010 の場合
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
401 :
400 :2011/04/09(土) 15:13:51.96
備考:
もしも 1100 を10進数として読むなら、千百
1 : 千の位が1
1 : 百の位が1
0 : 十の位が0
0 : 一の位が0
1000 + 100 = 千百
もしも 1100 を2進数として読むなら、12
1 : 8の位が1
1 : 4の位が1
0 : 2の位が0
0 : 1の位が0
8 + 4 = 12
>>400 の例は2進数です
402 :
デフォルトの名無しさん :2011/04/09(土) 15:40:04.79
int型は65536までだっけ?までは全部要領4バイトなんですか? charだとPPPPPは5バイト? 後int型で3×3の時間量と、123×123の時間量は一緒ですか?
>>402 >int型は65536までだっけ?までは全部要領4バイトなんですか?
int型のサイズは環境依存。今は大抵は4バイト。その場合の表現できる値の範囲は、-(2の31乗)から(2の31乗-1)。
必要なら、sizeof(int)でサイズは得られる。
>charだとPPPPPは5バイト?
意味不明。sizeof(char)は常に1。文字列を表したいなら、配列を用意するなどする必要がある。
>後int型で3×3の時間量と、123×123の時間量は一緒ですか?
通常、全く一緒。
取り扱える最大値は INT_MAX 容量は sizeof(int) 文字列 "PPPPP" だと終端の \0 まで欲しいので 6 文字の塊(だだし、文字列ではなく終端無し) PPPPP なら 5 コンパイラによる (が、整数リテラルの掛け算は同じになるだろう と予測される)
>>404 >コンパイラによる (が、整数リテラルの掛け算は同じになるだろう と予測される)
コンパイラに依存するよりも、CPUに依存する。
例えば、9のロードと15129のロード時間が異なるCPUは想定できるが、それが異なるコンパイラの実装は考えにくい。
406 :
デフォルトの名無しさん :2011/04/09(土) 17:51:20.50
402 は実行時間とは言っていない
便乗だけど たとえば intを4バイトとすると int a = 'PPPP'; とかってOKなの?
エラーになるじゃね
>>407 コードとしては問題ないな。
asciiの環境なら0x50505050が代入される。
問題は、a = 'abcd'としたときに0x61626364か0x64636261かは環境依存だと言うことだ。
ここで、規格ではと、騒ぐ人が出てきそうだけど
使い道がない == 意味がない
全角で、 WCHAR ch ='あ'; とかしてるコードは見たことある。
警告: 複数文字からなる文字定数
test.c内部でしか使わない関数とtest.c内部に定義してて外部に公開したい関数があるとして、 プロトタイプ宣言はどこに書いたらいいんですか 内部でしか使わないやつはtest.c内に static void fuck(void);とかで 外部のやつはtest.hにextern void fuck2(void);と書けば良いんでしょjか
>>415 それでいいけど、おれは関数にextern を書いたことがない。
おおむねその方針でよろしいかと もう少し規模が大きくなって test.c だけじゃ見通し悪いからファイル分割したい test1.c test2.c ... test1.c 〜 test2.c 相互利用したいけど内部関数がが test_local.h 外部公開したい関数 test.h こういうことをやっちゃう
わかりました テーブルの定義とか#defineとかもその方針で良いんですねありがとうごじあsみあ
もう一つ。 test.hにextern void fuck1(void); から extern void fuck10(void);まで 10個のプロトタイプ宣言があるとして、 外部からvoid fuck5(void);のみを使いたい場合にどうするのがいいんでしょうか #include "test.h"とすることで何か無駄が生じないのでしょうか 単に外部の.cの先頭にextern void fuck5(void);とだけ書くほうがいいんでしょうか
外部で使う関数は、test.hに extern ... の他に、
test.h内でstatic inlineとして関数を書いて、ソースに直接埋め込んでしまう方法が使われる場合もある。
たとえば
/* include/linux/hid.h */
static inline int __must_check hid_register_driver(struct hid_driver *driver)
{
return __hid_register_driver(driver, THIS_MODULE, KBUILD_MODNAME);
}
ただし、
リーナストーバルズ曰く「(内容が)4行以上の関数はinlineにする候補としては考えないほうがいい」
http://linuxjf.sourceforge.jp/JFdocs/kernel-docs-2.6/CodingStyle.html
fuck5()を使う都度プロトタイピングするのは間が抜け過ぎているから、test.hをインクルードすればいいと思うよ。 もし、fuck5()だけを利用するソースが多いなら、test.hの分割を検討すべきときだ。
>>419 ヘッダーファイルに10個全部プロトタイプ書いて、一個しか使わなくても
それをインクルードすればいい。
別にムダじゃない。
関数宣言だけならオブジェクトファイルに影響は無いから #include でおk コンパイル時間がやたら長くなるならそのときに考えればいい
stdio.h を include するか 使用する標準関数のプロトタイプを個別タイプするか
了解しました。#includeする方向で生きていこうと思います。ありがとうございました。
426 :
ポインタ初学者 :2011/04/09(土) 22:32:32.90
short(2バイト)型の変数を,上位1バイトと下位1バイトに分割し char型の配列に代入したいのですが,どのようにすればいいのでしょうか? ご教授よろしくお願いします.
教授する気はないのでサンプルを提示。 short si = SomeValue; char array[] = {(si >> 8) & 0xff, si & 0xff};
共用体を使う
補足、shortなどsignを含む変数を>>シフト演算子で処理すると、算術シフトが用いられ最上位bitを引きずります。
算術シフトの例)0x8001
>>1 →0xc000
この技をあえて使う事もあります。
unsignedの場合は論理シフトが用いられ最上位ビットにはゼロが補われます。
論理シフトの例)0x8001
>>1 →0x4000
よってシフト前にマスクするよりもシフト後にマスクした方がより安全なコードとなり得ます。
エンディアンが固定で分かっていれば、short型変数のアドレスをchar*でアクセスした方が実行速度は速いかもしれません。
>>430 unsignedをシフトしたときの符号の扱いって環境依存じゃなかった?
char x[]のとき scanf("%s",&x[]) &はいらないんですか?
そんな馬鹿な
434 :
デフォルトの名無しさん :2011/04/09(土) 23:52:26.03
サンプルを借用-リトルエンディアンの場合
short s = SomeValue;
char* p = &s;
char array[] = {*(p+1), *p};
>>431 unsignedの場合、論理シフトでsigned charだけが環境依存かと。
なぜならコンパイルオプションでsigned char to unsigned charって必ずあるでしょ?
後まぁ、基本、慣習と言うか通例で答えてやりゃ良いでしょ。
質問者もおれらのレスをそれほど信じてないし。
環境依存で答え無しってのも味気ないしね。
435 :
デフォルトの名無しさん :2011/04/10(日) 00:04:31.14
>>432 配列名=配列のアドレス x=&x[0] です。
言語仕様的には「代入出来ない左辺値」
よって&要らない。と言うかエラーになりませんか?配列名には領域無いと。
436 :
デフォルトの名無しさん :2011/04/10(日) 00:07:24.64
>>433 ない実物例を見たから質問したわけであって。
本当にプログラミングはストレスが溜まりますね。
437 :
ポインタ初学者 :2011/04/10(日) 00:07:57.35
みなさんありがとうございます. 最初の方のサンプルコードで解決できました. 続く方々の説明はまだ完全に自分のものに出来てませんので,熟考してみます.
438 :
ビル・ジョブス :2011/04/10(日) 00:26:50.42
私は433では無いが、続く回答は私だ。 C言語は13歳からもう30年経験し、この1スレの1である。 C言語習得の近道は疑問のある処理のアセンブラ出力を見るに限るよ。 疑問が湧いたら、とにかくソースから切り出しアセンブラ出力で確認しよう。 コンパイラによっては>>演算子もコンパイラ内部サブルーチン呼んでたりしてクソ遅い時がある、そんな時はインラインアセンブラを駆使しなきゃならない。 アセンブラの知識は絶対に無駄にならないよ。 そうは言っても、アセンブラ見ても分からん時は分からんので、とりあえず動くのならまたいつか考えればいい。 その時は一瞬で分かる事もあるし。気楽に気長に継続は力なりけり。かな。
コンパイルしながら動かすほうがいいような。反復練習 エラーが出たら、ダメって感じの人は向いてないかも
マクロ名"EOF"に入っている値を教えてください
End Of Fantasy
443 :
デフォルトの名無しさん :2011/04/10(日) 01:15:26.95
昔は神経質な俺はパソコン向いてると思ったが、逆に神経質な性格だと プログラミング向いてない事に気づいた。
>>438 ある意味では正論ではあるが、それはアセンブラ→C言語経験ならまだしもC言語→アセンブラ経験は
大抵の人にとってハードルがかなり高いと思われ、かつC言語を使う大抵の人にとってアセンブラが
必要とされる機会はかなり低いと思われ。ちなみに私はアセンブラ→C言語経験ですけども。
プログラムをVC++からリリースして公開してるんですが 逆コンパイルなどされてプログラムを見られることはありますか?
NULLとEOFの使い分けってどうなんですか 自分はNULLはポインターでEOFはint型というように 代入や比較のときつかいわけてます
使い分けもなにも、NULLとEOFを混同する要素がない。
448 :
デフォルトの名無しさん :2011/04/10(日) 02:17:06.42
↓のプログラムがどういう風にループしてるのか教えてください -- C言語により記述された次の関数fがある。ここで、display()は画面に1個の文字Aを書く手続きであるとする。 int f(int x){ display(); if(x==0)return 1; if(x==1)return 3; if(x==2)return 5; return(f(x-1)+f(x-2)+f(x-3)); } いま、f(x)を呼び出したとき、値105が返された。このf(x)が呼び出されてから値を返すまでの間に、文字Aは画面にいくつ書かれたか。 -- 直感でf(0)=1,f(1)=3,f(2)=5 f(3)=f(2)+f(1)+f(0)=9 f(4)=f(3)+f(2)+f(1)=17 f(5)=f(4)+f(3)+f(2)=31 f(6)=f(5)+f(4)+f(3)=57 f(7)=f(6)+f(5)+f(4)=105 だからx=7がミソだとは思うんですけど、それ以前に呼び出されたとか値が返されたもイマイチピンときません
そもそも関数呼び出しとか戻り値とか自体を理解してないっていう話?
はい!
ちなみに答えは46です
int f(int x){ printf("%d\n",x); if(x==0)return 1; if(x==1)return 3; if(x==2)return 5; return(f(x-1)+f(x-2)+f(x-3)); } で、やってみな
>>452 そもそもscanfがないからプログラムとして成り立ちますか?
HelloWorld に scanf があったか?
書けるのに目が悪いのかいな?
456 :
デフォルトの名無しさん :2011/04/10(日) 11:33:37.15
457 :
デフォルトの名無しさん :2011/04/10(日) 14:21:24.28
質問です・・ 設定で typedef struct data { char name[20]; int age; struct data *next } DATA; となってる場合は この構造体はDATA型であり、struct data型ってことですよね? つまり typedef struct data { char name[20]; int age; DATA *next } DATA; としても問題ないのでしょうか?
458 :
デフォルトの名無しさん :2011/04/10(日) 14:38:03.60
あ、問題ありますね・・・ DATA型にtypedefするのは、構造体を設定後なんですね・・ たぶんそうでしょう・・
459 :
457=458 :2011/04/10(日) 14:40:04.34
解決しました・・おそらく・・自信全くないけど。
includeとリンクは別問題だ
昔の環境は貧弱だったので、すべての設定を読み込むと時間がかかってたので個別に読み込んでた あと、依存関係を明確にするためファイルに別けてたってのもある
>>460 Cはプロトタイプなくてもエラーにならないんで、ヘッダーファイルを
インクルードしなくてもコンパイル->リンクまで平気でいく。
464 :
デフォルトの名無しさん :2011/04/10(日) 21:57:59.89
char *a; aは文字列へのポインタ char *b; bも文字列へのポインタ とします。 bの指す文字列をaの指す文字列に代入したいときどうすればいいですか? strcpyを使う場合と、何も関数を使わない場合それぞれで教えてください。
>>464 「文字列に代入」の意味が判らん。
bの指す領域にaの指す領域に格納されているナル終端文字列をコピーすると言う意味でいいのなら、
strcpy(b, a)でいい。勿論、bの指す領域がその文字列を格納するに充分であること。
何も関数を使わない場合と言うのはナンセンスなので割愛。
466 :
デフォルトの名無しさん :2011/04/10(日) 22:15:39.15
CUIでプログラムを作ってます 指定した座標にツールチップを表示させたいのですが どのようなキーワードで検索したらよいのでしょうか? C言語 ツールチップでは参考になるものがみつかりませんでした どなたかご教示お願いいたします
>>466 cuiにはツールチップと言う汎用的な概念がありません。頑張って自力で実装しましょう。
>>466 指定した座標に任意の文字を書き込みたいということでいいのかな?
linux と MS windows で手順が違うから環境書きな
コンソールアプリの問題は全てcursesで解決できる
CUIでプログラム作ってます の意が CUIな開発環境Iだけど、実行環境はGUIです ってオチじゃないだろうな?
error: invalid type argument of `->' とでてきましたが、何が不備だったのでしょう・・・ ->が使えない処理環境なのでしょうか?
>>472 . ピリオドにするとうまくいくかもしれないw
474 :
デフォルトの名無しさん :2011/04/10(日) 23:00:04.84
>>469 失礼いたしました。環境はWindowsになります
例えば
#include<windows.h>
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {
MessageBox(NULL , TEXT("Hello world") ,
TEXT("メッセージボックス") , MB_OK);
return 0;
}
のようにCUIでコードを書いて、実行したらメッセージボックス(今回はツールチップを表示したい)を表示するような事をやりたいのです。
error: invalid type argument of `->' ->はポインタの指す要素なので.とは違うと思うんです。 何故このようなエラーが出たのでしょうか?
>>474 コンソールアプリじゃないの?
AllocConsole してるの?
>>471 の通りで単にコマンドラインからコンパイルしてるだけって意味なの?
メンバがポインタだったら -> を使うのではなく 構造体がポインタだった -> を使う struct { char* a; } foo; struct foo *p; struct foo q; p->a; q.a; こういうこっちゃ
479 :
デフォルトの名無しさん :2011/04/10(日) 23:08:57.98
>>478 すいません・・
構造体の名前を仮にxとして
x->としてました・・
xのメンバーにポインタがあり、それがaなので
a->としなければいけないのでした><
>480 ? xが構造体の実体なら x.a xがポインタなら x->a xのメンバにaがある時にx無しでa->なんてしてるとエラーになるけど。 構造体が入れ子になっていて、xのメンバaが構造体を指すポインタなら x.a->p とする必要がある。
482 :
478 :2011/04/10(日) 23:19:18.55
いろいろミス 以下修正 ×構造体がポインタだった -> を使う ×struct { char* a; } foo; ○構造体がポインタだったら -> を使う ○struct foo { char* a; };
>>481 構造体を指すポインタがaであるので
a->pとしても問題ないのですた。
>>482 structは構造体なのに中の要素が一個だけって構造体の意味あるんでしょうか
?
487 :
デフォルトの名無しさん :2011/04/11(月) 00:14:35.08
char *strcpy(char *s1, const char *s2)ってなってるけど これは認識される形式は上記ってことで、表記の場合は *strcpy(?,?);でいいんですよね? 具体的に文字列に与えられた形式が違う場合どう?,?に入れたら良いか分かりません ので例を示しますので教えてください。 例1 char p[10]の文字列をchar s[10]に入れる場合。 例2 char *p の文字列を char *sに入れる場合。 例3 関数の引数 xx(int a, char p[])のp[]の文字列を char*sに入れる場合。 ↑ 書き方自信無し・・ 例4 関数の引数 xx(int a, char *p)のpの文字列を char*sに入れる場合。 全部 *strcpy(p,s);ですか?
>>487 strcpy(p,s);
strcpy の頭に * は(普通は)いらない。念のため。
>>487 どれも、strcpy(s, p)だ。但し、>465も読んでおけ。
493 :
デフォルトの名無しさん :2011/04/11(月) 09:26:27.20
>>486 WinAPIで出来るのですね
該当スレで聞いてみます
ありがとうございます
すみません。一部分だけのコードでwchar_tを使いたいのですが。 #undefで解除は出来ないですか。一度決まるとTCHAR型は変化しませんか? #define UNICODE #define _UNICODE 〜 #undef UNICODE #undef _UNICODE
>>494 です。
linuxとwindows共用コードを作りたいのですが、
ファイル・ディレクトリ操作で、linuxはwchar_tは定義されておらずwindowsではwchar_tでアクセスしないと不具合が出ます。
しかし、UNICODEを切り替えるのは上手くいきそうに無いので、使用関数を独自でラップすることにしました。
自己解決しました。
496 :
デフォルトの名無しさん :2011/04/11(月) 15:42:37.52
C言語でファイルの拡張子を調べたいのですがどのようにすればいいでしょうか? たとえば拡張子が .bin だったら .out に変更するなどの条件分岐に使いたい です。どなたか解る方がいましたらよろしくお願いします。
ファイル名文字列 を 末尾からおっかけて最初に見つかる . の位置を得て その次の位置の文字列比較で分岐 <エラーチェックは省く> char * p = strrchr(filename, '.'); if (!strcmp(p+1, "ini")) { /* .ini っぽい */ } else if (!strcmp(p+1, "bin")) { /* .bin っぽい */ } こんな感じ
498 :
デフォルトの名無しさん :2011/04/11(月) 16:34:45.83
.のないファイルも扱いたいのですが、今までこうやってました。 int strrep(char *buf, char *mae, char *ato) { char *mituke; size_t maelen, atolen; maelen = strlen(mae); atolen = strlen(ato); if (maelen == 0 || (mituke = strstr(buf, mae)) == NULL) return 0; memmove(mituke + atolen, mituke + maelen, strlen(buf) - (mituke + maelen - buf ) + 1); memcpy(mituke, ato, atolen); return 1; } if(!strrep(fin,".grs","")){ sprintf(fout,"%s.out",fin); fp=fopen(fout,"wb"); K=0; } sprintf(fout,"%s.grs",fin); fp=fopen(fout,"wb"); こうするとファイルポインタからデータが読めなくて終了してしまいます。 どうしたらいいでしょうか?よろしくお願いします。
499 :
デフォルトの名無しさん :2011/04/11(月) 17:18:09.01
ほらさっさと答えないから地震が!
書き込みで開いて読めないって意味がわからないんだが
書き込み通りのコードなら strrep(fin,".grs","") の結果が 0 の場合 ファイル2回開いて さらに fp は 後に開いたほうを指してるんだが... else ブロックにしてないのは意図的なの?
502 :
デフォルトの名無しさん :2011/04/11(月) 18:07:44.43
自己解決しました。ありがとうございました。
503 :
デフォルトの名無しさん :2011/04/11(月) 21:22:20.13
UNIXでディレクトリの更新を見張る方法を教えて下さい ソケットのSIGIOみたいに、シグナルで通知されるとスマートなのですが Linuxで、F_NOTIFY使わないと駄目なんでしょうか? 環境がOpenBSDなので、標準的なやり方を知りたいです キーワードとなる関数名だけでも構いません 宜しくお願いします
kevent
505 :
デフォルトの名無しさん :2011/04/11(月) 22:35:23.32
>>505 コンパイラの種類やコンパイルオプションによって
自動でワイルドカードの展開をしたりしなかったりするので
貰ってきたもの(argv)の中身を確認するべし
>>505 エスパーじゃないんだから、それだけじゃ分からない。
ソースを晒せば、誰かが答えてくれる。
508 :
デフォルトの名無しさん :2011/04/11(月) 22:47:50.74
void main(int argc,char *argv[] ){ struct _finddata_t c_file; long hFile; // カレント ディレクトリ内の最初のファイルを探します。 if( (hFile = _findfirst( argv[1], &c_file )) == -1L ) printf( "カレント ディレクトリにはファイルは存在しません。\n" ); else{ printf( "ファイルのリスト\n\n" ); printf( "RDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' ); printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' ); printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " ); printf( " %-12s %.24s %9ld\n", c_file.name, ctime( &( c_file.time_write ) ), c_file.size ); // 残りのファイルを探します while( _findnext( hFile, &c_file ) == 0 ){ printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " ); printf( " %-12s %.24s %9ld\n", c_file.name, ctime( &( c_file.time_write ) ), c_file.size ); } _findclose( hFile ); } }
>>508 普通に動いたよ
WinXP,vs2010,vs2008
510 :
デフォルトの名無しさん :2011/04/11(月) 23:00:49.75
GCCじゃできないのにVC++だと出来ました。 この違いは乗り越えられますか?
>>510 Windows 上の cygwin を使っているのなら、gcc-3 かつ -mno-cygwin でなんとかコンパイルできるはず。
linux とかだったら、そもそも findfirst/findnext がないからコンパイルすらできない。
512 :
デフォルトの名無しさん :2011/04/11(月) 23:11:48.27
MinGW使っています。
>>504 ピンポイントのキーワードをありがとうございました
514 :
デフォルトの名無しさん :2011/04/11(月) 23:24:24.73
FIFOを配列を使って実現したいのですが、以下をもっと簡単にできないのでしょうか? unsigned char box[10]; box[0] =1, box[1] =2,box[2] =3, box[3] =4,box[4] =5, box[5] =6, box[6] =7, box[7] =8, box[8] = 9, box[10] =10; この状態で次のキューがたまると FIFOを配列を使って実現したいのですが、以下をもっと簡単にできないのでしょうか? unsigned char box[10]; box[0] =2,box[1] =3, box[2] =4,box[3] =5, box[4] =6, box[5] =7, box[6] =8, box[7] = 9, box[8] =10; このようなFIFOを実現したいのですが、どうしたらよいのでしょうか?
中身をずらす代わりに、現在の位置を覚えておく方法もある
windows版dirent.h作ったよ。いるか?
518 :
デフォルトの名無しさん :2011/04/11(月) 23:32:32.20
>>515 どちらのほうがシンプルにできますか?
極力、関数は使わずにしたいのです。
>>517 すみません、サンプルコード書いてください!
検索しても難しい上に長いのしかでてこないのです。
実際に両方やってみれば結果どちらがシンプルだったかわかるんじゃない
dequeでもつかえよ C言語の宿題なら宿題スレへいけよ
初心者は技巧に走るな。まずは動くこと。動いてからボトルネックに力を入れるべき。
7章:STL
queue キュー
先入れ先出し(FIFO)のキューです
コンテナの終端にデータを追加し、コンテナの先端からデータを取得するのに適したコンテナですqueue
deque 両端キュー
コンテナの両端からアクセスできるキューです
コンテナの両端へのデータ追加、両端からのデータ取得に適したキューです
http://www5c.biglobe.ne.jp/~ecb/cpp/07_04.html
522 :
デフォルトの名無しさん :2011/04/11(月) 23:51:09.01
char *stock[256]; int count=0; while( _findnext( hFile, &c_file ) == 0 ){ stock[count++]= c_file.name; printf( "%s ", c_file.name); printf( "%s \n", stock[count]); } このようにやって検索結果のリストを作りたいのですがうまく いきません。全て(null)になってしまいます。 なぜでしょうか?どうすればうまくリストに出来ますか? よろしくお願いします。
ここC言語スレだからね
サンプル張ってやるよ
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
void main(){
// queueに追加
for( int i = 0 ; i < 10 ; i++ ) q.push( i );
// queueの中身を表示
while( !q.empty() ){
cout << q.front() << " ";
q.pop();
}
cout << endl << endl;
// 1を追加する
q.push( 1 );
// 代入
q.back() = 2;
// 追加した「1」ではなく、代入した「2」が表示される
cout << q.front() << endl;
}
http://www5c.biglobe.ne.jp/~ecb/cpp/07_09_02.html
525 :
デフォルトの名無しさん :2011/04/11(月) 23:52:12.37
>>521 言い忘れておりもうしわけないですが、
popとかpushとかいった関数は使わずに実現したいのです。
527 :
デフォルトの名無しさん :2011/04/11(月) 23:57:38.97
int find(char fin[80] ){ struct _finddata_t c_file; long hFile; int count=0; char *stock[256]; // カレント ディレクトリ内の最初のファイルを探します。 if( (hFile = _findfirst( fin, &c_file )) == -1 ) printf( "カレント ディレクトリにはファイルは存在しません。\n" ); else{ printf( " %-12s \n", c_file.name ); stock[count]=c_file.name; count++; // 残りのファイルを探します while( _findnext( hFile, &c_file ) == 0 ){ stock[count++]= c_file.name; printf( "%s ", c_file.name); printf( "%s \n", stock[count]); } _findclose( hFile ); } return count-1; } こんな感じで。
こんな感じか #define N 100 int a[N]; int sento=-1; push( int x ) { if(sento==N-1) { sento=0; a[N-1]=x; return; } a[sento]=x; sento++; }
529 :
528 :2011/04/12(火) 00:03:49.81
解説すると、プッシュされたら今の先頭に追加して、先頭を一つずらす。
かってにデータが満杯を仮定していた
>>522 なんかどう突っ込むべきか悩むけど、
> stock[count++]= c_file.name;
ここで stock に代入したあと count は +1 される
> printf( "%s \n", stock[count]);
ここで +1 された新しい count を表示してるけど、そこにはまだ何も代入してないよな?
532 :
デフォルトの名無しさん :2011/04/12(火) 00:46:31.54
ご回答ありがとうございました。これが原因だったのですね。 直しましたが、stockには検索結果は保存されずに、最後のファイル名 だけが列挙して表示されてしまいます。なぜですか?何か解決方法が あったら教えてください。よろしくお願いします。
533 :
デフォルトの名無しさん :2011/04/12(火) 00:47:25.33
因みに、*stock[256]はグローバル変数です。
だってstockはポインタの配列であって、そこに代入してるのはc_file.nameへのポインタだもの 中身をコピーしてるわけじゃない c_file.nameを指してるだけ findnextを呼ぶたびにc_file.nameの中身は書き変わるから
535 :
デフォルトの名無しさん :2011/04/12(火) 00:55:45.96
それを保存するためにはどうすればいいのでしょうか? よろしくお願いします。
stockをポインタの配列ではなく配列の配列にする。
537 :
デフォルトの名無しさん :2011/04/12(火) 01:02:06.43
二次元配列ですか?解りません。 具体的にコードで説明していただけるとありがたいのですが。 申し訳ありませんが、よろしくお願いします。
char * stock[256] ↓ char stock[256][ファイル名を格納するのに充分な長さ];
539 :
デフォルトの名無しさん :2011/04/12(火) 01:11:45.75
二次元配列の1列目と2列目にはそれぞれ何を入れたらよいのでしょうか? 一列目にはcountを、では2列目はname? よろしくお願いします。
540 :
デフォルトの名無しさん :2011/04/12(火) 01:31:53.07
C言語のlineとcircle使って星を描きたいんだけどどうしたら良いかな とりあえず円の中で星を作るってのはわかるんだけど、星の特長とか公式とか覚えてない 誰かおせーておくんなまし
>>539 ポインタを代入する代わりにstrcpy()するだけだよ。
この説明で判らないのなら、先ずは文字列の取り扱いを勉強するところから。
>>540 Cの言語仕様にはlineもcircleもないのでその辺りは自分で使いたいライブラリを勝手に調べてくれ。
どんな星を描きたいのかも判らないけど五芒星や六芒星でいいのなら、
それぞれ円を五等分、六等分する点を計算で求めてそれを一つおきに線分で結べばいいだけ。
円を等分する点を求めるのはそんなに難しくないけど計算式まで書かないとダメ?
543 :
デフォルトの名無しさん :2011/04/12(火) 01:57:47.35
strcpyについて調べました。 なぜ二次元配列が必要なのでしょうか? ポインタのさす文字列をコピーするのに2次元配列が必要なのですか? コピーされた文字列は2次元配列のどこに格納されるのでしょうか? 読み出すときはどうすればいいのでしょう? 解らないことだらけです。よろしくお願いします。
いやだから、素直に文字列の取り扱いを勉強してらっしゃいってば。 文字列を扱うのには配列(或いは明示的に確保された空間)が必要なの。 文字列の配列を扱うには、配列の配列が必要なわけ。数学的な意味の二次元配列じゃないからね。
>>542 ありがとん
よければ式書いてもらいたいです・・・
546 :
デフォルトの名無しさん :2011/04/12(火) 02:08:38.74
誠に申し訳在りませんがコードを書いてもらえないでしょうか? 急いでます。よろしくお願いします。
>>546 自助努力もできないなら諦めたら?
或いは宿題スレに丸投げしたら書いてくれるかもよ。
>>545 #include <stdio.h>
#include <math.h>
static double pi() {return 3.14159265358979;}
static double deg2rad(double x) {return x / 180 * pi();}
static void print5pointedStar(double length)
{
for (int ic = 0; ic <= 5; ++ic) {
double const angle = deg2rad(ic * 144);
printf("%g, %g\n", length * sin(angle), length * cos(angle));
}
}
int main()
{
print5pointedStar(10);
return 0;
}
--
当然、lineなんて知らんから座標を出力するだけ。
この出力をExcelかなにかに放り込んでやればグラフとして五芒星が描かれる筈。
OpenOfficeCalcではペーストして選択してグラフにして散布図にして線のみを選択。
後は適当に応用してね。
# gccで最適化ありにしたら、全部即値でループアンローリングまでしやがったw
549 :
デフォルトの名無しさん :2011/04/12(火) 02:53:27.49
550 :
デフォルトの名無しさん :2011/04/12(火) 10:19:40.34
複数ファイルの処理で困っています。scanfで取り込んだ文字列を、 複数のファイル名に分解して一つずつ処理したいのですが、リストの 作り方がわかりません。どなたかわかる人がいればよろしくお願い します。
>>550 1)落ち着いて。2)山にこもって再度考えてから。3)書き直し。
553 :
デフォルトの名無しさん :2011/04/12(火) 11:20:05.11
scanf("%s",&s); 入力:*.c *rb list[0]=*.c; list[1]=*.rb for(i=0;i<ワイルドカードの数;i++) find(list[i]) という処理がしたいのですが、scanfから取り込んだ文字列を 複数のリストに分けて代入する方法がわかりません。 よろしくお願いします。
>>553 そりゃ大変だ。"*.c", "*.rb"をそれぞれ取り込むだけならちょっとした文字列操作だからそれほど難しくない。
しかし、それをワイルドカードとしてディレクトリを検索するとなるとCの言語使用の範囲内では不可能。
従って、環境と具体的にやりたいことを整理した上でC/C++環境依存スレで聞き直したほうがいい。
>>554 findという関数はもう用意されていて、前半の文字列分割だけを聞きたいのかも
556 :
デフォルトの名無しさん :2011/04/12(火) 12:18:06.82
findは自前の関数で同じディレクトリ内のファイルから特定のファイルを 表示するものです。従って文字列分割の方法がわかればいいのですが、 strtokを使うと分割できると聞いたのでやってみましたが、scanfで 取り込んだ文字列はスペース以降を文字列として除外してしまうらしく うまくいきません。どのようにすればscanfを使って、またそれ以外の 方法でもいいのですが出来るでしょうか?ただしmain関数の引数として の記述は不可です。よろしくお願いします。
もう一度scanfを使えば次の文字列を取得できる scanfは自動的に空白で文字列を分割する
>>556 scanfじゃないとだめ?
getsの方がスペースも取り込めて楽じゃない?
>>556 自作したなら、アルゴリズム見直した方がいい。
それだと拡張子100個なら100回探査するぞ。
>>558 gets()なんて使っちゃダメ。
>>556 fgets()で1行丸々取り込むのが何かと便利。
その後はstrtok()でばらしてもいいし、sscanf()でばらしてもいい。
つーか、空白区切りだとすると空白を含むファイルパターンは使えなくなるけどいいの?
それと、どうしてもscanf()を使いたいなら%sの代わりに%[^\n]として改行以外全部取り込む方法もあることはある。
561 :
デフォルトの名無しさん :2011/04/12(火) 12:27:28.25
getsで出来ました。ありがとうございました。
>>561 ながーいファイルパターンを入力してご覧。
fgetsでは一行取り込める保証がないからgetlineのほうがいいよ。 自分の環境になかったら自作しても良い。fgetsあれば自作できる。
>>563 もしかして、C++スレとお間違いでは?
いやいや、GNUのgetlineのことだよ。 #define _GNU_SOURCE すればstdio.hから取り込めるやつ。
なるほど。しかし、GNUだけがCじゃないのでやはり入門者にお勧めすべきでないと思いますが。
そうだね。すまんかった。
568 :
デフォルトの名無しさん :2011/04/12(火) 14:20:56.97
空白区切りのファイルパターンの場合はどうすればいいのでしょうか?
1文字づつ切り出してパースしちゃうことあるな… "ではさまれた区画の区切り文字は 区切りとして作用させない って例外の為だけに
>>568 要求仕様を検討し扱う必要がなければ、詳細仕様で扱わないとすれば宜しい。
どうしても扱いたい場合は要求仕様と矛盾しないように詳細仕様でフォーマットを決定する必要がある。
プログラミングの時間は、しばしばこうした仕様の検討に費やされていくものだ。
571 :
デフォルトの名無しさん :2011/04/12(火) 14:57:33.87
find関数ですがこれでは効率悪いですか?気になります。 int find(moji name2[256],int sum2){ struct _finddata_t c_file; long hFile; int count=0,i,j; for(j=0;j<sum2;j++){ // カレント ディレクトリ内の最初のファイルを探します。 if( (hFile = _findfirst( name2[j].m, &c_file )) == -1 ){ printf( "カレント ディレクトリにはファイルは存在しません。 %s\n" ,name[j].m); system("pause"); } else{ printf( " %-12s \n", c_file.name ); strcpy(name[count].m,c_file.name); count++; // 残りのファイルを探します while( _findnext( hFile, &c_file ) == 0 ){ strcpy(name[count].m,c_file.name); count++; printf( "%s ", c_file.name); printf( "%s \n", name[count-1].m); } _findclose( hFile ); } } for(i=0;i<count;i++) printf( "%s \n", name[i].m); return count; }
572 :
552 :2011/04/12(火) 15:23:19.93
-------- ------- ------ strtok で文字列を区切る話は、ここまでで締め切りとします。
>>571 環境も提示せずに断片だけ見せられてもなんとも言えない。
動いているならいいんじゃない?
574 :
デフォルトの名無しさん :2011/04/12(火) 17:10:45.03
D:ドライブなどカレントディレクトリ以外のファイルを操作したい 場合はどのようにすればいいのでしょう? パスを入れてもファイル名以外は引き継がないらしいです。 また見つかっても処理したファイルはカレントディレクトリの 中で大きさが0の殻のファイルしか出来ません。 ほかのディレクトリのファイルをそのファイルのある場所に処理した ファイルを置くには何をどうすればいいのでしょうか? わかる人よろしくお願いします。
linux、GCCでシステムメモリー状態を取得する方法はあるのでしょうか? freeコマンドで取得した戻り値解析する方法しかわかりません。
577 :
デフォルトの名無しさん :2011/04/12(火) 22:35:25.28
こんばんは。ポインタについて2つ教えてください。 char s1[10] ="abc"; struct point { char *data; } pointer; pointer->data = malloc(10); 説明のためかなり適当で省略していますが。。。 char *dataにmallocで確保した領域のポインタが入っています。 pointer->dataに文字列をコピーしたいのですが、どのように書けばいいですか? memcpy(pointer->data, s1, 4); これだとdataにコピーしようとしてしまいますよね? また、pointer->dataに既に文字列へのポインタが入っており、strcatする場合もどのように書けばいいですか?
578 :
577 :2011/04/12(火) 22:40:40.54
>pointer->dataに文字列をコピーしたいのですが と書きましたが、mallocで確保した領域にコピーしたいという意味です。
>>578 char s1[10] ="abc";
struct point {
char *data;
} pointer
pointer.data = malloc(10);
memcpy(pointer.data, s1, 4);
strcat(pointer.data,"str");
580 :
577 :2011/04/12(火) 23:11:31.69
>>579 レスありがとうございます
書いてませんでしたが別関数にポインタで渡してるので
pointer->dataで合ってます。。。
>>580 必要なところは省くなよ
577で動くんじゃないの?
あとは
strcat(pointer->data,"str");
64bitのCPUになったらポインタ型は8byteになるの?
>>583 64bit CPU で 64bit OS を動かしていて 64bit プロセスで LP64 とかなら基本はそう。
C 以外の言語だと、Java なんかは -XX:+UseCompressedOops を付けると64bit プロセスでも
アドレス幅が 32bit で済んだりする場合もある。
64bit CPU でも 32bit OS を動かしていたり 32bit プロセスだったりする場合は ポインタのサイズも従来通り。 C ではなく、GC のある言語で tagbit を使っていたりすると、実効ポイント幅は 30bit だったりする事もある。
587 :
552 :2011/04/13(水) 02:10:41.42
>>574 C:\*.* を書くときは、C:\\*.* と¥を2個重ねる。
なるほどメモリが64bitだからそのアドレスを指すのに8byte要るみたいな単純な理由じゃないのね。 まことに恐れ入りました、ありがとうございます。
589 :
デフォルトの名無しさん :2011/04/13(水) 06:00:32.05
D:ドライブなどカレントディレクトリ以外のファイルを操作したい 場合はどのようにすればいいのでしょう? パスを入れてもファイル名以外は引き継がないらしいです。 また見つかっても処理したファイルはカレントディレクトリの 中で大きさが0の殻のファイルしか出来ません。 ほかのディレクトリのファイルをそのファイルのある場所に処理した ファイルを置くには何をどうすればいいのでしょうか? わかる人よろしくお願いします。
590 :
デフォルトの名無しさん :2011/04/13(水) 06:13:03.75
これでカレントディレクトリの検索は出来るのですが、任意のディスク やフォルダに適用する方法がわかりません。よろしくお願いします。 int find(moji name2[256],int sum2){ struct _finddata_t c_file; long hFile; int count=0,i,j; for(j=0;j<sum2;j++){ // カレント ディレクトリ内の最初のファイルを探します。 if( (hFile = _findfirst( name2[j].m, &c_file )) == -1 ){ printf( "カレント ディレクトリにはファイルは存在しません。 %s\n" ,name[j].m); system("pause"); } else{ printf( "name %s \n", c_file.name ); strcpy(name[count].m, c_file.name); count++; // 残りのファイルを探します while( _findnext( hFile, &c_file ) == 0 ){ strcpy(name[count].m,c_file.name); count++; printf("b%s ", c_file.name); printf("a%s \n", stock[count-1].m); } _findclose( hFile ); } } }
> if( (hFile = _findfirst( name2[j].m, &c_file )) == -1 ){ name2[j].m にパスを入れればいい
592 :
デフォルトの名無しさん :2011/04/13(水) 06:41:32.82
パスを入力しても、それが取れてしまいます。またstrcatで文字列結合を しても、カレントディレクトリの結果が出てきてしまいます。検索結果 とファイル処理の場所が異なってしまうので、ファイルが見つからず エラーになってしまいます。どのようにすればいいでしょう?、また デフォルトではカレントディレクトリを探したいと思います。 長々と書きましたが、よろしくお願いします。
>>592 とりあえず _findfirst() の手前に puts(name2[j].m); を入れて、_findfirst() に何が渡されているか調べてみろ
それと name2[0〜sum].m が _findfirst() で使われているのに後で name[0〜].m に strcpy() されているのは大丈夫か
あと stock とは何者?
594 :
デフォルトの名無しさん :2011/04/13(水) 07:15:39.61
strtocは文字列を空白区切りで分解します。それによって複数ファイル が処理できるようになります。 name[j].mにはパスが入ってましたか、検索結果のリストに代入する 時にカレントディレクトリで見つかったファイル名を代入するので うまくいきません。以下の部分が問題だと思うのですが解りません。 よろしくお願いします。 else{ printf( "name %s \n", c_file.name ); strcpy(name[count].m, c_file.name); count++; // 残りのファイルを探します while( _findnext( hFile, &c_file ) == 0 ){ strcpy(name[count].m,c_file.name); count++; printf("b%s ", c_file.name); }
595 :
デフォルトの名無しさん :2011/04/13(水) 07:24:55.77
訂正:name[j].m -> name2[j].m stockはmameと同じ構造体ですが、ダイレクトにパスを指定したいので 使いません。パスが入っていて、name[i].mと連結させてパスを通そう としましたが無駄でした。 strcmy()で見つかったファイルのリストを作りたいのですが、カレント ディレクトリで見つかったファイルしか代入されません。 一体何をコピーすればいいのかわかりません。よろしくお願いします。
596 :
デフォルトの名無しさん :2011/04/13(水) 07:33:33.57
たぶん見つかったファイルのファイル名だけで、ディレクトリのパス までコピーされないのが原因だと思うのですが、どうしたらパス付き のリストを作れますか?ちなみに検索結果はあっているようですが、 処理の対象のファイルが間違っています。実行環境はMinGWです。 Visual Studioでもやっています。
598 :
デフォルトの名無しさん :2011/04/13(水) 07:49:03.90
自己解決しました。ありがとうございました。
599 :
552 :2011/04/13(水) 08:02:39.87
何が?
>>595 とりあえず name2 以外の引数を持たせて、そこに検索対象パスを格納するようにしろ
入力と出力を混ぜるのは、メモリに困った時以外ダメ、絶対
>>596 _findfirst() 系がパス情報を含まないファイル名しか返さないのは仕様なので、自動で
フルパスを得るのはあきらめる事。
パス文字列を組み立てるには sprintf(name[count].m, "%s\\%s", 検索対象パス, c_file.name);
とでもすること (「検索対象パス」 は適宜変数名に置き換えること)。
_findfirst()は使うなよ これってunixでは使えないし、winAPIでもないし。
strncpyで質問です。 関数の外部からくるサイズのわからないchar*の変数srcから charの変数destに文字列をコピーしたいのですが、下記のようなコードで問題無いでしょうか? destのバッファより大きなsrcがきた場合は切り捨てても問題ありません。 char dest[1025]; ZeroMemory(dest, sizeof(dest)); strncpy(dest, src, sizeof(dest) - 1); 気になったのは、srcがdestより小さい場合、strncpyでsrcの領域を超えてコピーすることになるので、 おかしな事にならないかと言うことです。 また、strncpyの際にsizeから-1しているのは、常に最後の\0を保持するために必要という理解です。 小さい方のサイズでコピーするとか下記のようにやらないと駄目でしょうか? strncpy(dest, src, strlen(src) < sizeof(dest) - 1 ? strlen(src) : sizeof(dest));
>>602 src が NUL文字終端の文字列なら問題ない
>>603 ありがとうございます。
すっきりしました!
src が size-1 文字の時の対処で dest[size] = 0 を明示的に代入する… …… ZeroMemory で埋めてるのか。 ちょっとドキっとするね(俺的に)
606 :
デフォルトの名無しさん :2011/04/13(水) 17:09:06.61
ファイルを見つけるのにfindfirstを使わない方法ってあるんですか? 自分はサンプルがあるのでそれを使ってしまいましたがそれ以外に方法が あるなら教えてください。 また2次元配列の2次元目だけに値を入れるにはどうしたらいいでしょうか。 自分は解らなかったので配列の構造体にしました。よろしくお願いします。 ファイルネームの先頭に、strcatでパスをくっつけて検索したらうまく 行きましたが何か問題があるでしょうか?
>>605 レスありがとうございます。
こういう感じでしょうか?
char dest[1025];
strncpy(dest, src, sizeof(dest));
dest[sizeof(dest)-1] = '\0';
null終端文字列の場合は
memsetやzeromemory使うより
こういう感じの方がすっきりしますか?
>>607 危なそうなコードの直後に対処は考えてますよコードが居るのと
頭で危険性回避コード 後で危なそうなコードが居るの
個人的な気分の違いだけだよんw
strcpy(dest, src)
610 :
606 :2011/04/13(水) 17:24:00.22
>>600 レスありがとうございます。
わからないことが多いのでよろしくお願いします。
これってダメだろ。sizeof(dest) は0 ZeroMemory(dest, sizeof(dest)); strncpy(dest, src, sizeof(dest) - 1);
>>611 ちょっと混乱してきました。
sizeofですけど、
sizeofするのが、配列の場合は配列の全体サイズ
変数の場合は変数のサイズと理解しています。
char dest[1025];
size_t size_a = sizeof(dest); /*size_a は 1025*/
size_t size_b = sizeof(dest[0]); /*size_b は 1*/
0というのはどういうことでしょうか?教えていただけませんか?
>>608 なるほど、そういうことですね。
理解しました
>>611 いずれにしても間違えてるだろ。
strcpy(dest, src)にしとけ。
何度もスイマセン。strncpyじゃなくて、strcpyでも大丈夫ということでしょうか?
>>615 char dest[8];
char* src = "12345678901234567890";
strcpy(dest, src);
コピー先のバッファが小さい場合など
上記のケースでも問題無いのでしょうか?
>>615 destは十分大きく取っておけばいいだけ。
MAXを決めておくか、n=strlen(src)として
char *dest = new char [n+1];
>>615 任意の長さで、バッファ管理が面倒ならばC++つかえ。
これだけで、メモリ自動確保とデータコピーをしてくれる。
static string dest;
dest = (string)src;
strncpy()なんか使わずにsprintf()にしておけば余計なことで悩まずに済むのに。
今620がアホな事言った
sprintf()は神
おれもsprintf()がいいと思う。
sprintfって確かに便利だけどパフォーマンス的にはどうなん?
sprintf()は万能すぎるのが弱点といえば弱点だな
sprintfがあればstrcpyもstrcatもatoiも不要だからな
マジかよ!すごすぎんだろsprintf!!!!!!!!!
strcpy_s()とかlstrcpyn()みたいな関数があればそれを使えばいいけど、 なかったら、sprintf()がいちばんマシかな。
C言語はもともとワープロをプログラムする用に開発された言語だからな
スペースウェオーつくろうぜ!
スペースウォーズな
関数ポインタの配列って可能?
可能
可能
化膿
関数の配列をmallocするのは可能?
出来るだろ
関数の配列を定義した気になってもそれは関数ポインタの配列。
関数の配列か… あえて想像すると 機械語変換済みバイナリの集団が配列になるようなものなのか? 要素間のアドレス差が最も大きいもの単位になってるっていうような
呼び出し先の配列でしょ
関数の配列ってどうやって宣言すんだよw 関数によって定義しなきゃ駄目じゃねぇかww
書き方がわからないって、馬鹿じゃねの
こんな感じ? int func[10]();
648 :
デフォルトの名無しさん :2011/04/13(水) 22:23:38.76
基本的ですみません。 文字列の配列で char s[] = "hogehoge"; とかはよくやりますが、文字列リテラルはchar[]型には代入できないというのはわかっています。 ところが、文字列配列を受け取る関数 foo(char s[]) とかを定義すると、 foo("hogehoge") で呼び出しができてしまいます。内部でsの値をいじろうとすると怒られるので 文字列リテラルだと認識されているようです。これは、関数呼び出し時に代入演算 でない渡し方になっているということでしょうか。
関数ポインタの配列のサンプルコードをかけよだれか
650 :
602 :2011/04/13(水) 22:25:30.28
皆様レスありがとうございました。 sprintfをstrcpyの代わりに利用するというのは 次のようなコードの事ですね。 char dest[8]; char* src = "12345678901234567890"; strcpy(dest, src); /*これだと、バッファオーバー*/ sprintf(dest, "%0.7s", src); /*スマート*/ 確かにシンプルですね。 コレを利用してみます〜
>>649 typedef int (*func_ptr)(const char *, ...);
func_ptr a[] = { printf, scanf };
こんなんでよろしいか?
>>648 代入っつーか文字列の先頭のアドレスを渡してるだけでしょ。
固定文字列はメモリ空間内の書き換え不能なエリアに配置されるから
書き換えようとすると怒られる。
>>647 それだと int[10] を返す普通の関数に見えるな
>648 関数に配列を渡すことはできない。 void foo(char s[]); としても void foo(char *s); と同等。 したがって char *s = "hogehoge"; と初期化しているのと同等の処理となる。 char s[] = "hogehoge"; ではない。
久しぶりにポインタ完全制覇でも読み直そうかな
656 :
648 :2011/04/13(水) 22:35:34.98
>>652 ありがとうございます。
そうすると、char[]型のsについて
s = "hogehoge";
ができないというのは配列型特有の特殊な仕様ということでしょうか。
("hogehoge"が単なる先頭ポインタだとすると、配列の先頭ポインタであるはずのsには代入できてもよい気がします)
>>653 配列を返す関数w
int func()[10];
代入と初期化の区別がついてないようだね 同じ記号 = を使ってるけど やってることは全然違うから
int func()[10]; エラー
660 :
648 :2011/04/13(水) 22:38:34.70
>>654 ありがとうございます。
関数に配列引数が指定された場合は暗黙にポインタに読み換えられるということですね。
紛らわしいので明示的にわかる文法にしてほしいですね…。
661 :
648 :2011/04/13(水) 22:40:42.19
>>658 関数引数に渡すのは初期化に対応するということでしょうか?
int (*func[])(void);
663 :
648 :2011/04/13(水) 22:43:06.94
>>658 初期化では
char s[] = "hoge";
とできるのに、それ以外では
s = "hoge";
とできないのは納得がいかない!
と言っているわけではありません。
>>663 sは、アドレスを示すラベルみたいなものだから。
最初にそのアドレスに格納することはできるけど、
そのラベルに何かを代入するのは出来ない。
667 :
648 :2011/04/13(水) 23:02:13.84
>>665 sはポインタですが、"hoge"がfoo(char s[])に渡されるときは"hoge"という文字列の先頭ポインタが渡されるのだとすると、
リテラル"hoge"自体が適当に確保されたメモリに格納された文字列hogeの先頭'h'に対応するポインタ(メモリアドレス)の値を
持っていると考えるのは自然だと思います。実際
>>664 にも書いてあります。
また、char s[]のsは配列の先頭ポインタですから、sと"hoge"は同じポインタ型(メモリアドレスの値を持つ)なので、代入可能であっても良い気がします。
しかし実際にはこれはできないので、他のルールがあることになります。それが
>>652 かと思います。「配列型の暗黙のポインタは」書き込み不能なメモリ領域のアドレスは受け取れない。
一方、foo(char s[])に"hoge"が渡せてしまう問題は、上記ルールにも違反すると思います。これは、「関数の配列引数」に関するまた別のルールがあって、
「関数の配列引数は暗黙に(明示的な)ポインタ型に読みかえられる」というものかと思います。その上では、上記ルールが適用範囲外になるため、"hoge"を
受け取ることができるのではないかと思います。
別の解釈の可能性もあります。「配列の暗黙のポインタ型は初期化時のみリテラルを受け取ることができる」ので、「関数の配列引数への値渡しは初期化処理になる」
のだとすると、上記2つ目のルールはなくても良いことになると思います。
非常にややこしくて気持ち悪いですが、もっとシンプルなルールなのかもと思っています。
foo(char s[]) って foo(char *s) で解釈されてるだけでしょ
>667 配列は代入可能な左辺値に含まれないので、配列に代入することはできない。 なんども繰り返されているが、 1)char s[] = hoge; は初期化付きの宣言であり、代入ではない。 2)配列は関数の引数に指定できない。
1) char s[] = "foo"; ・まずテキストエリアに "foo" がアロケートされる ・s は "foo" の先頭アドレスで初期化される ・puts() には "foo" の先頭アドレスである所の s が渡される ・非常に自然な流れなのでオケ 2) char s[10]; s = "foo"; ・まずテキストエリアに "foo" がアロケートされる ・s は char が 10 個分のデータとしてスタックにアロケートされる ・s に "foo" の先頭アドレスを代入しようとすると、ひとつ前で スタック上にアロケートした char 10 個分はどうなるの? ・不自然な流れになるのでエラー 3) puts("foo"); ・まずテキストエリアに "foo" がアロケートされる ・puts は "foo" の先頭アドレスを引数として受け取る ・非常に自然な流れなのでオケ
>>671 >・puts() には "foo" の先頭アドレスである所の s が渡される
これは消し忘れた。スマソ。
pointer の意味を辞書で調べたら?
>>671 1) char s[] = "foo";
配列の値はコンパイル時に決定されてるから、アロケートっておかしいだろ?
int a[3][3][2] = { { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , } , { { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , }; この書き方ではダメと言われました、3次元配列を一気に入れるときはどう書けばよいのでしょうか?
間違えました int a[5][5][2] = { { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , } , { { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , { -1, -1, -1, -1, -1 } , }; でした
それは[2][5][5]だ
>>674 アロケートはメモリの割当の事で、値の決定とは関係無いよ
680 :
648 :2011/04/13(水) 23:55:31.24
まとめです 1:"hoge"は変更不可な領域を指すポインタ 2:char s[] = "hoge"は変更可能な領域に静的に確保されたメモリに"hoge"を書きこんで先頭ポインタを返す 3:char s[]で定義したsは変更不可なため、アドレスを変更しようとする(s="fuga"とか)と怒られる 4:foo(char s[])は暗黙にfoo(char* s)と読み換えられる。したがってfoo("hoge")は変更不可能な領域を指すポインタ が渡されるため、内部で変更しようとすると怒られる 「変更不可」が2つの意味(内容の変更不可(リテラル)と、メモリアドレスの変更不可(左辺値))を持っていたために混乱したのかと思っています。
>>680 >2:char s[] = "hoge"は変更可能な領域に静的に確保されたメモリに"hoge"を書きこんで先頭ポインタを返す
分かってるかもしれないけど、"hoge" がメモリ上に書き込まれるのはプロセス起動時ね。
683 :
デフォルトの名無しさん :2011/04/14(木) 00:36:00.72
> 先頭ポインタを返す 配列は何も返さない
685 :
デフォルトの名無しさん :2011/04/14(木) 00:55:54.94
>>684 硫黄が放射能を返すってのと同じくらいありえない
どの時点の話ししてるのかがわからん
>680 全然分かっていない。 1:"hoge"は変更不可な領域を指すポインタ →文字列リテラルの型はconst char の配列。 2:char s[] = "hoge"は変更可能な領域に静的に確保されたメモリに"hoge"を書きこんで先頭ポインタを返す →char s[] = "hoge";はchar s[] = {'h','o','g','e'};を簡易にかけるようにした構文糖。 3:char s[]で定義したsは変更不可なため、アドレスを変更しようとする(s="fuga"とか)と怒られる →char s[N];で定義した配列sは、式の中では&s[0]として評価される。(&, sizeofのオペランドになる場合は例外) 4:foo(char s[])は暗黙にfoo(char* s)と読み換えられる。したがってfoo("hoge")は変更不可能な領域を指すポインタ が渡されるため、内部で変更しようとすると怒られる →sが指している先は書き換えられない("hoge"の型はconst char[5]であるため)ので、sが指している先を変更しようとすると怒られる。
>>617 きれい。でも FILO のようなきが。
689 :
デフォルトの名無しさん :2011/04/14(木) 01:11:06.08
>>687 >→char s[] = "hoge";はchar s[] = {'h','o','g','e'};を簡易にかけるようにした構文糖。
これは俺も勘違いしてた。ありがとん。
691 :
デフォルトの名無しさん :2011/04/14(木) 01:21:27.45
>>691 なぬ・・・
おとなしく規格読むことにするわ・・・
694 :
デフォルトの名無しさん :2011/04/14(木) 01:47:56.12
>>693 がんばってねー
687 読むとお腹痛くなるまで
笑いは健康にいいからね
'\0'
暴走するようなことを考えるんだ
697 :
デフォルトの名無しさん :2011/04/14(木) 02:14:46.87
>>695 まだ1つしか気付かないの?
突っ込みどこ満載の蜂の巣なんだが
698 :
デフォルトの名無しさん :2011/04/14(木) 03:54:21.42
int main()とint main(void)の違いて何ですか?
かっこの中にvoidって書いてある
宣言においては違いがあるが、定義においては事実上同一。
>>702 失礼。正確には
>>701 のとおり。
ISO/IEC 6.7.5.3.14
An identifier list declares only the identifiers of the parameters of the function. An empty
list in a function declarator that is part of a definition of that function specifies that the
function has no parameters. The empty list in a function declarator that is not part of a
definition of that function specifies that no information about the number or types of the
parameters is supplied
704 :
703 :2011/04/14(木) 04:20:32.37
ISO/IEC 9899:1999 6.7.5.3.14 ね。
>>698 (void) 引数を持たない
() 引数情報を持たない
void f1(){}
void f2(void){}
int main(){
f1(100); //ok
//f2(200); //compile error
return 0;
}
頼むから ◆QZaw55cn4c は書き込みをやめてくれ。 お前はアホで頭が悪いんだから。それが本当の姿なのに、無理に自分を 頭のいい特別な存在だと思い込みたがるもんだからあちこちにボロが出る。 それ自体は別に悪い事ではないが、問題はお前がその事実を絶対に認め たがらない事だ。だから嫌われているという事に気づけ。社会からもそれが 原因でのけ者になっているだろう。
708 :
687 :2011/04/14(木) 07:03:00.02
>690>691>695 終端文字忘れていた。 char s[] = "hoge";はchar s[] = {'h','o','g','e','\0'}; です。 4ではちゃんと("hoge"の型はconst char[5]であるため)と終端文字のこと意識していたのだけれど。 >694 上記終端文字以外間違いはないと思います。 誤りあればご指摘いただけませんか?
間違いを指摘するなら正しくは何なのかまで書いてほしいなあ
少し様子見るだけならいいんだけど、投げっ放しは勘弁。 つーか、判ってないのに煽るだけなんてのは最悪。
711 :
デフォルトの名無しさん :2011/04/14(木) 09:21:53.25
#include <stdio.h> #include <windows.h> int main(void){ char buffer[MAX_PATH]; GetFullPathName("../cc/16.rb", MAX_PATH, buffer, NULL); puts(buffer); } このプログラムを実行するとパスを含んだファイル名が出力され ますが、ファイル名を除いたパス名だけを取得するにはどうすれば いいでしょうか。環境はビスタでVisual Studioです。 よろしくお願いします。
712 :
デフォルトの名無しさん :2011/04/14(木) 09:25:59.03
追記: 絶対(相対)ファイル名を入力して、ファイル名を除いたパスだけの 出力が欲しいです。
714 :
デフォルトの名無しさん :2011/04/14(木) 10:13:06.96
自己解決しました。ありがとうございました。
>>711 strrchr(buffer, '/')[0] = '\0';
puts(buffer);
UNIX系のソースをVCでコンパイルしようとおもっております。 #include <sys/types.h> #include <sys/param.h> を読めなくて躓いているのですが、VCで代替可能なヘッダは用意されているのでしょうか?
>>716 しらねえけど。
コメントアウトして、止まる所の関数、defineを全文検索
VCで代替可能なヘッダなんてありません。 自力で出来ないなら、諦めるしか...
ほっほっ
ふっほっ
722 :
デフォルトの名無しさん :2011/04/14(木) 14:30:45.72
/* * 機能:src からディレクトリとファイルネームを取得し、それぞれを格納する * 補足:取得を失敗した('/'がなかった)ときは何もしない */ void get_dirpath_filename(const char *src, char *dirpath, char *filename) { const char *divide = src; /* divide = 区切る. 結果的には src の最後尾にある '/' のアドレスを格納させる */ divide += strlen(src); /* src の終端のアドレスを代入 */ while (src != --divide) /* src の先頭まで '/' を検索する */ if (*divide == '/') break; if (src != divide) { /* '/' が見つかった場合は、directory-path, filename の取得 */ strncpy(dirpath, src, divide - src); *(dirpath + (divide - src)) = '\0'; strcpy(filename, divide + 1); } } この関数でファイル名とパスを分けて格納しますが、ルートディレクトリ を格納することが出来ません。パスを見ると""になっています。 どのようにすればいいでしょう?よろしくお願いします。
//
>>722 // コード読む気がしないから判らんが、やりたいことはこういうこと?
void get_dirpath_filename(const char * src, char * dirpath, char * filename)
{
char const * const lastSlash = strrchr(src, '/');
if (lastSlash == NULL) return;
sprintf(dirpath, "%.*s", lastSlash == src ? 1 : lastSlash - src, src);
sprintf(filename, "%s", lastSlash + 1);
}
724 :
デフォルトの名無しさん :2011/04/14(木) 14:56:21.76
コンパイルは出来るのですが実行できません。
どこが問題なのか教えて下さい。お願いします。
コマンドライン引数からアルファベットだけからなる文字列(空文字列を含む)のみを選び、 一行に一つずつ標準出力に出力するプログラムです。
http://codepad.org/mQcnLNqr
>>724 仕様がよく判らん。取り敢えず、実行結果はこうなった。
--
$ ./a foo bar 123 dd "" Abc3 a2Bc abC
foo
bar
dd
abC
--
で、どうなって欲しいの? つーか、実行できないってどういうことよ。
727 :
デフォルトの名無しさん :2011/04/14(木) 15:12:22.19
>>723 その通りです。ありがとうございました。
728 :
デフォルトの名無しさん :2011/04/14(木) 15:41:05.90
>>726 ./a.outとしても文字入力にならず次の行?にいってしまうんです。
729 :
デフォルトの名無しさん :2011/04/14(木) 16:04:03.22
>>726 間違いに気づきました。
有難うございました。
C言語には、ループを書くための文法として、for と while の2種類がある。 時々悩むのだが、この for を使う指標、whileを使い分ける指標に対して、 個人的にハッキリとした理由が持てない。 たとえば int i; for(i = 0; i < 10; i++) { putchar('A'); } と int i; i = 0; while(i < 10) { putchar('A'); i++; } のどちらでも、頭の中のパーサーの動きが同じである。 個人的には、プログラム中にforを一切含めない。すべてwhileで書くことにしている。 forを使うべきか? whileを使うべきか?で思考する手間を省ける。 プロブラム中に for と while を混在させてる人の「使い分けの指標や、判断の拠り所は何なのか?」を聞かせてほしい。
>>730 どっちでもいいやん
「こういう場合はforで・・・」とか語り出す奴は大抵頭がおかしい
初期化や更新部が明示的な場合はfor。 只の代入文を生で放り出しておくよりも、場所を限定してやった方が目的が明確になる。
for だと continue を使うときに少し楽になるかもしれない
For (int i = 0; i < 10; i++){ } とした場合forから抜ければiは破棄できる
>>732 に同意。
whileだと入り口でi=0;や中でのi++;をうっかり忘れる。
C99前のCは制御構文より前に宣言しないとおこられたよね? 最近はC++をベターCとして使ってるからあんまいしきしてねえけど。
CならC++でもいいけど、C++ならC++はあまりよくない
>>737 古き良き時代のソースみたいに関数がちっちゃいうちは「関数の冒頭でまとめて宣言」でもよかったけど
ちょっと長いプログラムになると宣言ばっかりずらずら並ぶのがうっとうしいし、
関数の最後の方で一回しか使わないような変数を初めから用意しておくってのはあまり現実的じゃないよね。
740 :
デフォルトの名無しさん :2011/04/14(木) 18:13:53.08
どうしても分からないので質問します struct point{ double x; int y; }; struct hist{ struct point **p; int n; }; で構造体を宣言し,適当な整数sizeでもって struct hist* y2; y2 = (struct hist*)malloc(sizeof(struct hist)); y2->p = (struct point**)calloc(size,sizeof(struct point)); でsize個のpoint配列を持ったhist構造体を作りました。 それで int s; s = y2->p[0]->x でもってy2の0番目(何番目でもエラーが出る)のpoint構造体のメンバx(メンバyでも同じく) を参照しようとすると 「"0x00000000" のメモリを参照しました。メモリが "read" になることはできませんでした。」 の例外エラーが出ます。 何がいけないんでしょうか?
y2->p = (struct point**)calloc(size,sizeof(struct point *)); for (i = 0; i < size; i++) y2->point[i] = (struct point *)malloc(struct point); とやってpointの実体を確保しないとまずい
あ、ちょっとまったポインタのポインタか そしたら2次元配列風になるな
>>740 実はこうしたいんじゃない?
struct hist{
struct point *p;
int n;
};
y2 = (struct hist*)malloc(sizeof(struct hist));
y2->p = (struct point*)calloc(size,sizeof(struct point));
s = y2->p[0].x;
>>740 struct point *p;でs = y2->p[0].xじゃね?
struct point** p; p は { struct point* が書かれてる場所の } ポインタ calloc で 戻りの領域は 0 で埋まってるので *p (or p[0]) は ぬるぽ がっ ってな具合 特に y2->p[index]->x としたい理由がないのなら struct hist{ struct point *p; int n; }; にして y2->p[index].x のほうが素直
おまえらエスパーだな
>>740 struct point **p;
で管理したい(ポイントしたい)のはpointの1次元配列?
それともpointの2次元配列?
なんか説明だと2次元配列って感じするんだが
747 :
デフォルトの名無しさん :2011/04/14(木) 18:43:17.17
>>705 残念ながら、
>>701 のとおり、宣言と定義で解釈が異なる。
>An empty list in a function declarator that is part of a definition of that function specifies that the
>function has no parameters.
>void f1(){}
>f1(100); //ok
void f1() {} は void f1(void){} と同等だから、C99 に準拠するコンパイラならエラーになってしかるべき。
>>730 インデックスな変数があるなら for() を使っている。
for (p = a, q = b; *p; p++, q++)
*q = *p;
>>751 毎回思うのだが、この人の書くソースコードは汚くて読みにくい。
あと、妙な歪さがいつも気になる。
具体的には、
洗練されてるアルゴリズム部分は、やたら洗練された完璧なアルゴリズムを書くくせに、
一方、イモのようなアルゴリズムの所は、どうしようもなくイモだったりする。たとえばmain()中の、検証用テストコードなんかは、どうしようもなくイモだったりする。
このエレガントさとイモさのギャップが、あまりにも不自然すぎて笑う。というか本当に同じ人間が書いたコードなのか?というコードの混在が、どうにも不思議でならない。
>>753 ◆QZaw5 5cn4c はまともな批判をされると常人の百倍ぐらいに苦痛に感じるらしい
要するに頭が狂っているので触らぬキチガイに祟り無し
◆QZaw5 5cn4cに有償モリタポで見てもらえば?
誰がこんな糞グラマに金払うかよ
ほっほっ
doubleを見かける度になんとなく心でドーブルって読んでしまう奴って俺以外にもいる? ポケモン金銀直撃の世代はみんな一度はやってると思うんだけど
ダボゥ
ドゥーブレ
そんなこたぁない
766 :
デフォルトの名無しさん :2011/04/15(金) 12:31:57.96
危険なプログラムが書けてしまうという表現を耳にするのですが どういう意味でしょうか?
ミッソー
>>766 最近はOSがアプリに対する制限をいろいろかけてきてるので、
きっとその表現がされていたであろう文脈での危険なプログラムは
書けなくなったかと。
簡単に他の領域を破壊できてしまう
770 :
デフォルトの名無しさん :2011/04/15(金) 12:35:38.50
printf プリントフ scanf スキャンフ fget エフゲッツ
>>766 危険なプログラム?
「核ミサイルの発射プログラム」とか
「不特定多数の人に結婚を申し込むプログラム」とか
そういうのを書けてしまうから非常に危険だね。
773 :
デフォルトの名無しさん :2011/04/15(金) 12:39:51.78
>>766 「安全」を自分で作るための道具なので
始めからあったらすることがないのさ
何を書いても完全に安全な言語とか存在するのか?
極論乙。 Cが特に安全対策してないのは明白
CでGUIってどうやるの?
配列のポインタで int a[ ]; int *p; p=a; みたいな感じの定義で、aはa[]の(最初の)アドレスで この2行目、3行目をまとめて表すと int *p = a; となるんだけど、これはある意味厳密ではないけど慣例でやってるんだよね?
厳密? 慣例? 質問の意味も意図も判らんが変数をきちんと初期化するのはいいことだ。
>>779 int* p = a;
int*型変数を定義して代入。
(int*) p = a; おまえのためにわかりやすく括弧を付け加えてやる
while文について質問です。 while文処理が行われてる時間においては while(){}の ()内{}内の情報はstaticですか?
情報は static ってどういうことを指してるの? 質問の意図がまったく見えない
変数か?staticじゃねえよ。 main(){}なんかと同じだよ。
>>784 while(){}の(){}内で例えば1回目ループの最終評価値がn=1とすると、
2回目ループの(){}内でも最初n=1ですか?
それでwhile(){}の処理が終了したとき、最終ループ内でのnの評価値
は保存されてますか?
>>786 質問の意図が判らんが、少なくともそれをstaticとは言わない。
言葉で説明するのはもういいから判りやすいコードの断片を貼ってくれ。
>>786 その変数のスコープの間は有効だよ。
変数のスコープは おおざっぱに言って { から } までの間
void foo()
{
int n;
while (nがうんたらかんたら) {
int j;
n と j 使ってなんかやる
/* j は ここまで生きてる */
}
なんかやる
おわりんぐ
/* n はここまで生きている */
}
while から抜けない!なんで? って症状おこしてるのか? int i=0; /*―(1) */ while (i<5) /* この while の判定対象は (1) */ { int i=0; /*―(2) : このスコープ内での i は (2) を指す */ i++; /* (2) をインクリメントしたところで (1)のi は変わらない */ }
790 :
デフォルトの名無しさん :2011/04/15(金) 15:34:07.38
#include<stdio.h> int main(void) { int i=1; while(i<10) {printf("%d\n",i);i++;} printf("iの値は%d\n",i);} ↓実行結果 ・ ・ ・ ・ iの値は10 そうなんですか? #include<stdio.h> int main(void) { int i=1; int s=100; while(i<10) { int s=99;printf("%d\n",i);i++;} printf("iの値は%d\n",i); printf("sの値は%d\n",s);} sの値は??あれ?
>>790 上
i をインクリメントした (結果が 10 になった)
i < 10 かどうか確認 不成立なので while から抜ける
i の値は 10
下
while の中で ”新たな別変数 s に 99" を代入してるだけで(厳密には初期化 だが) main 直後の s の値は変わらない
while から抜けた
s は 100 のまま
792 :
779 :2011/04/15(金) 16:12:30.41
>782でした int (*p) = a; だと思ってたわ、型がワワナイ・・・って 例解C言語教科書(CQ出版社)やってんだけど、いい本だな
取り敢えず初心者が躓く原因は日本語能力の低さだと言うことがよく判った。 きちんと読解できないし、説明できない。 プログラミング言語も言語である以上、似たような能力が必要なのだろうし。
>>793 ついでに高脳なら能力の低いのが言った・書いたことから本質を見抜き、
適切なアドバイスできるがいまや日本は低脳だらけだからな
能力が低いという表現を使いつつ低脳と呼ぶような馬鹿さ加減だから馬鹿にされるんだよ。 新しい言葉を使ってみた気になって悦に入っているのかもしれないが、底の浅さが丸見えだ。
>とか<って名前は何て読むのでしょうか? >は右大なり? <は左大なり?
大なり小なり
798 :
デフォルトの名無しさん :2011/04/15(金) 17:45:09.38
for do while の長所短所ってなんですか?
doって何wwww
今日はバカみたいな質問がやけに多いな
>>796 #include<iostream> //いんくるーどあいおーすとりーむ
vector<int> //べくたーいんと
Class->Member //くらすのめんばー
俺はあまり読まないな。
便乗で{}や[]ってなんて読んでいるんだ?
>>796 right/left angle bracket
803 :
デフォルトの名無しさん :2011/04/15(金) 17:56:00.97
do { } while(条件) 条件に関係なく 最低限でも1回は { } ブロック内を実行する やってみないと条件に関係する変数値が決まらない場合(do より前で適切な値が設定できるかどうか) マクロのお供 do { } while (0) while(条件) { } 条件により { } ブロック内は実行されないかもしれない for() { } while のちょっと気の利いた機能が増えた版
>>803 先ずはこれからだな
for(){
continue;
}
do{
continue;
}while()
continueしたらどこに飛ぶの?
807 :
デフォルトの名無しさん :2011/04/15(金) 18:03:18.34
メモリの節約的には、while,do while,forの内どれが一番いいですか?
対して変わらない
if (a > b)だったらa大なりbって読みますが このような条件式ではなく、単純に >と<の読み方が判りません
810 :
デフォルトの名無しさん :2011/04/15(金) 18:19:44.12
不等号(より大) greater-than sign 不等号(より小) less-than sign
>>802 アングルブラケットを出すぐらいだからカーリーブラケット、スクエアブラケットでいいんでないかっておもうけど。
812 :
デフォルトの名無しさん :2011/04/15(金) 18:42:06.79
もっと上で、インクルードエラーとかでてないの
多重インクルード防止にして何回でもincludeしてやる
815 :
デフォルトの名無しさん :2011/04/15(金) 19:49:48.57
a>>bと a>>=bの違いを教えてください。 どちらも一緒なのでは?
あほ
a>>=b は a = a>>b と同じ
821 :
デフォルトの名無しさん :2011/04/15(金) 21:00:31.17
100!を計算する全く新しい方法を考案した。 しかしパソコンが早すぎてどっちが早いのかわからん。誰か確かめてくれ。 log(1)+log(2)+log(3) = log(3!)であることを利用する。 x = 0; for(i=1;i<100;i++) x += log(i); return pow(10,x); 普通方式 x=1; for(i=2;i<100;i++) x *= i; return x;
>>823 そりゃ初めの方が速いだろ。しかし十分な精度を出すためにlognを求める方が時間食う。
826 :
デフォルトの名無しさん :2011/04/15(金) 22:58:04.60
D&Dの作り方がわかるお勧めの本があったら教えてください。 「オレオレ電子署名」というソフトを作ります。
827 :
デフォルトの名無しさん :2011/04/15(金) 23:07:35.74
多倍長の数字をファイルに書き込む場合どの関数を使えばいいでしょうか? cout をファイルに書き込む感じですがリダイレクトしたくないです。
プログラミングやってるけど、演算処理の実装は本当につまらんな・・ 数字をソートするとかつまらないにもほどがあるだろ。 プログラミングを使う事によって、どんなゲームやアプリが作れるかが重要 なんじゃないだろうか? それにプログラミング言語の綺麗さとか馬鹿じゃないの? 何の得になるの。
手早く書けるか 間違いなく書けるか 保守が容易か そういう観点がある
>>829 小さな技術の積み重ねでゲームやアプリが作られているという内情を理解するのが面白い。
色んな人の努力と学究の成果の上でゲームやアプリが成立していると思うと愛おしい。
偉業を達成した人の第一歩目はどんなだったろうと考えると、簡単なソートプログラムでも、
遥かなる山の頂の風を感じて心が舞い上がる気持ちだ。
言語は思考の道具だから、奇麗な言葉を使えばそれだけ奇麗なモノを生み出す事が出来る。
奇麗なモノは誰にでも分かり易くて、後から手直ししたり機能を追加したりするのが楽で、
みんなが幸せになれる。
・・・みたいな話が聞きたい訳じゃないよねw
足し算はできないけど積分はできます。みたいな
>>829 つJava
辛くない/楽が出来る != つまらなくない/楽しい
835 :
デフォルトの名無しさん :2011/04/16(土) 00:52:46.18
>>829 それはまず、おまい自身がゲーハーとクロスを用意してから言うことだな
>>829 バーカ、商用プログラムの中身の80%以上はエラー処理とログの書き出し処理だ。
お前みたいなホビーでやってるカスにはわからんだろうが。
>小さな技術の積み重ねでゲームやアプリが作られている あっているようで完全な間違い 小さな技術の積み重ねでもゲームやアプリめいたものが作 れるようになったのは最近のこと MS-BASIC上のゲーム?1980年代前半だろ? 最近のことじゃんw
それ、あってるってことじゃんw
楽にゲーム作りたいだけならCを選ぶのが間違い ツクールでもMMFでも使えばいい
つまり仕事でプログラミングしてもつまらんということだよ
841 :
デフォルトの名無しさん :2011/04/16(土) 06:48:57.27
仕事はつまらんということか
842 :
デフォルトの名無しさん :2011/04/16(土) 07:28:36.01
829 は仕事とは言ってないようだが
829なんかどうでもいいし
まあ仕事はつまらんけどね
プログラマの仕事って99%のつまらなさの中に1%の楽しみを見つけ出すようなものだと思ってる。
>>829 みたいに楽しい事だけしたいやつは向いていないし、迷惑だから職場とかチームに入って来て欲しくない。
せいぜい己の欲求を満たす楽しさ満載のクズプログラムを書いてマスかいてろ、って感じ。
viでコード編集してるだけで楽しいんだけど
組込は楽しいぞ ハードぶっ叩いたり、非同期処理考えたり コードだと、如何にグローバル減らせるか考えたり
> ハードぶっ叩いたり 衝撃の道具は何で?
viって慣れたら魔法が使えるの?
852 :
829 :2011/04/16(土) 12:29:06.68
すまんかった。 ゲーム好きで、ゲームを作るために複雑なアルゴリズムが必要ならば 結局演算処理自体も凝らねばならんのよね。 矛盾してるよね、ごめんw でもゲーム性が優れていて快適に動くならプログラムをそれ以上凝る必要なくね? あくまでゲーム性を追求するという動機があってプログラムを凝るんでしょ??? で聞きたいんだけど職業がプログラマーの人は具体的にどんな仕事してるの? 何のプログラム書いてるの?ホームページとか?そくらいしか思いつかん・・ だから最初から演算実装を頑張ろうなんて思わないんだよね。 ちなみに俺はプログラマーじゃないよwww 高3だからw
ゲーム性を考えるのはマの仕事じゃありません
>>852 >何のプログラム書いてるの?
コンテックやインターフェースのボードを使った検査装置や制御装置。
データベースと連動して製品情報として判定結果を残したり、
画像処理で製品の表面荒さの比較検査を行なったり。
一本、400万からご購入頂けます、的な。
ホームページ?ゲーム?そんなのは学生のバイトに毛が生えた程度だろ。
ほい、職業プログラマ兼システムエンジニアが呼ばれてきましたよ。 私ゃ只管他人が作った数値演算系のプログラムを如何に効率よく動かすか、そればっかりやってますな。 理論は設計者に任せて、そのアルゴリズムをGPUを使ったり複数台のPCを並列動作させたりして コストパフォーマンスを上げることで仕事としてますよ。 # 他のこともやっているけどね。
ゲームプログラマって、つまるところ合法ドラッグの製造と変わらないような気がするね。 「息抜き」と言えば聞こえがいいけど、社会貢献度という点では「無」に等しいわな。
ゲーム派生コンテンツを考えるとそれなり。娯楽すべてを否定するなら話は別だけど。
ゲームなんて括りとしてはパチンコや競艇や競馬と同じ。 娯楽はしょせん娯楽に過ぎ無いのにゲーム関連作ってる奴らってアーキテクト的な芸術家ぶったところがあるからなおさらタチが悪い。
お前らゲームプログラマdisってんのかw
ゲーム作ってるやつにでも噛まれたのか?
>>852 >ゲーム好きで、ゲームを作るために複雑なアルゴリズムが必要ならば
>結局演算処理自体も凝らねばならんのよね。
>あくまでゲーム性を追求するという動機があってプログラムを凝るんでしょ???
↑こういうのとか、ゲームプログラムを高尚なものと勘違いしている良い例といえるな。
数式が美しいようにプログラムも美しい つまりはそういうことです
ゲームプログラマといってもピンキリじゃね どうせ娯楽を商売にするんなら、いままで見たこともないような新しい表現や体験を作り出して俺らを楽しませてくれよ 3DSとかキネクトとか色々ハードも出てきて何か出来そうじゃん?
>>861 え?テンプレじゃないの?
>事務処理好きで、事務処理に複雑なアルゴリズムが必要ならば
>結局演算処理自体も凝らねばならんのよね。
>あくまで事務処理を追求するという動機があってプログラムを凝るんでしょ???
>科学技術計算好きで、科学技術計算に複雑なアルゴリズムが必要ならば
>結局演算処理自体も凝らねばならんのよね。
>あくまで科学技術計算を追求するという動機があってプログラムを凝るんでしょ???
どうとでもなるな
867 :
デフォルトの名無しさん :2011/04/16(土) 15:24:50.98
リスト構造で名簿を作っているんですが、標準入力から名前を常に先頭に 入れるという処理を10回繰り返しても10個とも全部最後に入力した名前に なってしまいます・・・どうしてでしょうか? 山田 田中 佐藤 鈴木 村上 山本 裏山 田山 小島 島々 これだけの名前を先頭から順番に入れて, printf("%s",P.first->name); printf("%s",P.first->->next->name); printf("%s",P.first->->next->next->name); ・ ・ 10個とも島々になってしまいます・・・何故でしょうか? 一番簡単なリスト構造で先頭に入れるプログラム作っていただきませんか? ちなみにPはfirstを含む構造体です。firstは構造体NAMEへのポインタで、 最初first=NULLです。 name,nextはNAMEのメンバーです。
>866 Windowsの話だろうから、環境依存OKスレが良いと思う。 >867 >10個とも全部最後に入力した名前に >なってしまいます・・・どうしてでしょうか? そうなるようにプログラムしているんだろうとしか言えない。 >一番簡単なリスト構造で先頭に入れるプログラム作っていただきませんか? 丸投げなら宿題スレへ。 添削して欲しいならコードを晒す。
winAPIって何が出来るようになるの?
>>870 お前みたいなクズをプログラムに寄せ付けないことが出来るようになる
>>871 すみませんでした。
ちゃんと調べてきます。
873 :
デフォルトの名無しさん :2011/04/16(土) 18:37:30.92
>>868 晒したくはありません・・・
どうしてもです。何故なら名簿作りの課題なんですが全部コード書くといろいろ
クラスメートとかに知られたら嫌だからです。
考えられるミスとしては、名前の保存を配列ではなくchar*としてるからかもしれません・・
何か原因はありますか?
逝け
名前読み込むときに静的配列に読み込んでから name = buffer; とでもしてるんだろ
>>873 じゃあその考えられるミスを検証することだな
例えば %s で char* の中身を表示する代わりに %p で char* のアドレスを表示してみるとか
エスパーをご所望のようです
>>873 お前が組んだようにしか動かないからどこにも間違いなんか無いよ
>>873 >考えられるミスとしては、名前の保存を配列ではなくchar*としてるからかもしれません・・
間違いなくそれだよ原因は。
解ってるなら直せよ。
やべーやべーw
コードって量産しちゃいかんだろ
>>883 自然にそうなってしまいました。今、過去アップしたファイルを積んでいるフォルダをのぞいてみると、ファイル数は 300 超えています。
いろいろとコメントをいただいて修正した最終版ばかりなのですが、そうなっています。
つかクラスメイトに知られるのがイヤだから晒さないとかw 普通他人の組んだコードなんて興味ねーよwわざわざコピってググって笑おうなんてヒマな奴の集まりなのかお前の学校はw
もっと何かの役に立つソフトウェアを作れよw 勉強用の小規模なプログラムを300個作ったってそれが何なんだよw
課題質問してる時点でどうなの?
>>886 うん、それはそうなんですね。
お題をみつける能力は、これはこれで一つの能力なんですが、私にはそれは欠けているんでしょうね。
というか、宿題スレでちゃちゃっと 100 行ぐらいのコードを書いて結構満足してしまっているというか。
今、個人的なお題は、「クライアントはプリントスクリーンを定期的におこなって、サーバーに送り込む」という奴です。
なんとかスクリーンキャプチャできるようになりました。32bit DIB section はつかえる奴だと認識しました。
お前の日記帳じゃないから
>>888 悪質なウィルス作ってるようにしか聞こえないんだが
ウイルスでもつくるのか
欠落してるのはお題を見つける能力だけじゃないよね。 「クライアントはプリントスクリーンを定期的におこなって、サーバーに送り込む」 ならそこからどう膨らませていくか、それも欠落してる。 作ったら作りっぱなしなんだろ。 プログラマ全体の8割が何を作ったら良いかわからない奴等。 残った2割のうちの8割が作ったものを膨らませかたを知らない奴等。 そこで残った奴等のうちのまた8割がろくでもないデバッグに追い回され退屈な雑プログラムに従事していて 最期に残った2割が真に目的をもって道を切り開いてゆく奴等。
>>890 さすがにウィルスは無理ですね。まず OS の穴をみつけないと。
いや、最近は、winny にのっけてユーザーにクリックさせる手合いもウィルスとかよぶそうですが、そうなのならウィルスのレベルも落ちましたね。
>>892 >そこからどう膨らませていくか
今ひとつイメージがわきませんが、たとえば IPv6 に対応させちゃる、とかサーバー側はマルチクライアントにする、とか、伝送路中は暗号化・圧縮化・HTTP にのっけて
ファイヤーウォール超え、とか、そういうのを「膨らませる」、というのでしょうか?
いまいち「膨らませる」がよくわかりませんが、よろしければ、ひとつ。
せめてVNCの真似事くらいのものは作ってみるとかさ
クライアントはプリントスクリーンを定期的におこなって、サーバーに送り込む のが目的の人なんていない それを使って何ができるのかってことでしょう 自分もうまい案は浮かばないが「日々の作業記録が画像として自動で残ります」っていうソフトにするとか やりたいことが決まると次に実装する機能も見えてくるし
>>897 >それを使って何ができるのかってことでしょう
つまりそういう事だよね。
勉強用の小規模なプログラムを300個作ったってそれだけじゃ
ただ積み重なっただけで他の誰の役にも立たないクズプログラムだ。
味見のためだけの料理を繰り返し作るようなもん。
つまり
>>894 は「この肉へのコショウのフリ加減が絶妙〜」とか言ってるだけなんだよね。
客のテーブルに載せるひとつの皿として完成していない。
もしくは皿ごとにバラバラで、カップルの特別な夜に華を添えるディナーのコースとして出来上がっていない。
なるほど。 となるとマーケティングとかマーチャンダイジングとか、その手の頭の回し方も必要、ということですね。 コード書きながら考えときます。
>>900 職業プログラマ? それとも単に趣味グラマ?
UU
モリタポ有償スレから出てくんなよw
>>901 趣味です。だから「売れる」という要素はあまり考えてこなかったのです。皆さんのお話は参考になります。
>>905 マは開発屋でマーケティング、マーチャンダイジングが解るわけないだろ
料理のメニュー、値段はマが決めるんじゃないからな。マは言われたものを作るだけ
日本に多い下請け会社は売れるもののマーケティング、マーチャンダイジングなんて禄に出来ない
から下請けやってるんだか(言われたものを基本的に作るだけ)。
それが出来るなら自社ソフト製品を開発して売りまくっている。
Test
>>904 このスレの先で見たコードがかなり異次元でわろた、こんなもんコンパイル通る訳ねーだろw
>>907 趣味でやっており、皆に使ってもらえるフリーソフトを作ることを目標としています。現在はそのための体力づくりの日々です。
「売れるかどうか」という極めて難しい目標は当面考えませんが、「使ってもらえるかどうか」くらいなら手が届きそうですし、この問題もマーケティングに含まれそうな気がします。
職業でなさるときはマーケティングまでは考慮することはないのですか?とすると、フリーソフトを作るときには、規模は別にせよ実は、より経営に近い、幅広い思考が要求されるのですね。
体力づくりなんてやるよりとっとと作ってみるのが一番だけどな と、中学の頃から7年くらい入門本を卒業出来なかった俺が言ってみる。
ほっほっ
>873 >晒したくはありません・・・ >どうしてもです。何故なら名簿作りの課題なんですが全部コード書くといろいろ >クラスメートとかに知られたら嫌だからです。 再現する最低限のコードを公開しなよ。原因も絞れるから、それだけで バグが取れることもある。 宿題スレへ丸投げでもいいが、問題を晒す必要があるぞ。
情報を小出しにしてバグを取ってもらおうなぞ虫の良すぎる話だ。 東電の隠蔽体質とおんなじだぞ。 問題の箇所を特定するためにプログラムは全部呈示してもらう必要がある。 自分の思っていたのとは全く別の場所での間違いが遠く離れた場所でバグ として出てくる事は良くある事だ。
915 :
デフォルトの名無しさん :2011/04/17(日) 10:33:23.30
事情を知ってる人には既にばればれだろうなw
もう女性アイドルのスレで教えてもらってんだから良いだろw
917 :
デフォルトの名無しさん :2011/04/17(日) 11:43:17.07
2011-11-02 23:16:35<>abc<>131325 日時・ID・パスワードで上記の書式が各行に1行づつありまして、これが100万行あります 日付は↑の通りで各桁は2桁固定、IDとパスワードは半角英数字の小文字のみ これらを日時順の若いのを上にソートしたいのですがどのようなソートが効率よいでしょうか?
俺はマージソートが好き
>>916 実は例の小池里奈スレは俺が個人的にナビゲートロックしているスレだった
本当に偶然だけど、しかし何をやってるんだよあのアホどもは
>>917 日付をtime_tの配列に変換してそれでqsort() or std::sort()ソートすればいいですね
構造体にぶち込むといいと思います
そしてそのポインタの配列を作ってそれをソートすればデータの移動に掛かる時間が
大幅に削減出来ます
>>918 データが多すぎてメモリに入り切らない場合は外部マージソートが一番高速ですが
それでもメモリ内でソートするのにくらべるとひどく時間がかかりますね
どの程度のデータ容量になるのか計算してメモリ内で済むならそちらの方がいい
100万件ならバブルソートじゃ問題あるの?
まとめてDBへぶん投げてクエリ投げてデータ返してもらう方が圧倒的に早いよ
>>924 100万件でバブルソートやってみろよ
気が遠くなるぞ
だからDBに任せろって
>>925 DBを持ってる環境の人かどうか分からないし、DB機能を備えているコンパイラ
エディションは最上位クラスになるし、ちょっとその答えはどうかと
>>928 バカジャネーノ?
MySQLだってPostgreSQLだって無償で配布されてんだしべつに考える必要ないだろ。
行が増えたり、特定の条件で検索するなんてのも楽になる。
>>917 100万行を一度読み込み、
日付とデータ位置情報の配列を作る。
日付でソートする。
ファイルのデータ位置を読み込み、出力する。
こんなとこかな?
質問の題意に従えよ。 どんなソート方法か聞いてんだから
ソート方法よりも、IOの方で時間がかかるんじゃないかな?
>>931 だからSQLでソートさせる方法が最善だっての。バカかお前は。
SQLのソートが速いわけがない あほか
ニヤニヤ コードでマスかきたいだけなのか、ソートした結果が欲しいのかはっきりしろよw。
in place merge sortなるものでいいんじゃないの?
速度はメモリ上では、自作 > STL > DB ディスク使用では、自作 > DB だろう。 STLにディスクを使用するソートやmapはない。
SQLは、大規模データ、汎用データ、同時アクセスなどを実現するために速度は遅い。
>>939 ほう、で?その汎用なアプリに勝てるだけの速度のものをお前はひょいと小手先で作れると?
クラスの概念も無い標準のCで。
941 :
917 :2011/04/17(日) 12:30:04.19
データはファイルに記録されてます。 データはファイルの終端に追記される形で増えていくのですが、必ずしも日時順で追記されるわけではないのでソートしたいと思っている次第です。 記録はファイルベースですがソートするときだけデータベースのほうが早いのであれば、作業するときのみデータベースに入れてソートすることも検討したいと思います 記録自体はファイルベースで行います
>>941 それなら、最初からDBに格納がよいかと
データベースの使い方間違えてるぞ。 ソートするだけの為に、遅いデータベース使うなよ。
宣伝くせえ
>>928 > DB機能を備えているコンパイラエディションは最上位クラス
どういうこと?
年単位でファイル分割とかしたら
インサーションソートが正義 安定じゃないソートは全て欠陥アルゴリズム
つーか日曜日に2ちゃんに集ってる奴等がどんなに頭ひねったところで いわゆる標準的に知られているサーチの方法以上に効率のいい方法なんて出て来るわかないだろ。 検索だけで一本の論文が書けるほどのテーマだっつーのに生半可が考えてどうなるもんでもなかろううが。
大規模なソートなら、たとえば100ギガ = 20メガ*5000個と分割して 各20メガをメモリ上でソートしてディスクへ書き出す。 あとはキャッシュを効かせて、5000個をマージしていく。
2ちゃんで聞いてるんだから、生半可が考える程度で十分
ボゴソートでいいじゃん
>>951 さすが日曜日に集まってきただけはあるよね。
サーチじゃなくてソートの話だ。
>>956 他人の揚げ足取る時だけは元気だな。有益なコードは何一つ提示しないくせに。
そうか?今回の内容でソートコマンドを使う以外にいい策はおもいつかなんだよ。 コードを書いてたらまだソートできてないかもしれないけど。。
それよりも揚げ足って。まさかの釣りじゃない宣言か。
>>957 自分は有益なコードを提示してるような口ぶりだな。
「これ電源切った方が早くないっすか?」(「大捜査線THE MOVIE3ヤツらを解放せよ!」より) 人間はとかく目の前の問題に注目するあまり事を難しく考え過ぎて ついつい最も簡単な解決策を見逃しがちだ。
そんなあなたにライト、ついてますか?
チーズなら俺が食ったよ
つまり効率のいいソートのプログラムを考えるより ソートしないで済む方法を取った方が解決の早道だったりするわけだ。
>>965 >"%04d-%02d-%02d %02d:%02d:%02d %s %s"
惜しいw
SQLServer2008で3秒
ありゃ <> ってスペースじゃないのか
sortコマンドで実行したら、 4.72 seconds
windowsのsortってどんなアルゴリズムなんだろう cygwinのtimeで計ったらユーザCPU時間が0.016sだった cygwinのsortだと59sくらいかかってる
>>972 2chのdatファイルも<>がデリミタ。昔はよく見たデリミタだったように思う。
乱数に時間食うだろうと速くしてみた。
#include <stdio.h>
#define FILENAME "pass.txt"
#define MAXRAW 1000000
#define MAXCOL 128
unsigned int rand_xor() { static unsigned int t, x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;t=x^(x<<11); x=y; y=z; z=w; return w^=(w
>>19 )^t^(t
>>8 ); }
void strgen(char *str, char base, int haba) {
unsigned int x,n;
haba++;
for(n=0; n<6 +rand_xor()%8 ; n+=6) {
x=rand_xor();
str[n+0]=base+x%haba; x>>=5; str[n+1]=base+x%haba; x>>=5;
str[n+2]=base+x%haba; x>>=5; str[n+3]=base+x%haba; x>>=5;
str[n+4]=base+x%haba; x>>=5; str[n+5]=base+x%haba; }
str[n]=0; }
int main(){
FILE *fo = fopen(FILENAME, "wb");
unsigned int i,x,year, month, day, hour, minute, second;
char id[MAXCOL], pass[MAXCOL];
for (i = 0; i < MAXRAW; i++) {
x=rand_xor();
year=2001+x%10; x>>=4; month=1 + x%12; x>>=4;
day=1 + x%31; x>>=5; hour=x%24; x>>=5;
minute= x%60; x>>=6; second= x%60; x>>=6;
strgen(id,'a', 'z'-'a'); strgen(pass,'0', '9'-'0');
fprintf(fo, "%04d-%02d-%02d %02d:%02d:%02d<>%s<>%s\n", year, month, day, hour, minute, second, id, pass);
}
fclose(fo);}
速くする対象が違うわろた
postgresqlが10秒くらい@そこそこの仮想マシン
メモリに乗らない量でやらないと、ソートの工夫する意味ねえだろ。 最低でも1ギガはないと。 これ位だとアルゴリズムの有意差がはっきりする。
% time sort -t \< -k 1,1 in.txt >| /dev/null sort -t \< -k 1,1 in.txt >| /dev/null 25.17s user 0.16s system 100% cpu 25.315 total % time psql -d test_database -c 'select * from c_81 order by login_time' -o /dev/null psql -d test_database -c 'select * from c_81 order by login_time' -o /dev/nul 4.75s user 0.28s system 27% cpu 18.384 total ソートコマンドこれであってる?
ところでcの関数の一覧が載ってるリファレンスみたいな辞書が一冊欲しくなったんだけど 何かオススメ無いかな?
982 :
デフォルトの名無しさん :2011/04/17(日) 18:57:53.30
>>979 優位性は目的を決めないと意味をなさないだろ
いつぞや円周率の計算が速い CPU が「優位」だよという皮肉があったように
>>975 了解
しかし単純にqsort使うと馬鹿遅いな
time_tでソートしてるだけなのに
全部メモリに読み込んで、strcmpでqsortするプログラムで $ time ./a pass.txt > out.txt real 0m1.978s user 0m1.295s sys 0m0.124s だった
>>985 えらく速いな
Core i7かい?
データが全部2次キャッシュに乗ってるとか
>>987 このスレで出てる時間は
ソートだけの時間ではなく
time,timeitなどで計測する入出力も全部含めた
プログラム起動〜終了の時間だと思うよ
ディスクに書き込むまでの時間で計れよ。
>>945 のそ〜太2は書き込み終了まで古いPCで17秒。
>>988 それは簡単に改造できるけど、ソートに時間が掛かりすぎると思う
今の環境はqsortのルーチンをDLLに置いてあって呼び出すので
システムコールの時間が掛かりすぎるのだと思う
静的リンクすればかなり速くなると思うけどそれでも0.1秒とかはないぜ
DLLも静的も大差は出ない。 実質的に内部のアルゴリズムが遅いだけ。 むしろ頻繁に使うものはDLLからロードした方が速い可能性あり。 OSのキャッシュやHDDのキャッシュに乗っているかもしれないので。
LIBもDLLも(HDD)ディスクのデータをメモリマップドファイル使って擬似的にロードしているだけのはず。
じゃあなんで
>>987 が遅いんだろう?
0.1秒とかとても出ないぜ
読み込みの部分は十分に速いけど実行時半の大半はqsort()だよ
原因がわかりました 読み込みに失敗しており、全てのtime_tが0になっていました こんな状態でqsort()を使うと最悪の結果になります デバッグします
そもそも "%04d-%02d-%02d<>%02d:%02d:%02d<>%s<>%s" ではうまく読み込みませんね 正規表現の機能なんてないんだから
>>993 timeじゃ計れないのでtimeGetTimeに置き換えたけど
40〜50msだったよ
次スレ立てます
1000 :
デフォルトの名無しさん :2011/04/17(日) 20:27:13.15
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。