C言語なら俺に聞け(入門編)Part 81

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の*入門者*向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 80
http://hibari.2ch.net/test/read.cgi/tech/1299649237/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 147代目
http://hibari.2ch.net/test/read.cgi/tech/1301553333/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
★ぬるぽ。

長くなりそうなコードはcodepadに貼り付けてもいいでしょう
http://codepad.org/
2デフォルトの名無しさん:2011/04/03(日) 04:42:59.86
なぜかC#スレに立てろと来たので立てました
依頼者は心のそこから詫びて自殺してください
3デフォルトの名無しさん:2011/04/03(日) 04:59:58.05
※スレが荒れるので、◆QZaw55cn4cは書き込み禁止です
4デフォルトの名無しさん:2011/04/03(日) 05:03:13.79
>>1-2
ツンデレたん。乙

がっ
5デフォルトの名無しさん:2011/04/03(日) 09:37:49.52
>>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 が未解決です。


7デフォルトの名無しさん:2011/04/03(日) 10:30:27.59
typedef struct hoge{
...
} hoge_t;

のように書いているサイト様が多いのですが、この"_t"はtypedefの意味ですか?
8デフォルトの名無しさん:2011/04/03(日) 10:34:34.81
>>6
VisualStudioスレへ。恐らくC++としてコンパイルされているんでしょう。

>>7
単に「type」かと。
9デフォルトの名無しさん:2011/04/03(日) 10:42:02.38
了解しました
そちらのスレで聞いてみます
10デフォルトの名無しさん:2011/04/03(日) 10:43:57.87
>>8
ありがとうございます。
11デフォルトの名無しさん:2011/04/03(日) 18:57:22.76
ポインタについて分からないので教えて下さい。

int *t; int s;

t=&s;

とすると

tとsが表すアドレス番地は一緒ですか?

printf("%u",&t);@
printf("%u",&s);A

@Aは一緒ですか?
12デフォルトの名無しさん:2011/04/03(日) 19:02:56.57
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 あいこ
16デフォルトの名無しさん:2011/04/03(日) 19:46:36.40
(user - cpu + 3) % 3
17デフォルトの名無しさん:2011/04/03(日) 20:52:53.02
ありがとうございます3を足したら良くなりました
18デフォルトの名無しさん:2011/04/03(日) 21:17:16.50
数学で言う余りと % 演算子の違いに引っかかったか
19 ◆QZaw55cn4c :2011/04/03(日) 21:53:13.65
>>18
すうがくでいう余りは、除数、被除数のいずれかが負のときは文脈定義だし、 C の % も、最小非負剰余であるか絶対値最小剰余であるか、あるいはそれ以外になるかどうかは(仕様書にははっきり書かれていないが)処理系依存だった記憶があります。
20デフォルトの名無しさん:2011/04/03(日) 21:55:38.95
関数プロトタイプの利用価値を教えてください。
21 ◆QZaw55cn4c :2011/04/03(日) 22:04:35.32
>>20
一つのプログラムがを複数の c ファイルで構成されるときに威力を発揮します。
22デフォルトの名無しさん:2011/04/03(日) 22:12:21.80
a.outとa.exeの違いって何ですか?Cygwin使ってます。

a.outって何でしょう?

実行ファイルがtの場合

t a.outとするのでしょうか?
23デフォルトの名無しさん:2011/04/03(日) 22:33:22.16
>>22
>a.outって何でしょう?
コンパイル時の伝統的な出力先

>実行ファイルがtの場合
>t a.outとするのでしょうか?
a.exeなら「t a.exe」で実行するのか?
なら、それで良いと思われ
24デフォルトの名無しさん:2011/04/03(日) 22:33:31.63
配列ってのが具体的に良く分かりません。

配列を表すときは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でもいいんですよね?

26デフォルトの名無しさん:2011/04/03(日) 22:49:24.04
char型の計算で-1とか-3とか-の数字はないのでしょうか?
27 ◆QZaw55cn4c :2011/04/03(日) 22:55:47.28
>>26
signed char ならありうると思います。
単に
char c;
と宣言したときに、signed char、 unsigned char のどちらになるかは、処理系依存だったはずです。
28デフォルトの名無しさん:2011/04/03(日) 22:58:10.52
環境依存だからコンパイラのマニュアル見れ
29 ◆QZaw55cn4c :2011/04/03(日) 23:00:55.53
>>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でもないので不可です。
30デフォルトの名無しさん:2011/04/03(日) 23:06:43.39
>>25
aはassemblerのa
ぶっちゃけunixつーかリンカができる前の遺物
31デフォルトの名無しさん:2011/04/03(日) 23:07:38.24
>>25
>a.outのaは何を表すのですか?
ttp://ja.wikipedia.org/wiki/A.out%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88

>a.exeのaは実行プログラムの名前ですから
>t.exeでもk.exeでもいいんですよね?
t.outでもk.outでも構わんぞ
32デフォルトの名無しさん:2011/04/03(日) 23:19:33.33
>>29
charって文字型ですよね。

char s[]={'0','1','2,'3'};として
sの文字を出力すると
char整数 0 1 2 3に対応する文字コードの列が出てくるんですか?
DEFGみたいに。
33デフォルトの名無しさん:2011/04/03(日) 23:58:10.94
ポインタって何が難しいの?
34デフォルトの名無しさん:2011/04/03(日) 23:58:25.43
>>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]); /* ←文字として出力 */
  }
}
35 忍法帖【Lv=7,xxxP】 :2011/04/03(日) 23:59:26.52
初期化値のある配列の要素数を自分で数えるのは下策。
int array[] = {1, 2, 3,};
と言った要領で書けばいい。
36 ◆QZaw55cn4c :2011/04/03(日) 23:59:34.83
>>32
試してみました。
http://codepad.org/8oBxBbVn
37デフォルトの名無しさん:2011/04/04(月) 00:02:16.50
>>34
string型ってありませんか?

%sとすると文字列が出てきますよ?
38デフォルトの名無しさん:2011/04/04(月) 00:02:49.68
文字列リテラル内のシングルクォートを
バックスラッシュでエスケープするのは
間抜けに見えるな。
39デフォルトの名無しさん:2011/04/04(月) 00:04:10.38
>>37
>>34
>string型ってありませんか?

ねぇよ。
>%sとすると文字列が出てきますよ?
だから何?
40デフォルトの名無しさん:2011/04/04(月) 00:05:38.06
>>39
文字型はある事の証明。
41 ◆QZaw55cn4c :2011/04/04(月) 00:07:37.24
>>37
string 型というのは厳密には c にはありません。
printf の %s は、
与えられた数値を特定のアドレスとみなし、そのアドレスから先にいずれ '\0' が格納されているアドレスがあるものと仮定して、
与えられたアドレスから '\0' が格納されているアドレスまでのあいだのアドレスの内容を(文字を示すものと仮定して)全部表示する、
というだけです。

これを文字列型、というのなら、あるいはそう考えていいかもしれませんが、巷の言語の「文字列型」と比べると制限がいろいろときついのです。
42デフォルトの名無しさん:2011/04/04(月) 00:09:06.43
>>40
16進数型とか8進数型もあるんだね?
43 ◆QZaw55cn4c :2011/04/04(月) 00:09:12.66
>>38
ご指摘感謝。
44デフォルトの名無しさん:2011/04/04(月) 00:09:49.02
>>41
つまり文字型があるとまた違った事ができるんですね。
45デフォルトの名無しさん:2011/04/04(月) 00:13:34.31
だから、文字列型なんてねぇってば。
書式指定子には%%もあるんだ。
まさか、こいつをパーセント文字型なんて言う訳ないだろが。
46 ◆QZaw55cn4c :2011/04/04(月) 00:15:22.28
>>44
文字列型なる変数に自由に文字列を代入したり、文字列と文字列を連結したり、
といったことは、C では制限付き、いいかえるといろいろと下工作した上でやっと可能になります。
java や ruby の文字列型のようには C は自由にはできません。

だから「C には文字列型はない」と考えたほうが無難です。
47デフォルトの名無しさん:2011/04/04(月) 00:17:35.25
>>45
理解しました^^
48デフォルトの名無しさん:2011/04/04(月) 00:42:18.15
C言語においてはmain引数を設定する時は、必ずint main(int argc, char *argv[])の形じゃないと
だめなんですか?

int main(int 3 , int t )とかint main(int argc, char *argc, float argt)
とかだめなんですか?
49デフォルトの名無しさん:2011/04/04(月) 00:47:08.26
>>48
そもそも、その引数を、どうやってmain()に与えるつもりだ?
50デフォルトの名無しさん:2011/04/04(月) 00:52:24.81
>>49
端末のコマンドラインから入力します。
どのサイトでもint main(int argc,char *argv[])となってた。
デフォですか?
51デフォルトの名無しさん:2011/04/04(月) 00:52:42.72
>>48
あなたがどのように書いたところで、
mainの外からやってくる引数が変わるわけではありませんよ
52デフォルトの名無しさん:2011/04/04(月) 00:59:49.04
mainが引数取るって何かメリットあるんですか?
53デフォルトの名無しさん:2011/04/04(月) 01:02:49.80
int t;

t='3';

t=3;

t="3";

は全部可能ですか?
54デフォルトの名無しさん:2011/04/04(月) 01:04:16.18
>>50
main() はコマンドラインから直接呼ぶ為の物ではなくて、
プログラム実行のお膳立てをしている OS さんが呼ぶ為の
インターフェイスだから、形式は固定です。

プログラムが実行されたら直ぐに main 関数が実行されると
思うかもしれませんが、実際には main が呼び出される前に
メモリの用意やライブラリのロード等、沢山の処理が実行
されます。
55デフォルトの名無しさん:2011/04/04(月) 01:05:07.83
>>52
どんな内容のプログラムを作りたいかによって、
プログラムの外から引数を与えたいこともありますし、
そんなことをする必要がないこともあります
56デフォルトの名無しさん:2011/04/04(月) 01:05:21.63
>>53
>t='3';
可能です。t には '3' という文字の文字コードが入ります。
>t=3;
可能です。t には 3 が入ります。
>t="3";
不可能です。
57デフォルトの名無しさん:2011/04/04(月) 01:14:53.30
>>56
int t;

t='3';

printf("%d",t)=??

それとも
int t;
t='3';
printf("%c",t)=??


??には何が?
58デフォルトの名無しさん:2011/04/04(月) 01:15:04.32
>>56
嘘はイカンぜよ

>t="3";
"3"へのポインタをint型にキャストした結果が入ります。
59デフォルトの名無しさん:2011/04/04(月) 01:17:10.90
>>56
文字の文字コードって何でしょう?
文字=文字コードですか?
'3'の文字コードは3?
よく分かりません。
60デフォルトの名無しさん:2011/04/04(月) 01:17:13.51
>>57
printf()に代入は出来ません。
出力結果という意味なら両方「3」が表示されます。
61デフォルトの名無しさん:2011/04/04(月) 01:23:51.53
>>59
'3'の文字コードが何なのか分からなくても問題ありません。
数値を表示したいときに"%d"を指定する。
文字コードを表示したいときに"%c"を指定するなど、ルールを覚えて下さい。

int t;
t = 3 + 3;
printf( "%d\n", t ); // 6が表示される
t = '3' + '3'; // 文字コード同士を足しても意味のある値にはならない
printf( "%c\n", t ); // 何が表示されるか分からないので↑はやっちゃ駄目
62デフォルトの名無しさん:2011/04/04(月) 02:09:15.80
文字コード同士の足し算に意味を持たせることもできるけどな
63デフォルトの名無しさん:2011/04/04(月) 03:06:01.70
C言語を書くときに、なぜみんな拡張子をcにするんだろう?
別にオブジェクト指向っぽく書かなかったとしても、
とりあえずcppにしておけば、少なくともコメントで//が使えたり
変数の宣言が自由な位置で出来たり、bool型やデフォルト引数使えたり
純粋に言語の機能があがって良いと思うんだけどな。
64デフォルトの名無しさん:2011/04/04(月) 03:11:51.07
>>63
当然知ってると思うけど、大抵の C コンパイラなら // コメントとか
自由な変数の位置とかサポートしてるんだぜ
65デフォルトの名無しさん:2011/04/04(月) 03:20:29.04
>>63
.cpp にするくらいなら .m の方がマシだわあ。
わざわざスマフォで使えないマニアック言語を使う理由は無いね。
66デフォルトの名無しさん:2011/04/04(月) 03:30:57.47
>>64
もちろん知ってるが、//コメントを書くたびに心にちくっとこない?
gccだと-ansiオプションでコンパイル出来なくなるし、変数宣言も
正確にはc99仕様であってfor(int i = 0;;)という表記は出来ないしね。
67デフォルトの名無しさん:2011/04/04(月) 03:33:10.43
俺は C99 を前提に書いてるから何の問題も無いよ。
もう直ぐ C1X も来るしね。
68デフォルトの名無しさん:2011/04/04(月) 03:33:31.58
わかるわ
拡張子をcで書いているくせに // コメント使ってるソースコードは
お前移植性のためにc言語にしているんちゃうんかと問い詰めたくなる
69デフォルトの名無しさん:2011/04/04(月) 03:38:50.98
しかし現実問題、C99は使われてないよな
・MSのVisual StudioはC99非対応(というかC++のみ対応でC言語すらない)
・gccを前提にしているプロジェクトは、C99どころかgcc拡張使いまくり(関数内関数とか)
・一般的なLinuxのオープンソースのコードはANSI-C完全準拠

C99で書くくらいならC++かANSI-Cにしろと思うけど。何の意味があるの?
70デフォルトの名無しさん:2011/04/04(月) 03:42:55.89
>>63
ベターCっすか
糞ですね
71デフォルトの名無しさん:2011/04/04(月) 03:43:14.00
>>68
21 世紀になってまで // コメントを使えないコンパイラを使ってるなんてお気の毒様。
ちなみどのコンパイラ使ってるの?
72デフォルトの名無しさん:2011/04/04(月) 03:43:30.73
>>69
gcc拡張よりGNU拡張が一般的な言い方だ。

よく「C99で書いてます」とか言うやついるけど、
ただのGNU拡張だったりすることは多いよな
何がC99の機能で何がGNU拡張か理解していない奴がほとんど。
>>67みたいなやつなw
73デフォルトの名無しさん:2011/04/04(月) 03:44:21.63
>俺は C99 を前提に書いてるから何の問題も無いよ。
wwwwww
74デフォルトの名無しさん:2011/04/04(月) 03:44:48.58
>>72
見えない敵と戦うのはさぞ大変だろうな。毎日ご苦労。
75デフォルトの名無しさん:2011/04/04(月) 03:47:17.14
>>71
お前みたいなやつがMSの独自拡張に拍車をかけるんだろうな
76デフォルトの名無しさん:2011/04/04(月) 03:48:14.59
>>74
地獄のみさわさん、C99前提お疲れ様ーっす
77デフォルトの名無しさん:2011/04/04(月) 03:48:20.13
>>75
残念ながら君の脳内の敵とは違うようだ
78デフォルトの名無しさん:2011/04/04(月) 03:50:04.26
ベターCってどこがクソなのかね?
79デフォルトの名無しさん:2011/04/04(月) 03:50:46.65
まあ何にせよ .cpp は無いわ。
C との互換性は無くなるし、わざわざ過去の言語と心中する必要は無い。
80デフォルトの名無しさん:2011/04/04(月) 03:54:00.69
>>79
別にその意見は否定しないけど、
2行目が思いっきり矛盾してる気がするんだけどw
81デフォルトの名無しさん:2011/04/04(月) 03:57:25.94
>>80
君の中ではそうなんだろうな。そんな貴重な情報をわざわざ知らせてくれてありがとう。
82デフォルトの名無しさん:2011/04/04(月) 03:57:47.53
ちょっとしたプログラムでcpp拡張子でベターCを書くのは特に問題ないんじゃない?
上にもあったけど、C99だとfor文の中での初期化が出来ないのがイケてないから
それだけのためにcppにすることがある
83デフォルトの名無しさん:2011/04/04(月) 04:03:32.92
ないな。
84デフォルトの名無しさん:2011/04/04(月) 04:07:02.67
ないという奴は論拠がないな
85デフォルトの名無しさん:2011/04/04(月) 04:14:28.70
>>82
>C99だとfor文の中での初期化が出来ないのがイケてないから
>それだけのためにcppにすることがある

?

http://en.wikipedia.org/wiki/C_syntax#Iteration_statements
86デフォルトの名無しさん:2011/04/04(月) 04:16:28.56
>>85
言いづらいけど、馬鹿なのを隠して口出さないでくれない?
87デフォルトの名無しさん:2011/04/04(月) 04:21:11.56
>>82
>C99だとfor文の中での初期化が出来ないのがイケてないから
>それだけのためにcppにすることがある

?

http://infocenter.arm.com/help/topic/com.arm.doc.dui0472c/BABBGFGB.html
88デフォルトの名無しさん:2011/04/04(月) 04:22:49.03
>>82
よく勘違いされるが、for文の中での変数宣言はc99では出来る。
gccでは出来ないんだが、最近のだと-std=c99オプションをつければ出来るはず。
GNU拡張とc99をごっちゃにするやつが多いのはこういうgccの挙動のせいなんだよな。
89デフォルトの名無しさん:2011/04/04(月) 04:23:42.91
>>86

??
90デフォルトの名無しさん:2011/04/04(月) 04:24:00.74
>>87
言葉も書けない馬鹿だって自己紹介は1度で十分です^^;
91デフォルトの名無しさん:2011/04/04(月) 04:26:53.26
>>88
知らなかった。GNUはデフォルトでC99だと思ってた。サンクス
92デフォルトの名無しさん:2011/04/04(月) 04:28:57.54
>>82
>C99だとfor文の中での初期化が出来ないのがイケてないから
>それだけのためにcppにすることがある

?

http://gcc.gnu.org/c99status.html
> new block scopes for selectionand iteration statements
93デフォルトの名無しさん:2011/04/04(月) 04:32:03.31
>>90

で?
94デフォルトの名無しさん:2011/04/04(月) 04:32:07.41
C99で書く奴氏ねよ
95デフォルトの名無しさん:2011/04/04(月) 04:32:47.22
gccはそもそもC99を完全サポートしてないからな
96デフォルトの名無しさん:2011/04/04(月) 04:33:45.11
>>93 お前晒しあげられてんだよ、ちょっと黙ってろ
97デフォルトの名無しさん:2011/04/04(月) 04:34:12.95
結局 better C とか言ってる奴は C を知らないだけなんだよな・・・
98デフォルトの名無しさん:2011/04/04(月) 04:34:57.00
>>97
むしろC++とCの境界線をしらない、というのが正しい気がする
99デフォルトの名無しさん:2011/04/04(月) 04:36:15.83
>>96
悔しいのうw
100デフォルトの名無しさん:2011/04/04(月) 04:37:19.64
cppを否定する材料が出てないんだけど。
101デフォルトの名無しさん:2011/04/04(月) 04:38:20.21
>>98
ああ、確かに C だけじゃなく C++ も知らないという可能性もあるね
102906:2011/04/04(月) 04:38:51.64
前スレで&&(||)演算子に関する質問をしていた者です。

>>908
>初心者は余計なこと考える必要はない
確かにそうかもしれませんね。初めのうちは、こういうことを
考えなくても知らなくてもプログラミングに支障はなさそうですし。
でも、いつかこういうことを意識する時が来るかな? と思って
今のうちに質問してみました。

>>909
規格で決められていること、丁寧に教えていただきありがとうございました。
条件演算子の評価順序についても参考になりました。
103デフォルトの名無しさん:2011/04/04(月) 04:38:57.13
gccしか使えない猿のC++拒絶反応が出てるだけだろ
104デフォルトの名無しさん:2011/04/04(月) 04:39:49.07
最終的にCに落とし込む
プロトタイプとしてのベターCならありだけど
最終的にcppなのにベターCってのはありえないなー
困惑するだけでしょ・・・
105デフォルトの名無しさん:2011/04/04(月) 04:40:20.60
多分 ◆QZaw5 5cn4c がコテ外してファビョってるんだろ
106デフォルトの名無しさん:2011/04/04(月) 04:44:16.60
>>104
クラス使ってたら許す、とかそんな感じ?
107デフォルトの名無しさん:2011/04/04(月) 04:45:19.26
>>104
俺もそう思うわ。どっちの言語のプログラマにとってもメンテし辛いコードが出来るだけ。
108デフォルトの名無しさん:2011/04/04(月) 04:50:54.77
C99だとfor文の中での初期化が出来ないのがイケてないと思い込んでいたから
それだけのためにcppにしてた人はC++と手が切れてよかったね!
109デフォルトの名無しさん:2011/04/04(月) 04:58:41.88
>>106
サジ加減はどうでもいいよ。
ただ、携わる人が不満を抱く事無く
明確な規則が設けられるのかと考えたとき
厳しいでしょって話。
110デフォルトの名無しさん:2011/04/04(月) 05:04:04.88
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文の中の初期化は今はやめておけ。
111デフォルトの名無しさん:2011/04/04(月) 05:08:28.33
つまり Google や Mozilla の C++ のコーディングガイドでは例外を使う事を禁じているから、
C++ で例外を使ったコードを書く奴はゴミ扱いされる訳か

それはそれは大変ですなあw
ご苦労様なこってす
112デフォルトの名無しさん:2011/04/04(月) 05:09:45.05
いや、普通にC++で例外使う奴はゴミじゃないか?
113デフォルトの名無しさん:2011/04/04(月) 05:10:32.62
そか、じゃあ仕方ないねw
114デフォルトの名無しさん:2011/04/04(月) 05:12:54.29
論点がずれてるんだよ
・一人で書く分にはcppでもC99でもおk
・多人数のプロジェクトの場合はベターC的cppとかGNU拡張にないC99とかやめておけ
これだけの話だろ
115デフォルトの名無しさん:2011/04/04(月) 05:14:51.76
>>63
結論(>>114)が出たみたいだぞ。良かったな。
116デフォルトの名無しさん:2011/04/04(月) 05:15:45.06
>>110
とはいえ
C99でしかコンパイル出来ないプロジェクトもあるよね
楽なのは分かるけどそこを耐えて頑張って欲しいねぇ

>>111
for文の初期化式での宣言のみ可
それ以外はすべて不可
というベターC コーディング規約に比べたら天国ですね
117デフォルトの名無しさん:2011/04/04(月) 05:22:18.46
Cスレでする話題じゃないな
どっか他所行ってやってくれ
118デフォルトの名無しさん:2011/04/04(月) 07:36:36.01
良く出てくるスコープという用語はどういう意味ですか?
コンパイルとまた違うんですか?

119デフォルトの名無しさん:2011/04/04(月) 08:24:36.96
寿命を伴った有効範囲
120デフォルトの名無しさん:2011/04/04(月) 09:36:04.64
ランタイムライブラリってC言語のコードで記述したり呼び出したり
する必要ないのですか?
121デフォルトの名無しさん:2011/04/04(月) 09:38:40.15
C++プログラマはC99やC1Xが憎くて仕方ない。
C++と互換性が無いから(でも、どこに互換性が無いかは知らない)。
だから何かと難癖付けてC99の普及を妨害しようとする。
122デフォルトの名無しさん:2011/04/04(月) 09:41:32.80
C言語にも規格とかあるんですね。そもそもC言語環境を提供するのはOsですか?
それともコンパイラですか?
123デフォルトの名無しさん:2011/04/04(月) 09:42:33.24
>>121
お前がそう思うんならそうなんだろう、お前ん中ではな
124デフォルトの名無しさん:2011/04/04(月) 09:44:18.24
ぶっちゃけ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) だけで
それでたいていのサイトがこれで書いている
126デフォルトの名無しさん:2011/04/04(月) 09:47:40.33
>>124
でもオープンソースで採用されてない!不思議!

まぁぶっちゃけ、GNUでデフォルトの挙動がC99になった瞬間に
C99が普及してC90は終焉だと思うけどね。
あとVisual StudioはそもそもC言語をサポートしていない。C++のみ。
それでC99をサポートしないというのはちょっとフェアじゃない。
127デフォルトの名無しさん:2011/04/04(月) 09:48:51.13
Visual Studio人気ですねぇ。
128デフォルトの名無しさん:2011/04/04(月) 09:55:20.12
というか世の中にgccとVisual Studio以外にコンパイラなんてあるんだろうか

bcc?メール?
129デフォルトの名無しさん:2011/04/04(月) 09:56:54.25
>>128
bccは良いんじゃないですか?
130デフォルトの名無しさん:2011/04/04(月) 09:58:21.26
>>129
まぁ実際のところbccは環境が良いですね。後はIntel Cとかかな。
bccはC++対応してC99非対応、Intel Cは部分対応(正式対応予定)
流れとしてはC++かC99か片方という感じなのかな
131デフォルトの名無しさん:2011/04/04(月) 09:59:10.13
数値計算屋はiccを好んで使うよ
最近はgccも速いけどね
132デフォルトの名無しさん:2011/04/04(月) 10:00:20.50
Visual Studioってcshやbash可能ですか?
133デフォルトの名無しさん:2011/04/04(月) 10:07:19.20
LLVMってCコンパイラーなんでしょうか?
134デフォルトの名無しさん:2011/04/04(月) 10:08:56.77
C99で採用されたrestrictに相当する定義を
C++で行うことは可能?
135デフォルトの名無しさん:2011/04/04(月) 10:12:56.09
gccにバージョンとかありますか?
136デフォルトの名無しさん:2011/04/04(月) 10:20:13.96
>>135
あります。詳しくはgccスレへ。

>>134
コンパイラによってはC++でも処理系拡張でrestrictをサポートしています。

>>133
いいえ。

>>132
質問が意味不明です。VisualStudioスレへでも行きやがれ。
137デフォルトの名無しさん:2011/04/04(月) 10:20:19.44
自作コンパイラとか作る人いたら天才だな。
138デフォルトの名無しさん:2011/04/04(月) 10:29:28.42
>>136
シェルスクリプトしたいんですよ。
139デフォルトの名無しさん:2011/04/04(月) 10:44:04.33
>>138
スレ違い。とっとと失せろ。
140デフォルトの名無しさん:2011/04/04(月) 10:47:58.43
>>139
何だとっ!?!?志を持った若者だぞ俺は。
141デフォルトの名無しさん:2011/04/04(月) 10:49:37.24
それではその志を以って、シェルスクリプトとCの入門との関係を詳らかにしていただこうか。
142デフォルトの名無しさん:2011/04/04(月) 10:55:46.14
あーあー!ヽ(`Д´)ノ!!
143デフォルトの名無しさん:2011/04/04(月) 11:02:45.59
C99とかなんかいろいろあるんですね
初心者の場合は何を使えばいいのでしょうか?
今はVC++ 2010 Expressを使ってます
144デフォルトの名無しさん:2011/04/04(月) 11:09:22.11
VC++ 2010
145デフォルトの名無しさん:2011/04/04(月) 11:37:11.11
基本的な図形などの描写をプログラムを兼ねて勉強したいので
Xwindowsを利用したいんですが、Windows7上では無理ですか?
cygwinも使ってます。Unixをダウンロードしないとだめでしょうか?
146デフォルトの名無しさん:2011/04/04(月) 11:45:08.20
>>143
何も考えずにそのまま使っていればよいよ。知っているに越したことはないけどね
147デフォルトの名無しさん:2011/04/04(月) 11:55:23.51
>>145
tcl tk windowsで検索してみたら?
148デフォルトの名無しさん:2011/04/04(月) 12:12:10.46
>>145
cygwinにもXWindowのpkgは含まれているから利用はできるよ。
でも、今時XWindowを生のまま使うのもナンセンスだけど。
詳しくは、cygwinスレ辺りで。
149デフォルトの名無しさん:2011/04/04(月) 12:13:24.16
>>147
環境がごっそり変わるのはちょっと・・・
あくまで自分が利用したい範囲で・・
150149:2011/04/04(月) 12:21:33.38
>>148
ありがとうございます。スレ移動します。宿題なんで仕方ないです・・
151デフォルトの名無しさん:2011/04/04(月) 12:32:42.51
プログラミングが好きじゃなくていやいや宿題やるようなら今すぐ学校やめろ
152デフォルトの名無しさん:2011/04/04(月) 12:39:05.41
>>151
義務教育でいやいや宿題したことがない奴なんていないぞw
153デフォルトの名無しさん:2011/04/04(月) 12:42:53.35
>>137
どこのウォルターブライトだよ
154デフォルトの名無しさん:2011/04/04(月) 13:03:06.72
義務教育でプログラミングなんてねえよ
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 で通るぞ
156デフォルトの名無しさん:2011/04/04(月) 15:15:39.00
ブラウザのフォームのインプットエリアにカーソルがあるかどうか判定するのはどのような関数を使うのでしょうか?
用途はjavascriptでペーストが禁止されているページに文字列をプログラムでタイピングする為です
コマンドラインで動作させるのは無理でしょうか?
GUIじゃないと無理ですか?
157デフォルトの名無しさん:2011/04/04(月) 15:30:29.95
>>154
オレ30歳だけど中学の技術でN88BASICやったぞ
学校によるんじゃね?
158デフォルトの名無しさん:2011/04/04(月) 15:39:58.11
中学でプログラミングやってる奴はどんだけ頭良いんだよ。
あまりにも専門用語多くて挫折する。
159デフォルトの名無しさん:2011/04/04(月) 16:52:19.05
160デフォルトの名無しさん:2011/04/04(月) 17:07:32.98
>>159
「これ」ってどれ? やりたいことを具体的に書いてくれ。
161デフォルトの名無しさん:2011/04/04(月) 17:11:24.01
>>159
フラクタル画像なら再帰呼出が楽
162デフォルトの名無しさん:2011/04/04(月) 17:36:42.69
Cライブラリのパスを確認するシェルコマンドってどうしたらいいですか?
例えば"stdio.h"とかprintf関数のパスを調べたいです。
163デフォルトの名無しさん:2011/04/04(月) 17:38:28.39
>>162
環境によって違うし、入門レベルでやることでもないし、Cとも直接関係ないのでお使いの環境スレにでも逝きやがれ。
164デフォルトの名無しさん:2011/04/04(月) 20:30:44.82
環境めんどくさいよねー
プログラマーとしてはあんまり意識したくないところだよね
SEさんちゃんとしてくださいなと言いたいところなのだが
SEは総じて丸投げ体質だったりする
165デフォルトの名無しさん:2011/04/04(月) 20:50:37.19
まともな丸投げならまだいいんだけど
たのむから数学的に破綻した要求だけはやめてくれ
166デフォルトの名無しさん:2011/04/04(月) 21:01:05.86
方程式をC言語で書くとどうなるの?
167デフォルトの名無しさん:2011/04/04(月) 21:12:07.51
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

すいませんが、宜しくお願い致します
168デフォルトの名無しさん:2011/04/04(月) 21:14:31.03
>>167
バイトオーダーとかエンディアンとかで調べるといいよ
169デフォルトの名無しさん:2011/04/04(月) 21:17:58.69
http://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspxの日本語ページをどなたか教えてください
170167:2011/04/04(月) 21:21:59.68
>168
リトルエンディアンでしたので、それで逆(00 00 00 01ではなく)で出力されたのですね
ビッグエンディアンへの変換を試みてみます
大変ありがとうございました
171デフォルトの名無しさん:2011/04/04(月) 21:25:26.56
リトルインデアンな環境で 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 値として取りだしたい要求であれば、自前で並べ替えとかを行うんだ
172デフォルトの名無しさん:2011/04/04(月) 21:26:58.96
次に00 00 00 01を読み込んだら1にならないとか言い出しそう
173167:2011/04/04(月) 21:35:09.66
>171 >172
あー、バイナリエディタで直接見てるのがいけないのですね
freadしたときには(01 00 00 00)を(00 00 00 01)として読み込める、ということでよろしいでしょうか
お手数おかけして申し訳ないです
174デフォルトの名無しさん:2011/04/05(火) 06:09:06.28
>>173
fwrite()で書き込んだデータは同じ環境であればfread()で正常に読み込める。
エンディアンを気にする必要があるのは、他の環境へ移植した場合など。
※同じ環境であれば実際に書き込まれたデータの形を気にする必要はない
175167:2011/04/05(火) 13:19:38.94
>174
なるほど、わかりました
これからはエンディアンのことも覚えておくようにします
ご丁寧にありがとうございました
176デフォルトの名無しさん:2011/04/05(火) 13:35:33.06
>>16
すいません何故3を足さないと-1になるのでしょうか?
何度もgoogle電卓で計算しても(user - cpu) % 3で全てのパターンで-1になることはありませんでした
177デフォルトの名無しさん:2011/04/05(火) 13:40:43.60
>>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
ポケコンでゲームを作って遊んでいます
ゲームの移動手段としてカーソルキーを使いたいのですが、そのプログラムがわかりません。
誰かヒント下さい・・・
182 ◆QZaw55cn4c :2011/04/05(火) 18:13:46.31
183デフォルトの名無しさん:2011/04/05(火) 19:33:58.42
難しくてよくわかりませんでした
184デフォルトの名無しさん:2011/04/05(火) 19:49:52.04
西日本も福島原発の放射能に曝される。

4/7 予測 http://up3.viploader.net/ippan/src/vlippan198234.jpg
発表はドイツ気象庁 http://www.dwd.de/
185デフォルトの名無しさん:2011/04/05(火) 21:31:50.11
ポインタのポインタの宣言って
なぜポインタ宣言子を2つ重ねるのでしょうか?
どんなけ繋がってても単に「アドレスを格納する」だけなのに。
186デフォルトの名無しさん:2011/04/05(火) 21:37:25.64
2次元の配列を無理やり1次元で考えようとしてるようなもん
187デフォルトの名無しさん:2011/04/05(火) 21:43:27.71
unsigned int と unsigned long の違いを教えてください。
188ビル・ジョブス:2011/04/05(火) 21:44:53.11
>>185
ポインタが指し示しているものがポインタだからさ
毎回キャストして使うなら環境に応じて別にunsignedとかでもいいんだよ
しかしプログラムが読みにくいだろ?
189デフォルトの名無しさん:2011/04/05(火) 21:46:08.41
>>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について聞きたいわけじゃないよな?
191デフォルトの名無しさん:2011/04/05(火) 21:50:09.96
>>185
格納している値の違い

int型へのポインタ
格納された値はアドレスで、そのアドレスにはint型が格納されている。

int型へのポインタのポインタ
格納された値はアドレスで、そのアドレスにはint型へのポインタが格納されている。
192ビル・ジョブス:2011/04/05(火) 21:51:04.36
>>189
それは間違ってないが解釈の方向性がちょっと違う
193ビル・ジョブス:2011/04/05(火) 21:54:13.62
添削しといてやるよ
△格納された値はアドレスで、そのアドレスにはint型へのポインタが格納されている。
○格納された値はアドレスで、そのアドレスにはint型を指すアドレスが格納されている。
194デフォルトの名無しさん:2011/04/05(火) 21:56:28.27
>>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 ということでしょうか?
197デフォルトの名無しさん:2011/04/05(火) 23:10:41.83
>>196
何に対して16bitとか32bitとか言ってるのか分からんが、
CPU・メモリに関係なく、各環境によってintやlongなどのビット幅が定義されている
198デフォルトの名無しさん:2011/04/05(火) 23:13:11.64
すみません。例えばCPUが16bit ならunsigned int や unsigned long はもてないということでしょうか?
199デフォルトの名無しさん:2011/04/05(火) 23:16:28.04
>>198
持てるけどなんで?
200デフォルトの名無しさん:2011/04/05(火) 23:17:57.74
何度も申し訳ありませんが、
16bitでunsginede long をもった場合2バイトになるのでしょうか?

16と32bitで何で持ち方がかわるのかがよくわからないのです。
201デフォルトの名無しさん:2011/04/05(火) 23:26:30.88
>>200
C言語を使う限りCPUのビット数なんて気にする必要はない
intもlongも、そのコンパイラで定義されたバイト数で構成される
202デフォルトの名無しさん:2011/04/05(火) 23:28:53.49
>>201
なるほど。よっぽど古いコンパイラでもunsinged long くらいは定義してますよね?
そういうのって、コンパイラのマニュアルかなにかみればよいのでしょうか?
203デフォルトの名無しさん:2011/04/05(火) 23:30:17.40
サイズが知りたければsizeof使えばいいだけのような
204デフォルトの名無しさん:2011/04/05(火) 23:31:53.52
>>203
簡単に確認できる環境でもないので・・・
205デフォルトの名無しさん:2011/04/05(火) 23:36:26.87
>>204
どの程度古いかにもよるが、ANCI(C89)に準拠してれば大丈夫
それ以前なら、マニュアル読むか、開発元に問い合わせるか
206デフォルトの名無しさん:2011/04/05(火) 23:38:44.60
>>205
ANSIに準拠していれば、unsigned int = unsigned long だと思っていいわけですよね?
207デフォルトの名無しさん:2011/04/05(火) 23:40:28.84
>>206
違うよ
208デフォルトの名無しさん:2011/04/05(火) 23:40:42.37
>>206
sizeof(unsigned short) <= sizeof(unsigned int) <= sizeof(unsigned long)
を満たしていることは期待していい
209デフォルトの名無しさん:2011/04/05(火) 23:41:54.28
>>208
short < longを忘れたら誤解しかねない
210デフォルトの名無しさん:2011/04/05(火) 23:42:12.99
>>208
そういうことですか・・・
211デフォルトの名無しさん:2011/04/05(火) 23:42:21.15
>>206
>どの程度古いかにもよるが、ANCI(C89)に準拠してれば大丈夫

>なるほど。よっぽど古いコンパイラでもunsinged long くらいは定義してますよね?
に対する回答
大きさは>>201なのでマニュアルに載ってなかったり、問い合わせできなければ>>203
212デフォルトの名無しさん:2011/04/05(火) 23:56:10.83
>>209
そんなルールないだろ
213ビル・ジョブス:2011/04/06(水) 00:16:33.27
なぜ、unsigned int と unsigned longについて知りたいか処理系も含めて質問してもらえますか?
214デフォルトの名無しさん:2011/04/06(水) 00:27:27.95
データ長が大事な場合は、char/short/longを使う
215デフォルトの名無しさん:2011/04/06(水) 00:31:10.28
何が大事なのか(メモリ量or1バイト==8bit)にもよるな
216デフォルトの名無しさん:2011/04/06(水) 00:37:51.89
>>212
俺の勘違いだった
K&Rの読み杉らしい
217デフォルトの名無しさん:2011/04/06(水) 00:52:46.25
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演算子の評価結果はあくまでバイト数かと
219デフォルトの名無しさん:2011/04/06(水) 01:06:12.80
>>218
>sizeof演算子の評価結果はあくまでバイト数かと
sizeof(char)は仕様に準拠してれば常に1なんだが?
220デフォルトの名無しさん:2011/04/06(水) 01:06:54.55
64bit CPUの場合は複数あるでよ
221ビル・ジョブス:2011/04/06(水) 01:07:33.89
>>219
その1の単位は何ですか?
222ビル・ジョブス:2011/04/06(水) 01:14:13.12
>>220
コンパイルオプションでも変わりますかね。long doubleとかも12バイトとか16バイトとか。
64bit CPUネイティブのコード生成した場合、longは8バイトが主流かもしれませんね。
223デフォルトの名無しさん:2011/04/06(水) 01:14:32.88
>>221
>sizeof演算子の評価結果はあくまでバイト数かと
の意図は?
224デフォルトの名無しさん:2011/04/06(水) 01:19:26.47
仮令何bitあってもsizeof(char)は1
225デフォルトの名無しさん:2011/04/06(水) 01:24:25.35
常にUTF32だけを使うならcharが32bitでも誰も困らないな
226デフォルトの名無しさん:2011/04/06(水) 01:25:12.90
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は原則としてコンパイル時計算される演算子で、式もしくは括弧で括った型指定子を与えるとその大きさをバイト単位で返す。
228デフォルトの名無しさん:2011/04/06(水) 01:32:22.20
>>227
ちゃんとよめ
>厳密な大きさはsizeof (char)が1であることを除いて標準に定められていない。
229デフォルトの名無しさん:2011/04/06(水) 01:33:03.44
>>227
char が 1 バイトってのは定義

何bitあるかは limits.h でも眺めてろ
230デフォルトの名無しさん:2011/04/06(水) 01:33:30.15
だから、sizeof charは1であると定義されているの
231ビル・ジョブス:2011/04/06(水) 01:33:33.94
だから、charが32bitなら だろ?
その特殊な処理系はsizeof char==4を返すべきだろ?
232デフォルトの名無しさん:2011/04/06(水) 01:35:10.27
コテを変えても馬鹿は直らんよなw
233デフォルトの名無しさん:2011/04/06(水) 01:36:03.70
>>227
堂々と間違うなよ
>組込型の大きさは処理系定義となっており、厳密な大きさはsizeof (char)が1であることを除いて標準に定められていない。
って書いてあるだろ?
CHAR_BITが8でも32でも、sizeof(char)は常に1で、C言語ではそれを1バイトと呼ぶ
234デフォルトの名無しさん:2011/04/06(水) 01:36:54.55
malloc に sizeof(char) を書いてないコードを追認するために
仕方なく汚い限定があるというだけ

それに合わせてコードを書くのは美しさの観点から本末転倒
235デフォルトの名無しさん:2011/04/06(水) 01:37:16.40
最小単位は8bitの方が楽な気がするけど
CPUによっては最小単位が違うことがあるみたいだし
236デフォルトの名無しさん:2011/04/06(水) 01:37:30.60
>>231
お前のところではcharが9bitのマシンでsizeof(char)が1.1ちょっとを返すのか?
237デフォルトの名無しさん:2011/04/06(水) 01:41:20.19
Cだとビットフィールドで逃げる手もあるけど
238デフォルトの名無しさん:2011/04/06(水) 01:42:11.61
>>236
先生、charが9bitでshortが12bitのマシンでsizeof(short)が1.3ちょっとを返してくれません。
239デフォルトの名無しさん:2011/04/06(水) 01:47:34.82
>>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なんて標準じゃサポート無いだろうし色々無理あるだろうな。
243デフォルトの名無しさん:2011/04/06(水) 01:58:39.02
2のべき乗じゃないこと考えるほうが
244ビル・ジョブス:2011/04/06(水) 02:03:41.84
色々と後付けする暇なやつが居るよな〜感心するよな。
245デフォルトの名無しさん:2011/04/06(水) 02:05:14.05
>>239
何かのネタで、そんな環境があるってみた記憶があるけど、間違いかもしれん。
ただ、そのネタの中でshortで12bitになってて、規格満たしてねーじゃんって思ったり
charが9bitなのに、他の型が2のべき乗になってて、sizeofは?って思ったりしたので、
そんな環境があることも確からしい。(幸か不幸かあたったことないけど)
246ビル・ジョブス:2011/04/06(水) 02:12:31.13
char 9bitだとするとアドレッシングして9bit出してくるのか・・
intが倍の18bitだとすると18bit出すかマルチプレクサでバスサイクル2回回して出すのか・・
char 12bitマシンとか組込み用途向けに結構実用的かもしれんな・・しかし周辺デバイスが手に入らないな・・
少しがっかりした。
247デフォルトの名無しさん:2011/04/06(水) 02:20:53.50
NECのメインフレームが1バイトが9bit
つか36bit機
Cコンパイラももちろんある

でも実際に組んだことはないからsizeofがどうなるかはわからんのだよなぁ
248ビル・ジョブス:2011/04/06(水) 02:23:24.13
ま、完全64bit CPU時代に向けてchar 16とか32bitになる布石なんだろうな。
今でもバイト単位のアドレス線なんて無くてレジスタ内部シフトで実現してるけど、
メモリを8bit単位でちまちまアクセスされちゃオーバーヘッドが大きすぎるしな。
ただ1byteが16とか32bitになるのは少し抵抗あるな〜。
249デフォルトの名無しさん:2011/04/06(水) 02:25:45.40
>>247
構造体のパディングと同じで切り上がると予想
って36bit機だと、そのまま普通に表せるのか
まぁ、大昔は3の倍数が流行ってたから、8進数とか、その名残だね
250ビル・ジョブス:2011/04/06(水) 02:33:20.84
>>247
あ!!!大昔ワードマシンって呼んでたよ!変なbit長のマシン!
Cコンパイラなんてあるんだ・・ってなきゃ困るよな。
C言語は中坊の頃PC-8801のCP/Mで覚えたんでスッカリC言語=バイトマシンの感覚なんだよね〜。
251デフォルトの名無しさん:2011/04/06(水) 02:38:01.59
>>250
そうか
お前はPDP-11を変なマシンというのか
252デフォルトの名無しさん:2011/04/06(水) 02:40:31.51
大昔のマシンの中身なんて知らないでしょ
253デフォルトの名無しさん:2011/04/06(水) 02:43:38.45
メインフレームのことをマシンと呼ぶ奴は本物を見たことがない奴だ
254デフォルトの名無しさん:2011/04/06(水) 02:45:54.44
ミニコンは見たことあるけど
255ビル・ジョブス:2011/04/06(水) 02:46:21.95
PDP-11知ってるよ。使った記憶は無いな。変なCP/MみたいなコマンドラインのVAXは触った事ある。よくハングしたな。
直ぐにSophiaのマシンに変わっちゃったけど。
256ビル・ジョブス:2011/04/06(水) 02:47:25.34
メインフレームってあれ淀物置だよなw キャビネットにしか見えんw
257デフォルトの名無しさん:2011/04/06(水) 02:47:42.58

International Business Machines
258ビル・ジョブス:2011/04/06(水) 02:48:40.82
IBM-3090 in JAL
259デフォルトの名無しさん:2011/04/06(水) 02:50:15.09
メインフレームって呼び方は、フジテレビで深夜やったアニメで初めて聞いた記憶が
260デフォルトの名無しさん:2011/04/06(水) 02:54:40.76
ACOSしか触ったことないけど、確かにホストと言っても、メインフレームとは、あまり言わないね。
でも、ホスト知らない人に対しては、メインフレームの方が通じる。
261ビル・ジョブス:2011/04/06(水) 02:55:18.48
昔の汎用機のCPUというか概念的にスタックエリアって無いのにサブルーチンコールとかしてたんだぞ
戻り番地をレジスタに格納してさw
262ビル・ジョブス:2011/04/06(水) 02:59:12.97
コントロールxxとかって呼び名で無限ループや保護違反起こすと淀物置の上にあった赤色灯が回るんだよw
確かにホストコンピューターという呼び名が当時中心だったような。
263デフォルトの名無しさん:2011/04/06(水) 07:22:07.20
ジジイ多そうだな
さすがC言語
264デフォルトの名無しさん:2011/04/06(水) 09:15:59.35
いずれ、ジジイになるのに
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] );
266デフォルトの名無しさん:2011/04/06(水) 09:37:42.48
共用体使えばいいじゃん
267デフォルトの名無しさん:2011/04/06(水) 09:41:41.57
*((ULONG*)dst) = src;
268デフォルトの名無しさん:2011/04/06(水) 09:54:27.68
この前ジャンケンを書いた者です
いろいろ書いて慣れていきたいと思いますが、ジャンケンのように初心者に向いたサンプルみたいなお題って何がありますか?
269デフォルトの名無しさん:2011/04/06(水) 10:22:11.41
ヒットアンドブロー
270デフォルトの名無しさん:2011/04/06(水) 10:32:01.07
おおおおもしろそうですね!作ってみたいと思います!
271デフォルトの名無しさん:2011/04/06(水) 11:02:45.20
マスターマインド
272デフォルトの名無しさん:2011/04/06(水) 11:31:33.44
ラーメンタイマー
273デフォルトの名無しさん:2011/04/06(水) 11:32:20.27
ラーメンタイマー(チキンラーメン対応晩)
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
ヒットアンドブローを書いてみました
ここを直したほうがいいなどのご指導お願いいたします
276デフォルトの名無しさん:2011/04/06(水) 11:36:40.47
それはヒットアンドブローじゃないw
277デフォルトの名無しさん:2011/04/06(水) 12:12:08.38
ラーメンタイマーまだ? もうお昼なのだが
278デフォルトの名無しさん:2011/04/06(水) 12:15:41.27
ラーメンタイマーってなんですか?
279デフォルトの名無しさん:2011/04/06(水) 12:42:52.66
>>274
ルールちがくね?
280デフォルトの名無しさん:2011/04/06(水) 12:45:00.16
>>278
三分計だろ
281デフォルトの名無しさん:2011/04/06(水) 13:06:09.34
あれ?4桁の数字を当てるゲームですよね?

>>279
それも作ってみたいですおもしろそうですね
282デフォルトの名無しさん:2011/04/06(水) 13:22:42.11
4桁の数字を当てるゲームだが、「ヒット」とか「ブロー」とか表示するはずだ
283デフォルトの名無しさん:2011/04/06(水) 14:47:06.04
長くなったのでコードパッドに張りました
アドバイスお願いします
http://codepad.org/qbJanJHD
284デフォルトの名無しさん:2011/04/06(水) 14:54:43.76
>>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;
}
286デフォルトの名無しさん:2011/04/06(水) 15:50:23.49
>>285
プログラムを先に起動しておいて、Enterでカウントダウン開始
で、0になったら、ブザーをならすのが使いやすいタイマー
あと、細かいことを言えば、time_tは1秒とは限らないし、
その仕様は、まれに何処かの1秒を飛ばすことがあるが、細かいことを気にしなければOK
287デフォルトの名無しさん:2011/04/06(水) 16:03:18.13
>>285
linuxでもコンパイルできるパッチあてた
http://codepad.org/2k3XPWbp
288デフォルトの名無しさん:2011/04/06(水) 16:11:17.82
>>284
日本語の言葉で考えるなら、そうなのだが、C言語としては、そう考えない
*演算子や()が色々と評価された結果
((int *)*)*p;

([int型へのキャスト] *(乗算) ) [ポインタp]
と解釈され、*(乗算)に右側のオペランドがないためエラーになる

書き方としては
int ***p; // int (*(*(*p)));と同じ
となり、解釈は、pはポインタで、その格納先はポインタで、その格納先はポインタで、その格納先はint型と考える
289デフォルトの名無しさん:2011/04/06(水) 16:15:28.31
>([int型へのキャスト] *(乗算) ) [ポインタp]
>と解釈され、*(乗算)に右側のオペランドがないためエラーになる
間違えた。
キャストがあって、左側のオペランドがないから、*は乗算ではなく、アドレス演算になり
*(アドレス演算)に右側のオペランドがないためエラーになる
290デフォルトの名無しさん:2011/04/06(水) 16:26:02.50
>>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;
}
292デフォルトの名無しさん:2011/04/06(水) 16:40:52.56
>>290
また、初心者をだまして、何が楽しいんだ?
time_tは数値型であることが保証されてるだけで、精度と単位は処理系依存
伝統的にUNIX Epochが使われることが多いだけ
293デフォルトの名無しさん:2011/04/06(水) 17:36:04.83
コンソールアプリケーションでもドラッグアンドドロップのソフトは
作れますか?
294デフォルトの名無しさん:2011/04/06(水) 18:17:06.75
windows の dos窓での話
ファイルを D&D でdos窓へもってった場合、そのファイルのフルパス名が文字列として渡されるから…
それなりには作れるんじゃね?

※ プロンプト上では↑の動作だが、実行ファイル実行中の標準入力にも適応されてるのかは未確認
295デフォルトの名無しさん:2011/04/06(水) 18:25:57.50
アイコンに対してのドロップなら普通に引数として渡される。
296デフォルトの名無しさん:2011/04/06(水) 18:30:50.34
入力値が偶数か奇数かを判断する練習問題が全くわからない・・・
本を読みながらやってるんだがorz
297デフォルトの名無しさん:2011/04/06(水) 18:41:17.28
>>296
入力方法が分からないの?
それとも、判定方法が分からないの?
298デフォルトの名無しさん:2011/04/06(水) 18:51:03.68
>>297
説明不足ですまない
判定方法がわからない;;
299デフォルトの名無しさん:2011/04/06(水) 19:13:22.44
2で割り切れるかどうか
余りを見るとよい
300デフォルトの名無しさん:2011/04/06(水) 19:19:13.16
ジャンケンとヒットアンドブローとラーメンタイマーは先輩方のお知恵を拝借して作る事ができました。
8年前に挫折して、6年前に初心者本を買ってみるも挫折して、2年前に初心者講座サイトを見て挫折して・・今回は初めてプログラミングが面白いと思えました。
他にも初心者向けのお題ってありませんか?
もしくはそういうネタを集めたサイトはありませんか?
301デフォルトの名無しさん:2011/04/06(水) 19:26:39.43
>>300
ヒットアンドブローの正解に使われる数値の条件
1〜9 で 0 は使用しない
同じ数字は2回以上使用されることはない
302デフォルトの名無しさん:2011/04/06(水) 19:42:04.75
>>285
メッセージ表示するだけじゃタイマーにならん
最後のメッセージを
printf("時間です!!\a\a\a");
に変更するよろし
303デフォルトの名無しさん:2011/04/06(水) 19:47:38.80
お前ら何でこんなに優しいのwww
304デフォルトの名無しさん:2011/04/06(水) 19:47:43.13
>>300
ではジャンケンとヒットアンドブローの戦歴をファイルに保存するように改良してみれ
ゲームでいうセーブファイルを作るのだ
305デフォルトの名無しさん:2011/04/06(水) 19:55:48.93
連射メーターでも作ってみては?
306 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/06(水) 19:59:37.82
あれだろ。数当てゲームだろ。

>数値を入力してください: 64
>正解はもっと小さい数です。
>数値を入力してください:

みたいな
307デフォルトの名無しさん:2011/04/06(水) 20:07:45.39
何故俺が文字列を扱うと毎回文字化けするんだ・・・orz
308デフォルトの名無しさん:2011/04/06(水) 21:07:49.63
>>305
それなんてシュウォッチ?
309謙虚フロンティア戦士:2011/04/06(水) 21:36:34.24
310デフォルトの名無しさん:2011/04/06(水) 22:07:17.95
セブンイレブンで山頭火のカップ麺買ってきたんだけど、想定外の事態が発生いたしました。
なんと、待ち時間4分なのだが・・・どうすんだよこれ・・・バリ堅で食えと? あ?
311デフォルトの名無しさん:2011/04/06(水) 22:45:35.26
ポインタの指す文字を確かめるプログラム
#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なんですが・・・
解説おねがいします
312デフォルトの名無しさん:2011/04/06(水) 22:54:32.19
++*av;と++**av;の違い
313デフォルトの名無しさん:2011/04/06(水) 23:05:41.32
>>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
315デフォルトの名無しさん:2011/04/06(水) 23:26:52.86
>>313
何が大丈夫なの?
駄目に決まってんじゃん
316デフォルトの名無しさん:2011/04/06(水) 23:27:46.67
>>312 詳しくお願いします 
317デフォルトの名無しさん:2011/04/06(水) 23:32:40.78
>>310
圧力鍋に入れて2気圧位にすれば3分でいけんじゃね?
318デフォルトの名無しさん:2011/04/06(水) 23:33:51.39
++*av;は'1'を指していたポインタを'2'を指すようにする
++**av;は*avが指している'2'に+1して'3'にする
319デフォルトの名無しさん:2011/04/06(水) 23:38:23.83
>>315
どこがダメなのか詳しく。
320デフォルトの名無しさん:2011/04/06(水) 23:41:52.79
while(〜〜〜){
if(クリックしたとき)
swich = 1;

〜〜〜〜〜〜〜

☆if(swich = 1) //クリックしたときしてほしい処理

〜〜〜〜〜〜〜

if(swich = 1)
swich = 0;
}


こんなプログラムでやっていると、クリックしてなくても☆の部分が暴発します

こういう書き方が悪いのでしょうか?それともここにない他が原因と思われるでしょうか?
321デフォルトの名無しさん:2011/04/06(水) 23:42:10.75
>>301
ご指摘ありがとうございます。
修正してみました。
http://codepad.org/RewCxQhV
322デフォルトの名無しさん:2011/04/06(水) 23:42:58.10
>>319
ヒント: end_time
323デフォルトの名無しさん:2011/04/06(水) 23:45:35.68
>>320
等号分が足りない
324デフォルトの名無しさん:2011/04/06(水) 23:47:13.18
>>304
ネタありがとうございます。
ジャンケンのほうで挑戦してみます
325デフォルトの名無しさん:2011/04/06(水) 23:49:49.32
>>322
>313のどこにend_timeに関する問題が?

って、なんだ。要は>313の触れていないend_timeの計算の仕方にケチつけているのか。
>291で言えば、end_time = time(NULL) + m;の代わりに
localtime_r()でstruct tmにばらしてtm_secにmを足してからmktime()でtime_tに戻せばOKだな。
326デフォルトの名無しさん:2011/04/06(水) 23:51:30.02
>>322
なるほどわかりました

if文の条件は=はダメってことですかね?
327326:2011/04/06(水) 23:52:06.97
安価ミスしちゃった(´>∀<`)ゞ

>>322>>323
328デフォルトの名無しさん:2011/04/06(水) 23:54:29.00
>>325
ケチじゃねーよ
>>313で「秒単位でさえなくても大丈夫」って謳ってるんだから
end_timeも直してなきゃ、駄目に決まってんじゃん
329325:2011/04/06(水) 23:56:48.10
おっと、localtime_r()はPOSIX拡張か。localtime()でやるべきか。

>>328
だから、>313はそこには触れてないだろ。って、私が言っても仕方ないんだけどw
330デフォルトの名無しさん:2011/04/07(木) 00:06:19.38
>>329
スレの流れ理解してないだけか
元々>>285に対して>>286>>290(一部間違いあり>>292参照)のレス
で、>>286>>290の対応が>>291とか>>302とか>>313の流れだから
>>313だけじゃ、駄目に決まってんじゃんって話だ
331デフォルトの名無しさん:2011/04/07(木) 00:06:25.51
>>323
完全に解決できましたありがとうございます
332デフォルトの名無しさん:2011/04/07(木) 11:38:51.75
>>304
ファイルの保存の仕方とか日時の使い方はうまく分からないのですがこんな感じで使い方あってますでしょうか?
http://codepad.org/IWIEKD3R
333デフォルトの名無しさん:2011/04/07(木) 12:16:07.83
今から学ぶとしたら C++0X と C1X のどちらがオススメですか?
334デフォルトの名無しさん:2011/04/07(木) 12:51:31.33
C++0x
335デフォルトの名無しさん:2011/04/07(木) 13:09:38.88
どっちも趣味言語以上のものにはなりそうにないけど
336デフォルトの名無しさん:2011/04/07(木) 13:18:32.55
何故?
337デフォルトの名無しさん:2011/04/07(木) 13:33:26.25
アホな質問で悪いけどスレタイの”俺”って誰?
俺って言う人いないんだけど どうすれば質問できるの?
338デフォルトの名無しさん:2011/04/07(木) 13:37:23.13
俺、俺、俺だよ俺
339デフォルトの名無しさん:2011/04/07(木) 13:44:33.63
俺って言う人いないのに、質問してるじゃないか
340デフォルトの名無しさん:2011/04/07(木) 13:51:00.90
デフォルトの名無しさんに決まってるだろ!
341デフォルトの名無しさん:2011/04/07(木) 13:58:14.50
Perl好き:C++0X
Python好き:C1X
342デフォルトの名無しさん:2011/04/07(木) 14:07:49.69
C言言吾ナょらイ奄Iニ聞レナ
343デフォルトの名無しさん:2011/04/07(木) 14:35:14.40
Ruby好き:Objective-C
344デフォルトの名無しさん:2011/04/07(木) 22:23:26.16
struct list *head;
〜〜〜〜
method_A(head);
int method_A (struct list* a){

}
この時3行目はアドレス渡しですか?値渡しですか?
345 ◆QZaw55cn4c :2011/04/07(木) 22:32:42.26
>>344
値渡し(call of value) であり、渡す値はアドレスです。これをアドレス渡しと仮にいうのであれば、>>344 は値渡しかつアドレス渡しになります。
値渡しの対義語は参照渡し(call of reference)ですが、C には厳密には参照渡しはありません。pascal や C++ にはありますが。
346デフォルトの名無しさん:2011/04/07(木) 23:22:57.81
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;
}
}

ここまで考えました。
347デフォルトの名無しさん:2011/04/07(木) 23:26:03.05
2行目の文章は

このa中の0をすべて右によせて

でした
348デフォルトの名無しさん:2011/04/07(木) 23:43:54.05
自己解決しました
349デフォルトの名無しさん:2011/04/07(木) 23:47:49.68
for(i = j = 0; i <= t; i++) if(a[i] != 0) a[j++] = a[i];
for(i = j; i <= t; i++) a[i] = 0;
350デフォルトの名無しさん:2011/04/07(木) 23:53:05.11
>>349
そんなに短くなるのれすか…
a[j++] = a[i]; ←これの意味を教えて下しい…
351デフォルトの名無しさん:2011/04/07(木) 23:56:42.09
あ、なるほど理解しました…

ちょっと感動しました…
352デフォルトの名無しさん:2011/04/08(金) 00:46:43.93
http://codepad.org/oEuwGGbu
fgets()を何回実行するか、またナル文字検出のプログラムを書いてみました
エラーがでる原因教えてください
353デフォルトの名無しさん:2011/04/08(金) 00:49:26.93
>>352
配列はポインタではないよ
354デフォルトの名無しさん:2011/04/08(金) 01:30:02.67
>>353 そうなんですか納得
    

28行目のエラーはどうしてですかね
355デフォルトの名無しさん:2011/04/08(金) 01:31:54.34
>>354
配列はポインタではないよ
356デフォルトの名無しさん:2011/04/08(金) 01:56:08.66
>>352
char s[11];
 ↓
char *s;

s[i]=m[i];
s=&(s[0]);
 ↓
s = m;
357デフォルトの名無しさん:2011/04/08(金) 07:14:19.27
_wfopenが使用可能かチェックする方法はありますか?
なければfopenに切り替えたいのですが。
358357:2011/04/08(金) 08:01:45.11
_wfopenが使用不可なら、
コンパイルの時fopen(とchar、string)へ切り替えたいのですが。
手間のかからない方法はどうやればいいですか。
359デフォルトの名無しさん:2011/04/08(金) 08:45:17.08
そも、_wfopen()とfopen()は完全に等価ではないんだからそれだけ切り替えても意味がないのでは?
360デフォルトの名無しさん:2011/04/08(金) 08:45:23.14
scanfの入力制限を、"%79s"といったリテラル数字を直接書くのでなく、BUF_SIZEを使って
BUF_SIZE - 1にしたいのですが、どのようにすればいいのでしょうか?

#define BUF_SIZE 80

char str[BUF_SIZE];
scanf("%79s", str);
361デフォルトの名無しさん:2011/04/08(金) 09:06:00.47
現実的でない一案。
#define BUF_SIZE (80)
char str[BUF_SIZE];
char format[20];
sprintf(format, "%ds", BUF_SIZE - 1);
scanf(format, str);
そも、scanf()を生のまま使うのは止めよう。
362デフォルトの名無しさん:2011/04/08(金) 09:49:30.27
>>361
d
363デフォルトの名無しさん:2011/04/08(金) 10:21:47.42
> #define BUF_SIZE (80)

その昔、「なぜ0を足しているんだろう」とか
「偽にしかならなさそうな式をなぜか if で見ている」といった
謎のコードが流行っていたが今やる奴っていかにも温室だな
364謙虚フロンティア戦士:2011/04/08(金) 13:52:18.48
#define LEN 79
#define FMT(len) "%##len##s"

char buf[LEN+1];
scanf(FMT(LEN), buf);

みたいな?
365デフォルトの名無しさん:2011/04/08(金) 14:08:54.56
main ()
{
Ni shi shui?
}
366デフォルトの名無しさん:2011/04/08(金) 14:10:59.15
byte str = new byte[100];
367デフォルトの名無しさん:2011/04/08(金) 14:11:40.18
byte[] str = new byte[100];
368デフォルトの名無しさん:2011/04/08(金) 14:16:42.05
newって何ですか(このスレ的に
369デフォルトの名無しさん:2011/04/08(金) 14:34:45.64
class とんきん : ジャップ
{


}

class おおさか : ジャップ
{




}
370デフォルトの名無しさん:2011/04/08(金) 14:43:47.80
C言語は永久に不滅です
371デフォルトの名無しさん:2011/04/08(金) 14:53:06.30
PHPでこう書くコードをCではどうやって書いたらよいですか?

class Test
{

public function a(){
return 'a';
}

private function b(){
return 'b';
}

public function(){
$this->b();
}

}
372デフォルトの名無しさん:2011/04/08(金) 15:03:08.36
コレクションって最強だね
ファイル使わなくてもこれで一通りの事ができる
373デフォルトの名無しさん:2011/04/08(金) 15:23:41.63
専ブラのMonoViewのようにコマンドラインで選択メニューみたいなのを作りたいのですが
どのようなキーワードで検索したらようのでしょうか?
374デフォルトの名無しさん:2011/04/08(金) 16:26:06.33
良く分からないんだけど
エスケープシーケンスコードって事?
375デフォルトの名無しさん:2011/04/08(金) 16:42:18.46
CUIのメニューは俺も20年以上前には良く作ってたが基本的に自力で作るものだと思ってる
ガンバレ
376デフォルトの名無しさん:2011/04/08(金) 16:57:53.47
えええええ
377( ̄ー ̄)ニヤリッ:2011/04/08(金) 17:44:31.62
378デフォルトの名無しさん:2011/04/08(金) 17:46:02.30
Д
379デフォルトの名無しさん:2011/04/08(金) 20:23:17.92
プロジェクトファイルを読み込めませんでした。指定されたエンコードに無効な文字があります。
と、表示されて先に進めません。文章は別のパソコンならビルト出来るのでソフトの設定自体に何かあると思うのですが、どうしたら解決できるでしょうか。

あと、スタートメニューからvisualstdioをドラッグ&ドロップしたらvisual studioのマーク(無限マーク)が表示されなくなってしまいました。どうしたら直るでしょうか?

本当に困っているので宜しくお願いします。
380デフォルトの名無しさん:2011/04/08(金) 20:43:53.24
>>379
VisualStudioスレへどうぞ
381デフォルトの名無しさん:2011/04/08(金) 22:56:00.63
>>373
curses
382デフォルトの名無しさん:2011/04/08(金) 23:09:53.13
>>381
ありがとうございます!!!!!!!!
でもVC++ 2010 Expressにはcurses.hが入っていませんでしたorz
せっかく教えていただいたのに申し訳ございません
383デフォルトの名無しさん:2011/04/08(金) 23:16:41.92
>>382
SetConsole〜
GetConsole〜
384デフォルトの名無しさん:2011/04/08(金) 23:29:05.02
>>382
getch
385デフォルトの名無しさん:2011/04/09(土) 01:32:44.71
http://codepad.org/p1P16jPw
文字入力してエンターキー押したら
Segmentation fault (core dumped)がでた 
なんで
386デフォルトの名無しさん:2011/04/09(土) 01:50:18.94
>>385
sの先を確保してない
ってかNULLのまま
387デフォルトの名無しさん:2011/04/09(土) 01:51:04.76
>>385
//strcpy(s,m);
s = m;
388 ◆QZaw55cn4c :2011/04/09(土) 01:54:38.43
>>385
>char *s;
>s=NULL;
>strcpy(s,m);
端的にいって、NULL にコピーできません。
このコードをみて、文字列型のある言語を触られたことがあるのかなと感じましたが、
s = NULL
で文字列を空に設定する、ということにはならないのです。
そもそも C には文字列型はありません。
389デフォルトの名無しさん:2011/04/09(土) 02:40:11.37
mallocやcalloc全く使わないと処理が遅くなったりするでしょうか?
390デフォルトの名無しさん:2011/04/09(土) 02:48:02.53
>>389
malloc を使わないってどういう事?
全部スタックにアロケートするという事?
それとも、mmap や sbrk を使うという事?

何で malloc を使わないの?
メモリリークが怖いの?

元々どういう処理で malloc を使っていたの?

みたいな疑問が湧いてくるから、3行以上で状況を説明しておくんなまし。
391デフォルトの名無しさん:2011/04/09(土) 10:51:40.24
質問者じゃないけどメモリリークは怖いです
392デフォルトの名無しさん:2011/04/09(土) 11:00:15.19
論理積がいまいちよくわかりません
0 & 0 は0
1 & 0 は0
0 & 1 は0
1 & 1 は0
0 & 10 は0
10 & 10 は10
http://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E7%A9%8D
wikiを読んで a & b のとき、 aとbが同じ数字なら 1(true)そうでないなら0(false)を返すって認識でよいでしょうか?
393 ◆QZaw55cn4c :2011/04/09(土) 11:03:07.91
394デフォルトの名無しさん:2011/04/09(土) 11:21:41.91
>>392
大体あってる
1bit目と1bit目、2bit目と2bit目って
bitごとに処理されるの
395 ◆QZaw55cn4c :2011/04/09(土) 11:21:46.82
>>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
396デフォルトの名無しさん:2011/04/09(土) 12:05:19.22
>391
1 & 1は 1だぞ。

>395
ワザワザ誤解しやすい'∧'なんて記号使わないでくれよ。
排他的論理和'^'と思って混乱したじゃないか。
397 ◆QZaw55cn4c :2011/04/09(土) 13:02:26.15
398デフォルトの名無しさん:2011/04/09(土) 14:23:56.85
>>396
コピペ厨を相手にすんなよ
399デフォルトの名無しさん:2011/04/09(土) 14:26:10.76
おじちゃんNEETなの?
400デフォルトの名無しさん:2011/04/09(土) 14:54:15.85
>>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
401400: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の時間量は一緒ですか?
403デフォルトの名無しさん:2011/04/09(土) 16:03:30.27
>>402
>int型は65536までだっけ?までは全部要領4バイトなんですか?
int型のサイズは環境依存。今は大抵は4バイト。その場合の表現できる値の範囲は、-(2の31乗)から(2の31乗-1)。
必要なら、sizeof(int)でサイズは得られる。

>charだとPPPPPは5バイト?
意味不明。sizeof(char)は常に1。文字列を表したいなら、配列を用意するなどする必要がある。

>後int型で3×3の時間量と、123×123の時間量は一緒ですか?
通常、全く一緒。
404デフォルトの名無しさん:2011/04/09(土) 16:08:03.52
取り扱える最大値は INT_MAX 容量は sizeof(int)

文字列 "PPPPP" だと終端の \0 まで欲しいので 6
文字の塊(だだし、文字列ではなく終端無し) PPPPP なら 5

コンパイラによる (が、整数リテラルの掛け算は同じになるだろう と予測される)
405デフォルトの名無しさん:2011/04/09(土) 17:38:10.40
>>404
>コンパイラによる (が、整数リテラルの掛け算は同じになるだろう と予測される)
コンパイラに依存するよりも、CPUに依存する。
例えば、9のロードと15129のロード時間が異なるCPUは想定できるが、それが異なるコンパイラの実装は考えにくい。
406デフォルトの名無しさん:2011/04/09(土) 17:51:20.50
402 は実行時間とは言っていない
407デフォルトの名無しさん:2011/04/09(土) 18:41:18.49
便乗だけど
たとえば
intを4バイトとすると
int a = 'PPPP';
とかってOKなの?
408デフォルトの名無しさん:2011/04/09(土) 18:48:50.07
エラーになるじゃね
409デフォルトの名無しさん:2011/04/09(土) 18:55:01.68
>>408
エラーにはならないよ。
410デフォルトの名無しさん:2011/04/09(土) 19:02:24.27
>>407
コードとしては問題ないな。
asciiの環境なら0x50505050が代入される。
問題は、a = 'abcd'としたときに0x61626364か0x64636261かは環境依存だと言うことだ。
411デフォルトの名無しさん:2011/04/09(土) 19:07:14.23
ここで、規格ではと、騒ぐ人が出てきそうだけど
412デフォルトの名無しさん:2011/04/09(土) 19:17:31.49
使い道がない == 意味がない
413デフォルトの名無しさん:2011/04/09(土) 19:29:12.49
全角で、
WCHAR ch ='あ';
とかしてるコードは見たことある。
414デフォルトの名無しさん:2011/04/09(土) 20:23:10.91
警告: 複数文字からなる文字定数
415 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/09(土) 21:47:46.91
test.c内部でしか使わない関数とtest.c内部に定義してて外部に公開したい関数があるとして、
プロトタイプ宣言はどこに書いたらいいんですか
内部でしか使わないやつはtest.c内に static void fuck(void);とかで
外部のやつはtest.hにextern void fuck2(void);と書けば良いんでしょjか
416デフォルトの名無しさん:2011/04/09(土) 21:49:56.47
>>415
それでいいけど、おれは関数にextern を書いたことがない。
417デフォルトの名無しさん:2011/04/09(土) 21:54:30.45
おおむねその方針でよろしいかと

もう少し規模が大きくなって
test.c だけじゃ見通し悪いからファイル分割したい test1.c test2.c ...
test1.c 〜 test2.c 相互利用したいけど内部関数がが test_local.h
外部公開したい関数 test.h
こういうことをやっちゃう
418 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/09(土) 22:04:05.92
わかりました
テーブルの定義とか#defineとかもその方針で良いんですねありがとうごじあsみあ
419 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/09(土) 22:08:06.31
もう一つ。
test.hにextern void fuck1(void); から extern void fuck10(void);まで
10個のプロトタイプ宣言があるとして、
外部からvoid fuck5(void);のみを使いたい場合にどうするのがいいんでしょうか
#include "test.h"とすることで何か無駄が生じないのでしょうか
単に外部の.cの先頭にextern void fuck5(void);とだけ書くほうがいいんでしょうか
420デフォルトの名無しさん:2011/04/09(土) 22:13:29.20
外部で使う関数は、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
421デフォルトの名無しさん:2011/04/09(土) 22:14:05.65
fuck5()を使う都度プロトタイピングするのは間が抜け過ぎているから、test.hをインクルードすればいいと思うよ。
もし、fuck5()だけを利用するソースが多いなら、test.hの分割を検討すべきときだ。
422デフォルトの名無しさん:2011/04/09(土) 22:14:53.39
>>419
ヘッダーファイルに10個全部プロトタイプ書いて、一個しか使わなくても
それをインクルードすればいい。
別にムダじゃない。
423デフォルトの名無しさん:2011/04/09(土) 22:17:15.54
関数宣言だけならオブジェクトファイルに影響は無いから #include でおk
コンパイル時間がやたら長くなるならそのときに考えればいい
424デフォルトの名無しさん:2011/04/09(土) 22:20:53.28
stdio.h を include するか
使用する標準関数のプロトタイプを個別タイプするか
425 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/09(土) 22:25:13.95
了解しました。#includeする方向で生きていこうと思います。ありがとうございました。
426ポインタ初学者:2011/04/09(土) 22:32:32.90
short(2バイト)型の変数を,上位1バイトと下位1バイトに分割し
char型の配列に代入したいのですが,どのようにすればいいのでしょうか?


ご教授よろしくお願いします.
427デフォルトの名無しさん:2011/04/09(土) 22:38:04.59
教授する気はないのでサンプルを提示。
short si = SomeValue;
char array[] = {(si >> 8) & 0xff, si & 0xff};
428デフォルトの名無しさん:2011/04/09(土) 22:40:50.50
x&255
(x>>8)&255
429デフォルトの名無しさん:2011/04/09(土) 23:31:49.60
共用体を使う
430ビル・ジョブス:2011/04/09(土) 23:34:07.17
補足、shortなどsignを含む変数を>>シフト演算子で処理すると、算術シフトが用いられ最上位bitを引きずります。
算術シフトの例)0x8001>>1→0xc000
この技をあえて使う事もあります。

unsignedの場合は論理シフトが用いられ最上位ビットにはゼロが補われます。
論理シフトの例)0x8001>>1→0x4000
よってシフト前にマスクするよりもシフト後にマスクした方がより安全なコードとなり得ます。
エンディアンが固定で分かっていれば、short型変数のアドレスをchar*でアクセスした方が実行速度は速いかもしれません。
431デフォルトの名無しさん:2011/04/09(土) 23:42:38.05
>>430
unsignedをシフトしたときの符号の扱いって環境依存じゃなかった?
432デフォルトの名無しさん:2011/04/09(土) 23:43:04.78
char x[]のとき

scanf("%s",&x[])

&はいらないんですか?
433デフォルトの名無しさん:2011/04/09(土) 23:44:08.15
そんな馬鹿な
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言語習得の近道は疑問のある処理のアセンブラ出力を見るに限るよ。
疑問が湧いたら、とにかくソースから切り出しアセンブラ出力で確認しよう。
コンパイラによっては>>演算子もコンパイラ内部サブルーチン呼んでたりしてクソ遅い時がある、そんな時はインラインアセンブラを駆使しなきゃならない。
アセンブラの知識は絶対に無駄にならないよ。
そうは言っても、アセンブラ見ても分からん時は分からんので、とりあえず動くのならまたいつか考えればいい。
その時は一瞬で分かる事もあるし。気楽に気長に継続は力なりけり。かな。
439デフォルトの名無しさん:2011/04/10(日) 00:40:07.69
コンパイルしながら動かすほうがいいような。反復練習
エラーが出たら、ダメって感じの人は向いてないかも
440デフォルトの名無しさん:2011/04/10(日) 00:51:06.14
マクロ名"EOF"に入っている値を教えてください
441デフォルトの名無しさん:2011/04/10(日) 00:52:31.80
>>440
-1
442デフォルトの名無しさん:2011/04/10(日) 00:56:16.28
End Of Fantasy
443デフォルトの名無しさん:2011/04/10(日) 01:15:26.95
昔は神経質な俺はパソコン向いてると思ったが、逆に神経質な性格だと
プログラミング向いてない事に気づいた。
444デフォルトの名無しさん:2011/04/10(日) 01:15:29.77
>>438
ある意味では正論ではあるが、それはアセンブラ→C言語経験ならまだしもC言語→アセンブラ経験は
大抵の人にとってハードルがかなり高いと思われ、かつC言語を使う大抵の人にとってアセンブラが
必要とされる機会はかなり低いと思われ。ちなみに私はアセンブラ→C言語経験ですけども。
445デフォルトの名無しさん:2011/04/10(日) 01:44:20.23
プログラムをVC++からリリースして公開してるんですが

逆コンパイルなどされてプログラムを見られることはありますか?
446デフォルトの名無しさん:2011/04/10(日) 01:45:03.96
NULLとEOFの使い分けってどうなんですか
自分はNULLはポインターでEOFはint型というように
代入や比較のときつかいわけてます
447デフォルトの名無しさん:2011/04/10(日) 01:47:50.12
使い分けもなにも、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がミソだとは思うんですけど、それ以前に呼び出されたとか値が返されたもイマイチピンときません
449デフォルトの名無しさん:2011/04/10(日) 02:20:18.66
そもそも関数呼び出しとか戻り値とか自体を理解してないっていう話?
450デフォルトの名無しさん:2011/04/10(日) 02:23:30.86
はい!
451デフォルトの名無しさん:2011/04/10(日) 02:27:43.41
ちなみに答えは46です
452デフォルトの名無しさん:2011/04/10(日) 02:28:48.47
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));
}
で、やってみな
453デフォルトの名無しさん:2011/04/10(日) 02:52:22.83
>>452
そもそもscanfがないからプログラムとして成り立ちますか?
454デフォルトの名無しさん:2011/04/10(日) 02:58:23.74
HelloWorld に scanf があったか?
455デフォルトの名無しさん:2011/04/10(日) 03:15:41.84
書けるのに目が悪いのかいな?
456デフォルトの名無しさん:2011/04/10(日) 11:33:37.15
>>383-384
おかげさまで何とか作れそうです
感謝します
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するのは、構造体を設定後なんですね・・
たぶんそうでしょう・・
459457=458:2011/04/10(日) 14:40:04.34
解決しました・・おそらく・・自信全くないけど。

460デフォルトの名無しさん:2011/04/10(日) 15:35:45.98
この質問を見てて思ったのですが、インクルードされていない標準関数はリンクされないと解釈していいのでしょうか?

Cってインクルードというものがありますよね? なぜインクルードをまとめて一つの - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1059846970
461デフォルトの名無しさん:2011/04/10(日) 15:50:03.52
includeとリンクは別問題だ
462デフォルトの名無しさん:2011/04/10(日) 20:14:54.79
昔の環境は貧弱だったので、すべての設定を読み込むと時間がかかってたので個別に読み込んでた
あと、依存関係を明確にするためファイルに別けてたってのもある
463デフォルトの名無しさん:2011/04/10(日) 20:22:32.16
>>460
Cはプロトタイプなくてもエラーにならないんで、ヘッダーファイルを
インクルードしなくてもコンパイル->リンクまで平気でいく。
464デフォルトの名無しさん:2011/04/10(日) 21:57:59.89
char *a;
aは文字列へのポインタ
char *b;
bも文字列へのポインタ

とします。

bの指す文字列をaの指す文字列に代入したいときどうすればいいですか?

strcpyを使う場合と、何も関数を使わない場合それぞれで教えてください。
465デフォルトの名無しさん:2011/04/10(日) 22:14:29.27
>>464
「文字列に代入」の意味が判らん。
bの指す領域にaの指す領域に格納されているナル終端文字列をコピーすると言う意味でいいのなら、
strcpy(b, a)でいい。勿論、bの指す領域がその文字列を格納するに充分であること。
何も関数を使わない場合と言うのはナンセンスなので割愛。
466デフォルトの名無しさん:2011/04/10(日) 22:15:39.15
CUIでプログラムを作ってます
指定した座標にツールチップを表示させたいのですが
どのようなキーワードで検索したらよいのでしょうか?
C言語 ツールチップでは参考になるものがみつかりませんでした
どなたかご教示お願いいたします
467デフォルトの名無しさん:2011/04/10(日) 22:38:27.91
>>464
b=a
468デフォルトの名無しさん:2011/04/10(日) 22:42:32.97
>>466
cuiにはツールチップと言う汎用的な概念がありません。頑張って自力で実装しましょう。
469デフォルトの名無しさん:2011/04/10(日) 22:47:09.95
>>466
指定した座標に任意の文字を書き込みたいということでいいのかな?
linux と MS windows で手順が違うから環境書きな
470 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/10(日) 22:48:31.32
コンソールアプリの問題は全てcursesで解決できる
471デフォルトの名無しさん:2011/04/10(日) 22:52:14.92
CUIでプログラム作ってます の意が
CUIな開発環境Iだけど、実行環境はGUIです ってオチじゃないだろうな?
472デフォルトの名無しさん:2011/04/10(日) 22:59:06.60
error: invalid type argument of `->'
とでてきましたが、何が不備だったのでしょう・・・
->が使えない処理環境なのでしょうか?
473デフォルトの名無しさん:2011/04/10(日) 22:59:58.01
>>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でコードを書いて、実行したらメッセージボックス(今回はツールチップを表示したい)を表示するような事をやりたいのです。
475デフォルトの名無しさん:2011/04/10(日) 23:01:00.16
>>472
エラーになったソースを晒せ
476デフォルトの名無しさん:2011/04/10(日) 23:01:57.18
error: invalid type argument of `->'

->はポインタの指す要素なので.とは違うと思うんです。

何故このようなエラーが出たのでしょうか?
477デフォルトの名無しさん:2011/04/10(日) 23:04:20.54
>>474
コンソールアプリじゃないの?
AllocConsole してるの?
>>471 の通りで単にコマンドラインからコンパイルしてるだけって意味なの?
478デフォルトの名無しさん:2011/04/10(日) 23:04:29.14
メンバがポインタだったら -> を使うのではなく
構造体がポインタだった -> を使う

struct { char* a; } foo;
struct foo *p;
struct foo q;
p->a;
q.a;

こういうこっちゃ
479デフォルトの名無しさん:2011/04/10(日) 23:08:57.98
>>477
すいません私が勘違いしているのかもしれません
コマンドプロンプトから起動するプログラムの事です
ttp://mga8cak.sitemix.jp/AutoItHelp3.3.6.1.jp/html/functions/ToolTip.htm

ttp://d.hatena.ne.jp/ampll/20080724/1216918598

ようにツールチップを指定した座標上の表示したいと考えております
480デフォルトの名無しさん:2011/04/10(日) 23:09:21.69
>>478
すいません・・
構造体の名前を仮にxとして

x->としてました・・

xのメンバーにポインタがあり、それがaなので

a->としなければいけないのでした><

481デフォルトの名無しさん:2011/04/10(日) 23:15:29.68
>480



xが構造体の実体なら
x.a
xがポインタなら
x->a

xのメンバにaがある時にx無しでa->なんてしてるとエラーになるけど。

構造体が入れ子になっていて、xのメンバaが構造体を指すポインタなら
x.a->p
とする必要がある。
482478:2011/04/10(日) 23:19:18.55
いろいろミス 以下修正

×構造体がポインタだった -> を使う
×struct { char* a; } foo;

○構造体がポインタだったら -> を使う
○struct foo { char* a; };
483デフォルトの名無しさん:2011/04/10(日) 23:21:53.13
>>481
構造体を指すポインタがaであるので
a->pとしても問題ないのですた。
484デフォルトの名無しさん:2011/04/10(日) 23:26:49.71
>>482
structは構造体なのに中の要素が一個だけって構造体の意味あるんでしょうか

485デフォルトの名無しさん:2011/04/10(日) 23:29:36.63
>>484
今の議論に要素数は関係ないよ?
486デフォルトの名無しさん:2011/04/10(日) 23:47:21.81
>>479
WinAPIの話は該当スレでどうぞ。
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);ですか?
488デフォルトの名無しさん:2011/04/11(月) 00:21:24.57
>>487
全部そうだよ。
489 ◆QZaw55cn4c :2011/04/11(月) 00:47:11.22
>>487
strcpy(p,s);
strcpy の頭に * は(普通は)いらない。念のため。
490デフォルトの名無しさん:2011/04/11(月) 00:48:43.80
>>488
ちげーよ

>>489
おめーもだ
491デフォルトの名無しさん:2011/04/11(月) 00:52:42.40
>>487
どれも、strcpy(s, p)だ。但し、>465も読んでおけ。
492 ◆QZaw55cn4c :2011/04/11(月) 01:19:00.07
>>490
おっと逆だった orz
493デフォルトの名無しさん:2011/04/11(月) 09:26:27.20
>>486
WinAPIで出来るのですね
該当スレで聞いてみます
ありがとうございます
494デフォルトの名無しさん:2011/04/11(月) 15:23:59.48
すみません。一部分だけのコードでwchar_tを使いたいのですが。
#undefで解除は出来ないですか。一度決まるとTCHAR型は変化しませんか?

#define UNICODE
#define _UNICODE

#undef UNICODE
#undef _UNICODE

495デフォルトの名無しさん:2011/04/11(月) 15:31:11.48
>>494です。
linuxとwindows共用コードを作りたいのですが、
ファイル・ディレクトリ操作で、linuxはwchar_tは定義されておらずwindowsではwchar_tでアクセスしないと不具合が出ます。
しかし、UNICODEを切り替えるのは上手くいきそうに無いので、使用関数を独自でラップすることにしました。
自己解決しました。
496デフォルトの名無しさん:2011/04/11(月) 15:42:37.52
C言語でファイルの拡張子を調べたいのですがどのようにすればいいでしょうか?
たとえば拡張子が .bin だったら .out に変更するなどの条件分岐に使いたい
です。どなたか解る方がいましたらよろしくお願いします。
497デフォルトの名無しさん:2011/04/11(月) 15:47:21.76
ファイル名文字列 を 末尾からおっかけて最初に見つかる . の位置を得て
その次の位置の文字列比較で分岐

<エラーチェックは省く>
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
ほらさっさと答えないから地震が!
500デフォルトの名無しさん:2011/04/11(月) 17:30:02.96
書き込みで開いて読めないって意味がわからないんだが
501デフォルトの名無しさん:2011/04/11(月) 17:34:09.30
書き込み通りのコードなら
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なので、標準的なやり方を知りたいです
キーワードとなる関数名だけでも構いません
宜しくお願いします
504デフォルトの名無しさん:2011/04/11(月) 22:02:18.33
kevent
505デフォルトの名無しさん:2011/04/11(月) 22:35:23.32
http://www5c.biglobe.ne.jp/~ecb/c/12_11.html
を見てワイルドカードの使い方を勉強しています。
mainの中の*argv[]で第一引数でワイルドカードを指定しても最初の
一つしか表示できません。なぜでしょうか?どうしたら全てのファイル
を表示できるでしょうか?よろしくお願いします。
506デフォルトの名無しさん:2011/04/11(月) 22:40:45.52
>>505
コンパイラの種類やコンパイルオプションによって
自動でワイルドカードの展開をしたりしなかったりするので
貰ってきたもの(argv)の中身を確認するべし
507デフォルトの名無しさん:2011/04/11(月) 22:43:00.64
>>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 );
}
}
509デフォルトの名無しさん:2011/04/11(月) 22:58:53.99
>>508
普通に動いたよ
WinXP,vs2010,vs2008
510デフォルトの名無しさん:2011/04/11(月) 23:00:49.75
GCCじゃできないのにVC++だと出来ました。
この違いは乗り越えられますか?
511 ◆QZaw55cn4c :2011/04/11(月) 23:05:55.61
>>510
Windows 上の cygwin を使っているのなら、gcc-3 かつ -mno-cygwin でなんとかコンパイルできるはず。
linux とかだったら、そもそも findfirst/findnext がないからコンパイルすらできない。
512デフォルトの名無しさん:2011/04/11(月) 23:11:48.27
MinGW使っています。
513デフォルトの名無しさん:2011/04/11(月) 23:15:29.63
>>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を実現したいのですが、どうしたらよいのでしょうか?


515デフォルトの名無しさん:2011/04/11(月) 23:29:15.11
中身をずらす代わりに、現在の位置を覚えておく方法もある
516デフォルトの名無しさん:2011/04/11(月) 23:30:56.50
windows版dirent.h作ったよ。いるか?
517デフォルトの名無しさん:2011/04/11(月) 23:31:04.27
>>514
リングバッファでググれ
518デフォルトの名無しさん:2011/04/11(月) 23:32:32.20
>>515
どちらのほうがシンプルにできますか?
極力、関数は使わずにしたいのです。

>>517
すみません、サンプルコード書いてください!
検索しても難しい上に長いのしかでてこないのです。
519デフォルトの名無しさん:2011/04/11(月) 23:44:36.40
実際に両方やってみれば結果どちらがシンプルだったかわかるんじゃない
520デフォルトの名無しさん:2011/04/11(月) 23:47:16.75
dequeでもつかえよ
C言語の宿題なら宿題スレへいけよ
521デフォルトの名無しさん:2011/04/11(月) 23:49:45.36
初心者は技巧に走るな。まずは動くこと。動いてからボトルネックに力を入れるべき。


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)になってしまいます。
なぜでしょうか?どうすればうまくリストに出来ますか?
よろしくお願いします。
523デフォルトの名無しさん:2011/04/11(月) 23:51:18.11
ここC言語スレだからね
524デフォルトの名無しさん:2011/04/11(月) 23:51:22.47
サンプル張ってやるよ


#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とかいった関数は使わずに実現したいのです。
526デフォルトの名無しさん:2011/04/11(月) 23:52:15.76
>>522
findfirst はどこ?
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;
}
こんな感じで。
528デフォルトの名無しさん:2011/04/12(火) 00:01:52.40
こんな感じか

#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++; }
529528:2011/04/12(火) 00:03:49.81
解説すると、プッシュされたら今の先頭に追加して、先頭を一つずらす。
530デフォルトの名無しさん:2011/04/12(火) 00:06:46.77
かってにデータが満杯を仮定していた
531デフォルトの名無しさん:2011/04/12(火) 00:11:08.49
>>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]はグローバル変数です。
534デフォルトの名無しさん:2011/04/12(火) 00:52:27.51
だってstockはポインタの配列であって、そこに代入してるのはc_file.nameへのポインタだもの
中身をコピーしてるわけじゃない
c_file.nameを指してるだけ
findnextを呼ぶたびにc_file.nameの中身は書き変わるから
535デフォルトの名無しさん:2011/04/12(火) 00:55:45.96
それを保存するためにはどうすればいいのでしょうか?
よろしくお願いします。
536デフォルトの名無しさん:2011/04/12(火) 00:58:50.44
stockをポインタの配列ではなく配列の配列にする。
537デフォルトの名無しさん:2011/04/12(火) 01:02:06.43
二次元配列ですか?解りません。
具体的にコードで説明していただけるとありがたいのですが。
申し訳ありませんが、よろしくお願いします。
538デフォルトの名無しさん:2011/04/12(火) 01:05:03.86
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使って星を描きたいんだけどどうしたら良いかな
とりあえず円の中で星を作るってのはわかるんだけど、星の特長とか公式とか覚えてない
誰かおせーておくんなまし
541デフォルトの名無しさん:2011/04/12(火) 01:37:50.30
>>539
ポインタを代入する代わりにstrcpy()するだけだよ。
この説明で判らないのなら、先ずは文字列の取り扱いを勉強するところから。
542デフォルトの名無しさん:2011/04/12(火) 01:55:06.09
>>540
Cの言語仕様にはlineもcircleもないのでその辺りは自分で使いたいライブラリを勝手に調べてくれ。
どんな星を描きたいのかも判らないけど五芒星や六芒星でいいのなら、
それぞれ円を五等分、六等分する点を計算で求めてそれを一つおきに線分で結べばいいだけ。
円を等分する点を求めるのはそんなに難しくないけど計算式まで書かないとダメ?
543デフォルトの名無しさん:2011/04/12(火) 01:57:47.35
strcpyについて調べました。
なぜ二次元配列が必要なのでしょうか?
ポインタのさす文字列をコピーするのに2次元配列が必要なのですか?
コピーされた文字列は2次元配列のどこに格納されるのでしょうか?
読み出すときはどうすればいいのでしょう?
解らないことだらけです。よろしくお願いします。
544デフォルトの名無しさん:2011/04/12(火) 02:02:15.32
いやだから、素直に文字列の取り扱いを勉強してらっしゃいってば。
文字列を扱うのには配列(或いは明示的に確保された空間)が必要なの。
文字列の配列を扱うには、配列の配列が必要なわけ。数学的な意味の二次元配列じゃないからね。
545デフォルトの名無しさん:2011/04/12(火) 02:05:49.95
>>542
ありがとん

よければ式書いてもらいたいです・・・
546デフォルトの名無しさん:2011/04/12(火) 02:08:38.74
誠に申し訳在りませんがコードを書いてもらえないでしょうか?
急いでます。よろしくお願いします。
547デフォルトの名無しさん:2011/04/12(火) 02:10:49.09
>>546
自助努力もできないなら諦めたら?
或いは宿題スレに丸投げしたら書いてくれるかもよ。
548デフォルトの名無しさん:2011/04/12(火) 02:48:13.59
>>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
>>548
謎が解けた。めっちゃありがとう
550デフォルトの名無しさん:2011/04/12(火) 10:19:40.34
複数ファイルの処理で困っています。scanfで取り込んだ文字列を、
複数のファイル名に分解して一つずつ処理したいのですが、リストの
作り方がわかりません。どなたかわかる人がいればよろしくお願い
します。
551デフォルトの名無しさん:2011/04/12(火) 10:25:50.40
>>550
日本語で
552デフォルトの名無しさん:2011/04/12(火) 10:39:43.05
>>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から取り込んだ文字列を
複数のリストに分けて代入する方法がわかりません。
よろしくお願いします。
554デフォルトの名無しさん:2011/04/12(火) 11:42:40.35
>>553
そりゃ大変だ。"*.c", "*.rb"をそれぞれ取り込むだけならちょっとした文字列操作だからそれほど難しくない。
しかし、それをワイルドカードとしてディレクトリを検索するとなるとCの言語使用の範囲内では不可能。
従って、環境と具体的にやりたいことを整理した上でC/C++環境依存スレで聞き直したほうがいい。
555デフォルトの名無しさん:2011/04/12(火) 12:02:21.47
>>554
findという関数はもう用意されていて、前半の文字列分割だけを聞きたいのかも
556デフォルトの名無しさん:2011/04/12(火) 12:18:06.82
findは自前の関数で同じディレクトリ内のファイルから特定のファイルを
表示するものです。従って文字列分割の方法がわかればいいのですが、
strtokを使うと分割できると聞いたのでやってみましたが、scanfで
取り込んだ文字列はスペース以降を文字列として除外してしまうらしく
うまくいきません。どのようにすればscanfを使って、またそれ以外の
方法でもいいのですが出来るでしょうか?ただしmain関数の引数として
の記述は不可です。よろしくお願いします。
557デフォルトの名無しさん:2011/04/12(火) 12:20:54.77
もう一度scanfを使えば次の文字列を取得できる
scanfは自動的に空白で文字列を分割する
558デフォルトの名無しさん:2011/04/12(火) 12:23:15.28
>>556

scanfじゃないとだめ?
getsの方がスペースも取り込めて楽じゃない?
559デフォルトの名無しさん:2011/04/12(火) 12:26:34.33
>>556
自作したなら、アルゴリズム見直した方がいい。
それだと拡張子100個なら100回探査するぞ。
560デフォルトの名無しさん:2011/04/12(火) 12:27:09.27
>>558
gets()なんて使っちゃダメ。

>>556
fgets()で1行丸々取り込むのが何かと便利。
その後はstrtok()でばらしてもいいし、sscanf()でばらしてもいい。
つーか、空白区切りだとすると空白を含むファイルパターンは使えなくなるけどいいの?
それと、どうしてもscanf()を使いたいなら%sの代わりに%[^\n]として改行以外全部取り込む方法もあることはある。
561デフォルトの名無しさん:2011/04/12(火) 12:27:28.25
getsで出来ました。ありがとうございました。
562デフォルトの名無しさん:2011/04/12(火) 12:28:59.69
>>561
ながーいファイルパターンを入力してご覧。
563デフォルトの名無しさん:2011/04/12(火) 13:01:30.44
fgetsでは一行取り込める保証がないからgetlineのほうがいいよ。
自分の環境になかったら自作しても良い。fgetsあれば自作できる。
564デフォルトの名無しさん:2011/04/12(火) 13:05:35.29
>>563
もしかして、C++スレとお間違いでは?
565デフォルトの名無しさん:2011/04/12(火) 13:11:09.89
いやいや、GNUのgetlineのことだよ。
#define _GNU_SOURCE すればstdio.hから取り込めるやつ。
566デフォルトの名無しさん:2011/04/12(火) 13:51:14.86
なるほど。しかし、GNUだけがCじゃないのでやはり入門者にお勧めすべきでないと思いますが。
567デフォルトの名無しさん:2011/04/12(火) 14:20:15.85
そうだね。すまんかった。
568デフォルトの名無しさん:2011/04/12(火) 14:20:56.97
空白区切りのファイルパターンの場合はどうすればいいのでしょうか?
569デフォルトの名無しさん:2011/04/12(火) 14:25:31.05
1文字づつ切り出してパースしちゃうことあるな…

"ではさまれた区画の区切り文字は 区切りとして作用させない って例外の為だけに
570デフォルトの名無しさん:2011/04/12(火) 14:29:38.35
>>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;
}
572552:2011/04/12(火) 15:23:19.93
--------   -------   ------
strtok で文字列を区切る話は、ここまでで締め切りとします。
573デフォルトの名無しさん:2011/04/12(火) 15:51:58.06
>>571
環境も提示せずに断片だけ見せられてもなんとも言えない。
動いているならいいんじゃない?
574デフォルトの名無しさん:2011/04/12(火) 17:10:45.03
D:ドライブなどカレントディレクトリ以外のファイルを操作したい
場合はどのようにすればいいのでしょう?
パスを入れてもファイル名以外は引き継がないらしいです。
また見つかっても処理したファイルはカレントディレクトリの
中で大きさが0の殻のファイルしか出来ません。
ほかのディレクトリのファイルをそのファイルのある場所に処理した
ファイルを置くには何をどうすればいいのでしょうか?
わかる人よろしくお願いします。
575デフォルトの名無しさん:2011/04/12(火) 19:28:10.89
linux、GCCでシステムメモリー状態を取得する方法はあるのでしょうか?
freeコマンドで取得した戻り値解析する方法しかわかりません。

576デフォルトの名無しさん:2011/04/12(火) 21:13:08.77
linuxのフレームバッファーに直接☆
http://codepad.org/jE2PzcWl

[Alt] + [Ctrl] + [F1]
gcc -o a tt_put_star.c -lm
sudo ./a
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する場合もどのように書けばいいですか?
578577:2011/04/12(火) 22:40:40.54
>pointer->dataに文字列をコピーしたいのですが
と書きましたが、mallocで確保した領域にコピーしたいという意味です。
579デフォルトの名無しさん:2011/04/12(火) 23:05:41.32
>>578
char s1[10] ="abc";
struct point {
char *data;
} pointer
pointer.data = malloc(10);
memcpy(pointer.data, s1, 4);

strcat(pointer.data,"str");
580577:2011/04/12(火) 23:11:31.69
>>579
レスありがとうございます
書いてませんでしたが別関数にポインタで渡してるので
pointer->dataで合ってます。。。
581 ◆QZaw55cn4c :2011/04/12(火) 23:17:01.98
>>525
はい、どうぞ。
http://codepad.org/esQqoiSN
582デフォルトの名無しさん:2011/04/12(火) 23:34:11.55
>>580
必要なところは省くなよ
577で動くんじゃないの?
あとは
strcat(pointer->data,"str");
583デフォルトの名無しさん:2011/04/13(水) 01:46:29.04
64bitのCPUになったらポインタ型は8byteになるの?
584デフォルトの名無しさん:2011/04/13(水) 01:56:20.02
>>583
64bit CPU で 64bit OS を動かしていて 64bit プロセスで LP64 とかなら基本はそう。

C 以外の言語だと、Java なんかは -XX:+UseCompressedOops を付けると64bit プロセスでも
アドレス幅が 32bit で済んだりする場合もある。
585デフォルトの名無しさん:2011/04/13(水) 01:57:46.55
>>584
おお〜すっきりしましたありがとう。
586デフォルトの名無しさん:2011/04/13(水) 01:59:45.47
64bit CPU でも 32bit OS を動かしていたり 32bit プロセスだったりする場合は
ポインタのサイズも従来通り。

C ではなく、GC のある言語で tagbit を使っていたりすると、実効ポイント幅は
30bit だったりする事もある。
587552:2011/04/13(水) 02:10:41.42
>>574
C:\*.* を書くときは、C:\\*.* と¥を2個重ねる。
588デフォルトの名無しさん:2011/04/13(水) 02:10:51.94
なるほどメモリが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 );
}
}
}
591デフォルトの名無しさん:2011/04/13(水) 06:33:52.61
> if( (hFile = _findfirst( name2[j].m, &c_file )) == -1 ){

name2[j].m にパスを入れればいい
592デフォルトの名無しさん:2011/04/13(水) 06:41:32.82
パスを入力しても、それが取れてしまいます。またstrcatで文字列結合を
しても、カレントディレクトリの結果が出てきてしまいます。検索結果
とファイル処理の場所が異なってしまうので、ファイルが見つからず
エラーになってしまいます。どのようにすればいいでしょう?、また
デフォルトではカレントディレクトリを探したいと思います。
長々と書きましたが、よろしくお願いします。
593デフォルトの名無しさん:2011/04/13(水) 06:58:58.48
>>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でもやっています。
597デフォルトの名無しさん:2011/04/13(水) 07:46:53.44
そろそろ↓に移動しようか

【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/
598デフォルトの名無しさん:2011/04/13(水) 07:49:03.90
自己解決しました。ありがとうございました。
599552:2011/04/13(水) 08:02:39.87
何が?
600デフォルトの名無しさん:2011/04/13(水) 15:00:41.50
>>595
とりあえず name2 以外の引数を持たせて、そこに検索対象パスを格納するようにしろ
入力と出力を混ぜるのは、メモリに困った時以外ダメ、絶対
>>596
_findfirst() 系がパス情報を含まないファイル名しか返さないのは仕様なので、自動で
フルパスを得るのはあきらめる事。
パス文字列を組み立てるには sprintf(name[count].m, "%s\\%s", 検索対象パス, c_file.name);
とでもすること (「検索対象パス」 は適宜変数名に置き換えること)。
601デフォルトの名無しさん:2011/04/13(水) 15:14:13.98
_findfirst()は使うなよ
これってunixでは使えないし、winAPIでもないし。
602デフォルトの名無しさん:2011/04/13(水) 16:59:40.49
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));
603デフォルトの名無しさん:2011/04/13(水) 17:04:05.57
>>602
src が NUL文字終端の文字列なら問題ない
604デフォルトの名無しさん:2011/04/13(水) 17:06:40.59
>>603
ありがとうございます。
すっきりしました!
605デフォルトの名無しさん:2011/04/13(水) 17:08:04.99
src が size-1 文字の時の対処で dest[size] = 0 を明示的に代入する…
…… ZeroMemory で埋めてるのか。 ちょっとドキっとするね(俺的に)
606デフォルトの名無しさん:2011/04/13(水) 17:09:06.61
ファイルを見つけるのにfindfirstを使わない方法ってあるんですか?
自分はサンプルがあるのでそれを使ってしまいましたがそれ以外に方法が
あるなら教えてください。
また2次元配列の2次元目だけに値を入れるにはどうしたらいいでしょうか。
自分は解らなかったので配列の構造体にしました。よろしくお願いします。
ファイルネームの先頭に、strcatでパスをくっつけて検索したらうまく
行きましたが何か問題があるでしょうか?
607デフォルトの名無しさん:2011/04/13(水) 17:13:38.71
>>605
レスありがとうございます。
こういう感じでしょうか?

char dest[1025];

strncpy(dest, src, sizeof(dest));
dest[sizeof(dest)-1] = '\0';

null終端文字列の場合は
memsetやzeromemory使うより
こういう感じの方がすっきりしますか?
608デフォルトの名無しさん:2011/04/13(水) 17:17:04.27
>>607
危なそうなコードの直後に対処は考えてますよコードが居るのと
頭で危険性回避コード 後で危なそうなコードが居るの

個人的な気分の違いだけだよんw
609デフォルトの名無しさん:2011/04/13(水) 17:23:56.67
strcpy(dest, src)
610606:2011/04/13(水) 17:24:00.22
>>600
レスありがとうございます。
わからないことが多いのでよろしくお願いします。
611デフォルトの名無しさん:2011/04/13(水) 17:26:16.67
これってダメだろ。sizeof(dest) は0


ZeroMemory(dest, sizeof(dest));
strncpy(dest, src, sizeof(dest) - 1);
612デフォルトの名無しさん:2011/04/13(水) 17:40:19.77
>>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というのはどういうことでしょうか?教えていただけませんか?
613デフォルトの名無しさん:2011/04/13(水) 17:41:14.12
>>608
なるほど、そういうことですね。
理解しました
614デフォルトの名無しさん:2011/04/13(水) 17:46:13.56
>>612
まちがえた。strlenかとおもった
615デフォルトの名無しさん:2011/04/13(水) 17:48:22.13
>>611
いずれにしても間違えてるだろ。
strcpy(dest, src)にしとけ。
616デフォルトの名無しさん:2011/04/13(水) 19:05:42.06
何度もスイマセン。strncpyじゃなくて、strcpyでも大丈夫ということでしょうか?

>>615

char dest[8];
char* src = "12345678901234567890";
strcpy(dest, src);

コピー先のバッファが小さい場合など
上記のケースでも問題無いのでしょうか?
617デフォルトの名無しさん:2011/04/13(水) 19:21:50.30
>>514
http://codepad.org/9s4vxEAC
以前読んだosaskの川合さんのソースコードで、リングバッファーのインデックス移動時の境界での挙動を
条件分岐を使わずに解決する巧い仕組みをマスクによって実現してるコードがあった。それと同じアプローチで。
618デフォルトの名無しさん:2011/04/13(水) 19:22:37.87
>>615
destは十分大きく取っておけばいいだけ。
MAXを決めておくか、n=strlen(src)として
char *dest = new char [n+1];
619デフォルトの名無しさん:2011/04/13(水) 19:32:48.57
>>615
任意の長さで、バッファ管理が面倒ならばC++つかえ。

これだけで、メモリ自動確保とデータコピーをしてくれる。

static string dest;
dest = (string)src;
620デフォルトの名無しさん:2011/04/13(水) 20:25:23.46
strncpy()なんか使わずにsprintf()にしておけば余計なことで悩まずに済むのに。
621デフォルトの名無しさん:2011/04/13(水) 20:33:09.75
今620がアホな事言った
622デフォルトの名無しさん:2011/04/13(水) 20:36:38.25
sprintf()は神
623デフォルトの名無しさん:2011/04/13(水) 20:37:41.61
おれもsprintf()がいいと思う。
624デフォルトの名無しさん:2011/04/13(水) 20:48:31.71
sprintfって確かに便利だけどパフォーマンス的にはどうなん?
625デフォルトの名無しさん:2011/04/13(水) 20:56:22.70
sprintf()は万能すぎるのが弱点といえば弱点だな
626デフォルトの名無しさん:2011/04/13(水) 20:57:41.65
sprintfがあればstrcpyもstrcatもatoiも不要だからな
627デフォルトの名無しさん:2011/04/13(水) 20:59:26.57
マジかよ!すごすぎんだろsprintf!!!!!!!!!
628デフォルトの名無しさん:2011/04/13(水) 21:02:26.47
strcpy_s()とかlstrcpyn()みたいな関数があればそれを使えばいいけど、
なかったら、sprintf()がいちばんマシかな。
629デフォルトの名無しさん:2011/04/13(水) 21:05:40.79
C言語はもともとワープロをプログラムする用に開発された言語だからな
630デフォルトの名無しさん:2011/04/13(水) 21:09:19.76
スペースウェオーつくろうぜ!
631デフォルトの名無しさん:2011/04/13(水) 21:10:02.16
>>626
atoi()は違うだろ。
632デフォルトの名無しさん:2011/04/13(水) 21:10:39.80
スペースウォーズな
633デフォルトの名無しさん:2011/04/13(水) 21:12:41.52
関数ポインタの配列って可能?
634デフォルトの名無しさん:2011/04/13(水) 21:14:31.25
可能
635デフォルトの名無しさん:2011/04/13(水) 21:14:32.82
可能
636デフォルトの名無しさん:2011/04/13(水) 21:16:15.11
化膿
637デフォルトの名無しさん:2011/04/13(水) 21:16:19.34
>>633
ポインタの配列なんだから出来る
638デフォルトの名無しさん:2011/04/13(水) 21:19:51.06
関数の配列をmallocするのは可能?
639デフォルトの名無しさん:2011/04/13(水) 21:20:41.81
>>638
それは不可能
640デフォルトの名無しさん:2011/04/13(水) 21:25:34.80
>>638
そもそも「関数の配列」が定義できない
641デフォルトの名無しさん:2011/04/13(水) 21:26:19.51
出来るだろ
642デフォルトの名無しさん:2011/04/13(水) 21:33:11.14
関数の配列を定義した気になってもそれは関数ポインタの配列。
643デフォルトの名無しさん:2011/04/13(水) 21:38:32.09
関数の配列か… あえて想像すると
機械語変換済みバイナリの集団が配列になるようなものなのか?
要素間のアドレス差が最も大きいもの単位になってるっていうような
644デフォルトの名無しさん:2011/04/13(水) 21:58:53.46
呼び出し先の配列でしょ
645デフォルトの名無しさん:2011/04/13(水) 22:11:27.34
関数の配列ってどうやって宣言すんだよw
関数によって定義しなきゃ駄目じゃねぇかww
646デフォルトの名無しさん:2011/04/13(水) 22:13:55.44
書き方がわからないって、馬鹿じゃねの
647デフォルトの名無しさん:2011/04/13(水) 22:21:41.08
こんな感じ?

int func[10]();
648デフォルトの名無しさん:2011/04/13(水) 22:23:38.76
基本的ですみません。

文字列の配列で
char s[] = "hogehoge";
とかはよくやりますが、文字列リテラルはchar[]型には代入できないというのはわかっています。
ところが、文字列配列を受け取る関数
foo(char s[])
とかを定義すると、
foo("hogehoge")
で呼び出しができてしまいます。内部でsの値をいじろうとすると怒られるので
文字列リテラルだと認識されているようです。これは、関数呼び出し時に代入演算
でない渡し方になっているということでしょうか。
649デフォルトの名無しさん:2011/04/13(水) 22:24:52.99
関数ポインタの配列のサンプルコードをかけよだれか
650602:2011/04/13(水) 22:25:30.28
皆様レスありがとうございました。
sprintfをstrcpyの代わりに利用するというのは
次のようなコードの事ですね。

char dest[8];
char* src = "12345678901234567890";
strcpy(dest, src); /*これだと、バッファオーバー*/
sprintf(dest, "%0.7s", src); /*スマート*/

確かにシンプルですね。
コレを利用してみます〜
651デフォルトの名無しさん:2011/04/13(水) 22:27:28.08
>>649

typedef int (*func_ptr)(const char *, ...);
func_ptr a[] = { printf, scanf };

こんなんでよろしいか?
652デフォルトの名無しさん:2011/04/13(水) 22:29:14.11
>>648
代入っつーか文字列の先頭のアドレスを渡してるだけでしょ。

固定文字列はメモリ空間内の書き換え不能なエリアに配置されるから
書き換えようとすると怒られる。
653デフォルトの名無しさん:2011/04/13(水) 22:30:53.50
>>647
それだと int[10] を返す普通の関数に見えるな
654デフォルトの名無しさん:2011/04/13(水) 22:31:45.10
>648
関数に配列を渡すことはできない。

void foo(char s[]);
としても
void foo(char *s);
と同等。

したがって char *s = "hogehoge";
と初期化しているのと同等の処理となる。

char s[] = "hogehoge";
ではない。
655デフォルトの名無しさん:2011/04/13(水) 22:35:30.96
久しぶりにポインタ完全制覇でも読み直そうかな
656648:2011/04/13(水) 22:35:34.98
>>652
ありがとうございます。

そうすると、char[]型のsについて
s = "hogehoge";
ができないというのは配列型特有の特殊な仕様ということでしょうか。
("hogehoge"が単なる先頭ポインタだとすると、配列の先頭ポインタであるはずのsには代入できてもよい気がします)
657デフォルトの名無しさん:2011/04/13(水) 22:36:31.38
>>653
配列を返す関数w

int func()[10];
658デフォルトの名無しさん:2011/04/13(水) 22:37:30.67
代入と初期化の区別がついてないようだね
同じ記号 = を使ってるけど やってることは全然違うから
659デフォルトの名無しさん:2011/04/13(水) 22:38:34.46
int func()[10];

エラー
660648:2011/04/13(水) 22:38:34.70
>>654
ありがとうございます。
関数に配列引数が指定された場合は暗黙にポインタに読み換えられるということですね。
紛らわしいので明示的にわかる文法にしてほしいですね…。
661648:2011/04/13(水) 22:40:42.19
>>658
関数引数に渡すのは初期化に対応するということでしょうか?
662デフォルトの名無しさん:2011/04/13(水) 22:41:11.16
int (*func[])(void);
663648:2011/04/13(水) 22:43:06.94
>>658
初期化では
char s[] = "hoge";
とできるのに、それ以外では
s = "hoge";
とできないのは納得がいかない!
と言っているわけではありません。
664デフォルトの名無しさん:2011/04/13(水) 22:46:07.07
665デフォルトの名無しさん:2011/04/13(水) 22:46:16.92
>>663
sは、アドレスを示すラベルみたいなものだから。
最初にそのアドレスに格納することはできるけど、
そのラベルに何かを代入するのは出来ない。
666デフォルトの名無しさん:2011/04/13(水) 22:46:43.19
>>663
了解。
667648: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つ目のルールはなくても良いことになると思います。

非常にややこしくて気持ち悪いですが、もっとシンプルなルールなのかもと思っています。
668デフォルトの名無しさん:2011/04/13(水) 23:04:21.73
foo(char s[])
って
foo(char *s)
で解釈されてるだけでしょ
669デフォルトの名無しさん:2011/04/13(水) 23:16:53.00
>667

配列は代入可能な左辺値に含まれないので、配列に代入することはできない。
なんども繰り返されているが、

1)char s[] = hoge;
は初期化付きの宣言であり、代入ではない。

2)配列は関数の引数に指定できない。
670デフォルトの名無しさん:2011/04/13(水) 23:20:13.86
>>667
ポインタや配列がどういうもんなのか分かってないようだから
http://www.kab-studio.biz/Programing/Codian/Pointer/07.html
ここを一読したあとに
IDEでも使って実際に確認するといいよ
671デフォルトの名無しさん:2011/04/13(水) 23:24:07.18
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" の先頭アドレスを引数として受け取る
・非常に自然な流れなのでオケ
672デフォルトの名無しさん:2011/04/13(水) 23:25:46.58
>>671
>・puts() には "foo" の先頭アドレスである所の s が渡される

これは消し忘れた。スマソ。
673デフォルトの名無しさん:2011/04/13(水) 23:31:31.87
pointer の意味を辞書で調べたら?
674デフォルトの名無しさん:2011/04/13(水) 23:33:22.36
>>671
1) char s[] = "foo";
配列の値はコンパイル時に決定されてるから、アロケートっておかしいだろ?
675デフォルトの名無しさん:2011/04/13(水) 23:38:16.24
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次元配列を一気に入れるときはどう書けばよいのでしょうか?
676デフォルトの名無しさん:2011/04/13(水) 23:38:47.80
間違えました

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 } ,
};

でした
677デフォルトの名無しさん:2011/04/13(水) 23:40:29.24
それは[2][5][5]だ
678デフォルトの名無しさん:2011/04/13(水) 23:44:02.93
>>677
解決しましたトンクス
679デフォルトの名無しさん:2011/04/13(水) 23:44:46.46
>>674
アロケートはメモリの割当の事で、値の決定とは関係無いよ
680648: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つの意味(内容の変更不可(リテラル)と、メモリアドレスの変更不可(左辺値))を持っていたために混乱したのかと思っています。
681デフォルトの名無しさん:2011/04/14(木) 00:00:59.06
>>680
2がおかしい。
682デフォルトの名無しさん:2011/04/14(木) 00:23:00.17
>>680
>2:char s[] = "hoge"は変更可能な領域に静的に確保されたメモリに"hoge"を書きこんで先頭ポインタを返す

分かってるかもしれないけど、"hoge" がメモリ上に書き込まれるのはプロセス起動時ね。
683デフォルトの名無しさん:2011/04/14(木) 00:36:00.72
> 先頭ポインタを返す

配列は何も返さない
684デフォルトの名無しさん:2011/04/14(木) 00:40:50.55
>>683
sが先頭ポインタを返すんです
と思う
685デフォルトの名無しさん:2011/04/14(木) 00:55:54.94
>>684
硫黄が放射能を返すってのと同じくらいありえない
686デフォルトの名無しさん:2011/04/14(木) 01:02:14.83
どの時点の話ししてるのかがわからん
687デフォルトの名無しさん:2011/04/14(木) 01:07:30.56
>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が指している先を変更しようとすると怒られる。
688 ◆QZaw55cn4c :2011/04/14(木) 01:10:10.82
>>617
きれい。でも FILO のようなきが。
689デフォルトの名無しさん:2011/04/14(木) 01:11:06.08
>>688
もしかして LIFO ?
690デフォルトの名無しさん:2011/04/14(木) 01:19:53.42
>>687
>→char s[] = "hoge";はchar s[] = {'h','o','g','e'};を簡易にかけるようにした構文糖。

これは俺も勘違いしてた。ありがとん。
691デフォルトの名無しさん:2011/04/14(木) 01:21:27.45
>>690
ちなみに間違ってるけどw
692 ◆QZaw55cn4c :2011/04/14(木) 01:33:21.62
>>689
ご指摘感謝。どっちでもいいみたい。
http://ja.wikipedia.org/wiki/LIFO
693デフォルトの名無しさん:2011/04/14(木) 01:37:25.14
>>691
なぬ・・・

おとなしく規格読むことにするわ・・・
694デフォルトの名無しさん:2011/04/14(木) 01:47:56.12
>>693
がんばってねー
687 読むとお腹痛くなるまで
笑いは健康にいいからね
695デフォルトの名無しさん:2011/04/14(木) 02:02:26.59
'\0'
696デフォルトの名無しさん:2011/04/14(木) 02:07:15.01
暴走するようなことを考えるんだ
697デフォルトの名無しさん:2011/04/14(木) 02:14:46.87
>>695
まだ1つしか気付かないの?
突っ込みどこ満載の蜂の巣なんだが
698デフォルトの名無しさん:2011/04/14(木) 03:54:21.42
int main()とint main(void)の違いて何ですか?
699デフォルトの名無しさん:2011/04/14(木) 03:55:12.23
かっこの中にvoidって書いてある
700 ◆QZaw55cn4c :2011/04/14(木) 04:09:21.63
>>698
C99 においては一緒。
701デフォルトの名無しさん:2011/04/14(木) 04:09:25.06
宣言においては違いがあるが、定義においては事実上同一。
702デフォルトの名無しさん:2011/04/14(木) 04:12:43.04
>>700
嘘を書くな、嘘を。
703 ◆QZaw55cn4c :2011/04/14(木) 04:19:35.08
>>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
704703:2011/04/14(木) 04:20:32.37
ISO/IEC 9899:1999 6.7.5.3.14 ね。
705デフォルトの名無しさん:2011/04/14(木) 04:25:22.92
>>698
(void) 引数を持たない
() 引数情報を持たない

void f1(){}
void f2(void){}
int main(){
f1(100); //ok
//f2(200); //compile error
return 0;
}
706デフォルトの名無しさん:2011/04/14(木) 04:26:58.87
頼むから ◆QZaw55cn4c は書き込みをやめてくれ。
お前はアホで頭が悪いんだから。それが本当の姿なのに、無理に自分を
頭のいい特別な存在だと思い込みたがるもんだからあちこちにボロが出る。

それ自体は別に悪い事ではないが、問題はお前がその事実を絶対に認め
たがらない事だ。だから嫌われているという事に気づけ。社会からもそれが
原因でのけ者になっているだろう。
707デフォルトの名無しさん:2011/04/14(木) 04:47:42.67
>>705
>>698
mainについて聞いているんじゃないのか?
708687: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
上記終端文字以外間違いはないと思います。
誤りあればご指摘いただけませんか?
709デフォルトの名無しさん:2011/04/14(木) 07:32:20.30
間違いを指摘するなら正しくは何なのかまで書いてほしいなあ
710デフォルトの名無しさん:2011/04/14(木) 07:35:08.48
少し様子見るだけならいいんだけど、投げっ放しは勘弁。
つーか、判ってないのに煽るだけなんてのは最悪。
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
追記:
絶対(相対)ファイル名を入力して、ファイル名を除いたパスだけの
出力が欲しいです。
713デフォルトの名無しさん:2011/04/14(木) 09:50:11.07
>>712
_splitpath
714デフォルトの名無しさん:2011/04/14(木) 10:13:06.96
自己解決しました。ありがとうございました。
715デフォルトの名無しさん:2011/04/14(木) 11:06:42.56
>>711
strrchr(buffer, '/')[0] = '\0';
puts(buffer);
716デフォルトの名無しさん:2011/04/14(木) 13:44:14.15
UNIX系のソースをVCでコンパイルしようとおもっております。

#include <sys/types.h>
#include <sys/param.h>

を読めなくて躓いているのですが、VCで代替可能なヘッダは用意されているのでしょうか?
717デフォルトの名無しさん:2011/04/14(木) 14:11:47.09
>>716
しらねえけど。
コメントアウトして、止まる所の関数、defineを全文検索
718デフォルトの名無しさん:2011/04/14(木) 14:21:58.44
VCで代替可能なヘッダなんてありません。
自力で出来ないなら、諦めるしか...
719デフォルトの名無しさん:2011/04/14(木) 14:27:10.73
>>717-718
そですか、コメントアウトして適当に代替関数でもでっち上げてみます。
720デフォルトの名無しさん:2011/04/14(木) 14:27:52.11
ほっほっ
721デフォルトの名無しさん:2011/04/14(木) 14:30:20.42
ふっほっ
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);
}
}
この関数でファイル名とパスを分けて格納しますが、ルートディレクトリ
を格納することが出来ません。パスを見ると""になっています。
どのようにすればいいでしょう?よろしくお願いします。
723デフォルトの名無しさん:2011/04/14(木) 14:54:29.14
// >>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
725デフォルトの名無しさん:2011/04/14(木) 14:57:26.24
726デフォルトの名無しさん:2011/04/14(木) 15:06:31.31
>>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
間違いに気づきました。
有難うございました。
730デフォルトの名無しさん:2011/04/14(木) 16:05:37.15
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 を混在させてる人の「使い分けの指標や、判断の拠り所は何なのか?」を聞かせてほしい。
731デフォルトの名無しさん:2011/04/14(木) 16:07:08.10
>>730
どっちでもいいやん
「こういう場合はforで・・・」とか語り出す奴は大抵頭がおかしい
732デフォルトの名無しさん:2011/04/14(木) 16:08:36.15
初期化や更新部が明示的な場合はfor。
只の代入文を生で放り出しておくよりも、場所を限定してやった方が目的が明確になる。
733デフォルトの名無しさん:2011/04/14(木) 16:42:41.90
for だと continue を使うときに少し楽になるかもしれない
734デフォルトの名無しさん:2011/04/14(木) 17:11:58.87
For (int i = 0; i < 10; i++){

}
とした場合forから抜ければiは破棄できる
735デフォルトの名無しさん:2011/04/14(木) 17:12:40.24
>>734
それC++/C99の話だろ
736デフォルトの名無しさん:2011/04/14(木) 17:19:41.13
>>732に同意。
whileだと入り口でi=0;や中でのi++;をうっかり忘れる。
737デフォルトの名無しさん:2011/04/14(木) 17:20:39.00
C99前のCは制御構文より前に宣言しないとおこられたよね?
最近はC++をベターCとして使ってるからあんまいしきしてねえけど。
738デフォルトの名無しさん:2011/04/14(木) 17:28:27.13
CならC++でもいいけど、C++ならC++はあまりよくない
739デフォルトの名無しさん:2011/04/14(木) 17:30:57.19
>>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" になることはできませんでした。」

の例外エラーが出ます。
何がいけないんでしょうか?
741デフォルトの名無しさん:2011/04/14(木) 18:21:35.10
y2->p = (struct point**)calloc(size,sizeof(struct point *));

for (i = 0; i < size; i++) y2->point[i] = (struct point *)malloc(struct point);

とやってpointの実体を確保しないとまずい
742デフォルトの名無しさん:2011/04/14(木) 18:22:46.94
あ、ちょっとまったポインタのポインタか
そしたら2次元配列風になるな
743デフォルトの名無しさん:2011/04/14(木) 18:24:00.82
>>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;
744デフォルトの名無しさん:2011/04/14(木) 18:25:21.33
>>740
struct point *p;でs = y2->p[0].xじゃね?
745デフォルトの名無しさん:2011/04/14(木) 18:29:31.02
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 のほうが素直
746デフォルトの名無しさん:2011/04/14(木) 18:39:46.93
おまえらエスパーだな
>>740
struct point **p;
で管理したい(ポイントしたい)のはpointの1次元配列?
それともpointの2次元配列?
なんか説明だと2次元配列って感じするんだが
747デフォルトの名無しさん:2011/04/14(木) 18:43:17.17
>>741
>>742
>>743
>>744
>>745
>>746
pointの一次元配列のつもりでしたが、うまくいきました
そして今更ながら自分の勉強不足に・・・><
ほんとうにありがとうございます、これからもちょくちょく利用させてもらいます!
748デフォルトの名無しさん:2011/04/14(木) 18:46:14.17
>>747
http://codepad.org/GGHkSmUl

こうしたいのかな?
したい事がよく伝わってこないので適当に書いたが
749デフォルトの名無しさん:2011/04/14(木) 18:48:53.89
>>747
あのね、そういう場合は>>741-746って書けるから覚えとくといい
750 ◆QZaw55cn4c :2011/04/14(木) 18:50:00.19
>>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 に準拠するコンパイラならエラーになってしかるべき。
751 ◆QZaw55cn4c :2011/04/14(木) 18:52:17.78
>>730
インデックスな変数があるなら for() を使っている。
for (p = a, q = b; *p; p++, q++)
*q = *p;
752デフォルトの名無しさん:2011/04/14(木) 18:54:44.17
>>750>>751 氏ね
753デフォルトの名無しさん:2011/04/14(木) 19:13:22.55
>>751
毎回思うのだが、この人の書くソースコードは汚くて読みにくい。
あと、妙な歪さがいつも気になる。
具体的には、
洗練されてるアルゴリズム部分は、やたら洗練された完璧なアルゴリズムを書くくせに、
一方、イモのようなアルゴリズムの所は、どうしようもなくイモだったりする。たとえばmain()中の、検証用テストコードなんかは、どうしようもなくイモだったりする。

このエレガントさとイモさのギャップが、あまりにも不自然すぎて笑う。というか本当に同じ人間が書いたコードなのか?というコードの混在が、どうにも不思議でならない。
754デフォルトの名無しさん:2011/04/14(木) 19:32:36.68
>>753
誰かのパクリなんだろ
755 ◆QZaw55cn4c :2011/04/14(木) 19:44:49.73
>>753
ご感想ありがとうございます。
>この人の書くソースコードは汚くて読みにくい。
まだまだ修行が足りませんね。もっと読んでもっと書きます。

>このエレガントさとイモさのギャップが、あまりにも不自然すぎて
そうなんですか。全然気が付きませんでした。
ちょうど http://hibari.2ch.net/test/read.cgi/tech/1295273862/386 に新しいコードを書きましたので、
・汚いところ
・エレガントなところ
・イモなところ
を教えてください。
756デフォルトの名無しさん:2011/04/14(木) 20:37:52.38
>>753
コピペ厨だから触んないほうがいいよ
757デフォルトの名無しさん:2011/04/14(木) 20:45:23.83
>>753
◆QZaw5 5cn4c はまともな批判をされると常人の百倍ぐらいに苦痛に感じるらしい
要するに頭が狂っているので触らぬキチガイに祟り無し
758デフォルトの名無しさん:2011/04/14(木) 22:16:16.76
このソフトのバグを教えてくださいhttp://www1.axfc.net/uploader/Sc/so/224531
759デフォルトの名無しさん:2011/04/14(木) 23:09:15.67
◆QZaw5 5cn4cに有償モリタポで見てもらえば?
760デフォルトの名無しさん:2011/04/15(金) 05:17:12.94
誰がこんな糞グラマに金払うかよ
761デフォルトの名無しさん:2011/04/15(金) 06:35:31.96
ほっほっ
762デフォルトの名無しさん:2011/04/15(金) 10:32:46.05
doubleを見かける度になんとなく心でドーブルって読んでしまう奴って俺以外にもいる?

ポケモン金銀直撃の世代はみんな一度はやってると思うんだけど
763デフォルトの名無しさん:2011/04/15(金) 11:46:21.71
ダボゥ
764デフォルトの名無しさん:2011/04/15(金) 12:01:53.34
ドゥーブレ
765デフォルトの名無しさん:2011/04/15(金) 12:16:20.10
そんなこたぁない
766デフォルトの名無しさん:2011/04/15(金) 12:31:57.96
危険なプログラムが書けてしまうという表現を耳にするのですが
どういう意味でしょうか?
767デフォルトの名無しさん:2011/04/15(金) 12:32:14.59
ミッソー
768デフォルトの名無しさん:2011/04/15(金) 12:34:25.85
>>766
最近はOSがアプリに対する制限をいろいろかけてきてるので、
きっとその表現がされていたであろう文脈での危険なプログラムは
書けなくなったかと。
769デフォルトの名無しさん:2011/04/15(金) 12:34:51.71
簡単に他の領域を破壊できてしまう
770デフォルトの名無しさん:2011/04/15(金) 12:35:38.50
内心ローマ字読みはするね、正直

それを言わないのは正解を知っているからで
正解を知らない綴りに対しては赤っ恥を露呈する

続きはこちらでどうぞ
http://hibari.2ch.net/test/read.cgi/prog/1242268027/
771デフォルトの名無しさん:2011/04/15(金) 12:38:53.17
printf プリントフ
scanf スキャンフ
fget エフゲッツ
772デフォルトの名無しさん:2011/04/15(金) 12:39:12.48
>>766
危険なプログラム?
「核ミサイルの発射プログラム」とか
「不特定多数の人に結婚を申し込むプログラム」とか
そういうのを書けてしまうから非常に危険だね。
773デフォルトの名無しさん:2011/04/15(金) 12:39:51.78
>>766
「安全」を自分で作るための道具なので
始めからあったらすることがないのさ
774デフォルトの名無しさん:2011/04/15(金) 12:44:34.11
>>771
あるあるあるw@ww
775デフォルトの名無しさん:2011/04/15(金) 12:48:22.99
何を書いても完全に安全な言語とか存在するのか?
776デフォルトの名無しさん:2011/04/15(金) 12:49:27.54
極論乙。
Cが特に安全対策してないのは明白
777デフォルトの名無しさん:2011/04/15(金) 12:56:12.68
CでGUIってどうやるの?
778デフォルトの名無しさん:2011/04/15(金) 12:59:23.79
>>775
何に対して安全?

>>777
環境
779デフォルトの名無しさん:2011/04/15(金) 14:16:43.15
配列のポインタで
int a[ ];
int *p;
p=a;
みたいな感じの定義で、aはa[]の(最初の)アドレスで
この2行目、3行目をまとめて表すと
int *p = a;
となるんだけど、これはある意味厳密ではないけど慣例でやってるんだよね?
780デフォルトの名無しさん:2011/04/15(金) 14:32:41.86
厳密?
慣例?
質問の意味も意図も判らんが変数をきちんと初期化するのはいいことだ。
781デフォルトの名無しさん:2011/04/15(金) 14:35:21.73
>>779

int* p = a;

int*型変数を定義して代入。
782デフォルトの名無しさん:2011/04/15(金) 14:36:21.81
(int*) p = a;

おまえのためにわかりやすく括弧を付け加えてやる
783デフォルトの名無しさん:2011/04/15(金) 14:39:39.59
while文について質問です。


while文処理が行われてる時間においては

while(){}の

()内{}内の情報はstaticですか?
784デフォルトの名無しさん:2011/04/15(金) 14:41:35.88
情報は static ってどういうことを指してるの?
質問の意図がまったく見えない
785デフォルトの名無しさん:2011/04/15(金) 14:41:54.02
変数か?staticじゃねえよ。
main(){}なんかと同じだよ。
786デフォルトの名無しさん:2011/04/15(金) 14:46:28.02
>>784

while(){}の(){}内で例えば1回目ループの最終評価値がn=1とすると、
2回目ループの(){}内でも最初n=1ですか?

それでwhile(){}の処理が終了したとき、最終ループ内でのnの評価値
は保存されてますか?
787デフォルトの名無しさん:2011/04/15(金) 14:48:36.66
>>786
質問の意図が判らんが、少なくともそれをstaticとは言わない。
言葉で説明するのはもういいから判りやすいコードの断片を貼ってくれ。
788デフォルトの名無しさん:2011/04/15(金) 14:51:35.66
>>786
その変数のスコープの間は有効だよ。
変数のスコープは おおざっぱに言って { から } までの間

void foo()
{
 int n;
 while (nがうんたらかんたら) {
  int j;
  n と j 使ってなんかやる
 /* j は ここまで生きてる */
 }
 なんかやる
 おわりんぐ
 /* n はここまで生きている */
}
789デフォルトの名無しさん:2011/04/15(金) 15:04:46.14
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の値は??あれ?
791デフォルトの名無しさん:2011/04/15(金) 15:44:08.18
>>790

i をインクリメントした (結果が 10 になった)
i < 10 かどうか確認 不成立なので while から抜ける
i の値は 10


while の中で ”新たな別変数 s に 99" を代入してるだけで(厳密には初期化 だが) main 直後の s の値は変わらない
while から抜けた
s は 100 のまま
792779:2011/04/15(金) 16:12:30.41
>782でした
int (*p) = a; だと思ってたわ、型がワワナイ・・・って

例解C言語教科書(CQ出版社)やってんだけど、いい本だな
793デフォルトの名無しさん:2011/04/15(金) 16:29:55.01
取り敢えず初心者が躓く原因は日本語能力の低さだと言うことがよく判った。
きちんと読解できないし、説明できない。
プログラミング言語も言語である以上、似たような能力が必要なのだろうし。
794デフォルトの名無しさん:2011/04/15(金) 16:42:00.30
>>793
ついでに高脳なら能力の低いのが言った・書いたことから本質を見抜き、
適切なアドバイスできるがいまや日本は低脳だらけだからな
795デフォルトの名無しさん:2011/04/15(金) 17:25:02.00
能力が低いという表現を使いつつ低脳と呼ぶような馬鹿さ加減だから馬鹿にされるんだよ。
新しい言葉を使ってみた気になって悦に入っているのかもしれないが、底の浅さが丸見えだ。
796デフォルトの名無しさん:2011/04/15(金) 17:34:36.51
>とか<って名前は何て読むのでしょうか?
>は右大なり?
<は左大なり?
797デフォルトの名無しさん:2011/04/15(金) 17:42:38.57
大なり小なり
798デフォルトの名無しさん:2011/04/15(金) 17:45:09.38
for
do
while

の長所短所ってなんですか?
799デフォルトの名無しさん:2011/04/15(金) 17:46:28.17
doって何wwww
800デフォルトの名無しさん:2011/04/15(金) 17:49:16.46
今日はバカみたいな質問がやけに多いな
801デフォルトの名無しさん:2011/04/15(金) 17:49:37.12
>>796
#include<iostream> //いんくるーどあいおーすとりーむ
vector<int> //べくたーいんと
Class->Member //くらすのめんばー

俺はあまり読まないな。
802デフォルトの名無しさん:2011/04/15(金) 17:55:30.14
便乗で{}や[]ってなんて読んでいるんだ?

>>796
right/left angle bracket
803デフォルトの名無しさん:2011/04/15(金) 17:56:00.97
>>799
do while文のことです。
804デフォルトの名無しさん:2011/04/15(金) 17:59:16.83
>>802
list/dict
805デフォルトの名無しさん:2011/04/15(金) 18:00:10.60
do { } while(条件)  条件に関係なく 最低限でも1回は { } ブロック内を実行する
 やってみないと条件に関係する変数値が決まらない場合(do より前で適切な値が設定できるかどうか)
 マクロのお供 do { } while (0)

while(条件) { }   条件により { } ブロック内は実行されないかもしれない

for() { }  while のちょっと気の利いた機能が増えた版
806デフォルトの名無しさん:2011/04/15(金) 18:01:26.37
>>803
先ずはこれからだな
for(){
continue;
}
do{
continue;
}while()
continueしたらどこに飛ぶの?
807デフォルトの名無しさん:2011/04/15(金) 18:03:18.34
メモリの節約的には、while,do while,forの内どれが一番いいですか?
808デフォルトの名無しさん:2011/04/15(金) 18:06:19.36
対して変わらない
809デフォルトの名無しさん:2011/04/15(金) 18:07:29.70
if (a > b)だったらa大なりbって読みますが
このような条件式ではなく、単純に >と<の読み方が判りません
810デフォルトの名無しさん:2011/04/15(金) 18:19:44.12
不等号(より大) greater-than sign
不等号(より小) less-than sign
811デフォルトの名無しさん:2011/04/15(金) 18:20:06.59
>>802
アングルブラケットを出すぐらいだからカーリーブラケット、スクエアブラケットでいいんでないかっておもうけど。
812デフォルトの名無しさん:2011/04/15(金) 18:42:06.79
Visual Studio Proの試用版を使ってNTL

http://mailsrv.nara-edu.ac.jp/~asait/cpp/ntl/ntl.htm
http://www.shoup.net/ntl/

をコンパイルしようとしていますが、

cstdlib(28): error C2061: 構文エラー : 識別子 'strtod'

などというエラーが100個以上出てコンパイルできません。
まだ使い始めたばかりなのでよくわかりません。スタティック
ライブラリを作りたいのですがどうすればいいでしょうか?
ちなみにLinuxやMinGWではうまくいきます。よろしくお願いします。
813デフォルトの名無しさん:2011/04/15(金) 19:11:07.49
もっと上で、インクルードエラーとかでてないの
814 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/15(金) 19:15:04.51
多重インクルード防止にして何回でもincludeしてやる
815デフォルトの名無しさん:2011/04/15(金) 19:49:48.57
a>>bと

a>>=bの違いを教えてください。

どちらも一緒なのでは?
816デフォルトの名無しさん:2011/04/15(金) 19:50:39.46
あほ
817デフォルトの名無しさん:2011/04/15(金) 19:51:49.87
>>815
良い加減うざい
818デフォルトの名無しさん:2011/04/15(金) 20:16:55.03
a>>=b

a = a>>b
と同じ
819デフォルトの名無しさん:2011/04/15(金) 20:52:54.12
>>817
お前が一番うざいと思われてるよ
820デフォルトの名無しさん:2011/04/15(金) 20:54:51.23
>>819
そうでもない
821デフォルトの名無しさん:2011/04/15(金) 21:00:31.17
>>820
まじでか・・・orz
822デフォルトの名無しさん:2011/04/15(金) 21:04:25.64
>>821
死ね
823デフォルトの名無しさん:2011/04/15(金) 21:54:28.83
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;
824デフォルトの名無しさん:2011/04/15(金) 22:16:16.31
>>823
そりゃ初めの方が速いだろ。しかし十分な精度を出すためにlognを求める方が時間食う。
825デフォルトの名無しさん:2011/04/15(金) 22:49:10.10
>>823
先ずはtgamma()と較べるんだ。
826デフォルトの名無しさん:2011/04/15(金) 22:58:04.60
D&Dの作り方がわかるお勧めの本があったら教えてください。
「オレオレ電子署名」というソフトを作ります。
827デフォルトの名無しさん:2011/04/15(金) 23:07:35.74
多倍長の数字をファイルに書き込む場合どの関数を使えばいいでしょうか?
cout をファイルに書き込む感じですがリダイレクトしたくないです。
828デフォルトの名無しさん:2011/04/15(金) 23:14:45.77
>>826-827
つスレタイ
829デフォルトの名無しさん:2011/04/16(土) 00:03:43.39
プログラミングやってるけど、演算処理の実装は本当につまらんな・・
数字をソートするとかつまらないにもほどがあるだろ。

プログラミングを使う事によって、どんなゲームやアプリが作れるかが重要
なんじゃないだろうか?


それにプログラミング言語の綺麗さとか馬鹿じゃないの?
何の得になるの。
830デフォルトの名無しさん:2011/04/16(土) 00:18:07.34
手早く書けるか 間違いなく書けるか 保守が容易か
そういう観点がある
831デフォルトの名無しさん:2011/04/16(土) 00:18:23.20
>>829
小さな技術の積み重ねでゲームやアプリが作られているという内情を理解するのが面白い。
色んな人の努力と学究の成果の上でゲームやアプリが成立していると思うと愛おしい。
偉業を達成した人の第一歩目はどんなだったろうと考えると、簡単なソートプログラムでも、
遥かなる山の頂の風を感じて心が舞い上がる気持ちだ。

言語は思考の道具だから、奇麗な言葉を使えばそれだけ奇麗なモノを生み出す事が出来る。
奇麗なモノは誰にでも分かり易くて、後から手直ししたり機能を追加したりするのが楽で、
みんなが幸せになれる。


・・・みたいな話が聞きたい訳じゃないよねw
832デフォルトの名無しさん:2011/04/16(土) 00:22:34.35
足し算はできないけど積分はできます。みたいな
833デフォルトの名無しさん:2011/04/16(土) 00:45:04.03
>>829
つJava
辛くない/楽が出来る != つまらなくない/楽しい
834デフォルトの名無しさん:2011/04/16(土) 00:50:47.89
>>829
そんならあなたにはPerlお勧め。
835デフォルトの名無しさん:2011/04/16(土) 00:52:46.18
>>829
それはまず、おまい自身がゲーハーとクロスを用意してから言うことだな
836デフォルトの名無しさん:2011/04/16(土) 00:55:21.06
>>829
バーカ、商用プログラムの中身の80%以上はエラー処理とログの書き出し処理だ。
お前みたいなホビーでやってるカスにはわからんだろうが。
837デフォルトの名無しさん:2011/04/16(土) 00:55:51.17
>小さな技術の積み重ねでゲームやアプリが作られている
あっているようで完全な間違い
小さな技術の積み重ねでもゲームやアプリめいたものが作
れるようになったのは最近のこと
MS-BASIC上のゲーム?1980年代前半だろ?
最近のことじゃんw
838デフォルトの名無しさん:2011/04/16(土) 01:19:40.96
それ、あってるってことじゃんw
839デフォルトの名無しさん:2011/04/16(土) 01:22:30.27
楽にゲーム作りたいだけならCを選ぶのが間違い
ツクールでもMMFでも使えばいい
840デフォルトの名無しさん:2011/04/16(土) 01:31:30.06
つまり仕事でプログラミングしてもつまらんということだよ
841デフォルトの名無しさん:2011/04/16(土) 06:48:57.27
仕事はつまらんということか
842デフォルトの名無しさん:2011/04/16(土) 07:28:36.01
829 は仕事とは言ってないようだが
843デフォルトの名無しさん:2011/04/16(土) 09:08:04.58
829なんかどうでもいいし
844デフォルトの名無しさん:2011/04/16(土) 10:56:01.61
まあ仕事はつまらんけどね
845デフォルトの名無しさん:2011/04/16(土) 11:05:41.04
プログラマの仕事って99%のつまらなさの中に1%の楽しみを見つけ出すようなものだと思ってる。
>>829みたいに楽しい事だけしたいやつは向いていないし、迷惑だから職場とかチームに入って来て欲しくない。
せいぜい己の欲求を満たす楽しさ満載のクズプログラムを書いてマスかいてろ、って感じ。
846 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/16(土) 11:12:20.43
viでコード編集してるだけで楽しいんだけど
847デフォルトの名無しさん:2011/04/16(土) 11:39:04.74
えっと、>>829>>845 と一緒に仕事させて欲しいお願いしてたの?
848デフォルトの名無しさん:2011/04/16(土) 11:40:28.98
えっと、>>845>>829 と一緒に仕事させて欲しいお願いしてたの?
849デフォルトの名無しさん:2011/04/16(土) 11:49:50.15
組込は楽しいぞ
ハードぶっ叩いたり、非同期処理考えたり
コードだと、如何にグローバル減らせるか考えたり
850デフォルトの名無しさん:2011/04/16(土) 11:53:16.75
> ハードぶっ叩いたり
衝撃の道具は何で?
851デフォルトの名無しさん:2011/04/16(土) 12:22:15.21
viって慣れたら魔法が使えるの?
852829:2011/04/16(土) 12:29:06.68
すまんかった。

ゲーム好きで、ゲームを作るために複雑なアルゴリズムが必要ならば
結局演算処理自体も凝らねばならんのよね。


矛盾してるよね、ごめんw


でもゲーム性が優れていて快適に動くならプログラムをそれ以上凝る必要なくね?
あくまでゲーム性を追求するという動機があってプログラムを凝るんでしょ???

で聞きたいんだけど職業がプログラマーの人は具体的にどんな仕事してるの?
何のプログラム書いてるの?ホームページとか?そくらいしか思いつかん・・


だから最初から演算実装を頑張ろうなんて思わないんだよね。
ちなみに俺はプログラマーじゃないよwww
高3だからw

853デフォルトの名無しさん:2011/04/16(土) 12:32:26.13
ゲーム性を考えるのはマの仕事じゃありません
854デフォルトの名無しさん:2011/04/16(土) 12:39:49.88
>>852
>何のプログラム書いてるの?

コンテックやインターフェースのボードを使った検査装置や制御装置。
データベースと連動して製品情報として判定結果を残したり、
画像処理で製品の表面荒さの比較検査を行なったり。
一本、400万からご購入頂けます、的な。

ホームページ?ゲーム?そんなのは学生のバイトに毛が生えた程度だろ。
855デフォルトの名無しさん:2011/04/16(土) 12:42:49.17
ほい、職業プログラマ兼システムエンジニアが呼ばれてきましたよ。
私ゃ只管他人が作った数値演算系のプログラムを如何に効率よく動かすか、そればっかりやってますな。
理論は設計者に任せて、そのアルゴリズムをGPUを使ったり複数台のPCを並列動作させたりして
コストパフォーマンスを上げることで仕事としてますよ。
# 他のこともやっているけどね。
856デフォルトの名無しさん:2011/04/16(土) 12:51:04.58
ゲームプログラマって、つまるところ合法ドラッグの製造と変わらないような気がするね。
「息抜き」と言えば聞こえがいいけど、社会貢献度という点では「無」に等しいわな。
857デフォルトの名無しさん:2011/04/16(土) 12:53:04.99
ゲーム派生コンテンツを考えるとそれなり。娯楽すべてを否定するなら話は別だけど。
858デフォルトの名無しさん:2011/04/16(土) 12:57:34.51
ゲームなんて括りとしてはパチンコや競艇や競馬と同じ。
娯楽はしょせん娯楽に過ぎ無いのにゲーム関連作ってる奴らってアーキテクト的な芸術家ぶったところがあるからなおさらタチが悪い。
859デフォルトの名無しさん:2011/04/16(土) 12:58:43.34
お前らゲームプログラマdisってんのかw
860デフォルトの名無しさん:2011/04/16(土) 12:59:28.16
ゲーム作ってるやつにでも噛まれたのか?
861デフォルトの名無しさん:2011/04/16(土) 13:05:40.54
>>852
>ゲーム好きで、ゲームを作るために複雑なアルゴリズムが必要ならば
>結局演算処理自体も凝らねばならんのよね。
>あくまでゲーム性を追求するという動機があってプログラムを凝るんでしょ???

↑こういうのとか、ゲームプログラムを高尚なものと勘違いしている良い例といえるな。
862 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/16(土) 13:09:19.46
数式が美しいようにプログラムも美しい
つまりはそういうことです
863デフォルトの名無しさん:2011/04/16(土) 13:12:14.84
ゲームプログラマといってもピンキリじゃね
どうせ娯楽を商売にするんなら、いままで見たこともないような新しい表現や体験を作り出して俺らを楽しませてくれよ
3DSとかキネクトとか色々ハードも出てきて何か出来そうじゃん?
864デフォルトの名無しさん:2011/04/16(土) 13:13:35.55
>>861
え?テンプレじゃないの?

>事務処理好きで、事務処理に複雑なアルゴリズムが必要ならば
>結局演算処理自体も凝らねばならんのよね。
>あくまで事務処理を追求するという動機があってプログラムを凝るんでしょ???

>科学技術計算好きで、科学技術計算に複雑なアルゴリズムが必要ならば
>結局演算処理自体も凝らねばならんのよね。
>あくまで科学技術計算を追求するという動機があってプログラムを凝るんでしょ???

どうとでもなるな
865デフォルトの名無しさん:2011/04/16(土) 13:24:06.81
スペインでアルハンブラ宮殿のイスラム様式の天井を見たとき思ったよ。
数種類の小さなパーツの組み合わせだけで曼荼羅のように
様々な模様を持った大きな構造物になっているんだけど、

入力→出力、パラメータ→計算→結果・・・
プログラムも同じようにたいした事無小さなパーツの組み合わせなんだよね。

ttp://obase-arch.img.jugem.jp/20091026_759021.jpg
866デフォルトの名無しさん:2011/04/16(土) 14:29:58.98
『テトリスを1時間で作る』ニコニコ動画を参考にしながら作っていたのですが、
 ミスが分かりませんorz

分かる人はいますか?(C言語で製作の初心者)

ttp://blog-imgs-45.fc2.com/x/c/k/xcken/test.txt
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のメンバーです。
868デフォルトの名無しさん:2011/04/16(土) 16:58:08.38
>866
Windowsの話だろうから、環境依存OKスレが良いと思う。

>867
>10個とも全部最後に入力した名前に
>なってしまいます・・・どうしてでしょうか?

そうなるようにプログラムしているんだろうとしか言えない。

>一番簡単なリスト構造で先頭に入れるプログラム作っていただきませんか?
丸投げなら宿題スレへ。
添削して欲しいならコードを晒す。
869デフォルトの名無しさん:2011/04/16(土) 17:02:34.03
870デフォルトの名無しさん:2011/04/16(土) 17:06:00.88
winAPIって何が出来るようになるの?
871デフォルトの名無しさん:2011/04/16(土) 17:16:54.29
>>870
お前みたいなクズをプログラムに寄せ付けないことが出来るようになる
872デフォルトの名無しさん:2011/04/16(土) 17:19:31.06
>>871
すみませんでした。
ちゃんと調べてきます。
873デフォルトの名無しさん:2011/04/16(土) 18:37:30.92
>>868
晒したくはありません・・・
どうしてもです。何故なら名簿作りの課題なんですが全部コード書くといろいろ
クラスメートとかに知られたら嫌だからです。


考えられるミスとしては、名前の保存を配列ではなくchar*としてるからかもしれません・・
何か原因はありますか?
874デフォルトの名無しさん:2011/04/16(土) 19:01:26.19
逝け
875デフォルトの名無しさん:2011/04/16(土) 19:04:38.78
名前読み込むときに静的配列に読み込んでから
name = buffer;
とでもしてるんだろ
876デフォルトの名無しさん:2011/04/16(土) 19:05:27.14
>>873
じゃあその考えられるミスを検証することだな
例えば %s で char* の中身を表示する代わりに %p で char* のアドレスを表示してみるとか
877デフォルトの名無しさん:2011/04/16(土) 19:09:57.65
エスパーをご所望のようです
878デフォルトの名無しさん:2011/04/16(土) 19:39:40.64
>>873
お前が組んだようにしか動かないからどこにも間違いなんか無いよ
879デフォルトの名無しさん:2011/04/16(土) 19:57:23.83
>>873
>考えられるミスとしては、名前の保存を配列ではなくchar*としてるからかもしれません・・

間違いなくそれだよ原因は。
解ってるなら直せよ。
880 ◆QZaw55cn4c :2011/04/16(土) 20:02:10.49
>>873
一つの案を http://hibari.2ch.net/test/read.cgi/tech/1295273862/ に書きましたので参考になればいいのですが。
なお、モリタポを請求することはありません。

それでもわからなければ、これはもうソースを曝すのが一番手っ取り早いと思います。
さんざんなコメントがつくかもしれませんが、めげずに頑張ることです。
私なんか動物以下の扱いになっています、ここ 1〜2年、コードを量産しているのに。
881デフォルトの名無しさん:2011/04/16(土) 20:03:16.80
>>880
しねカス。
882デフォルトの名無しさん:2011/04/16(土) 20:12:05.44
やべーやべーw
883デフォルトの名無しさん:2011/04/16(土) 20:34:09.28
コードって量産しちゃいかんだろ
884 ◆QZaw55cn4c :2011/04/16(土) 21:23:01.45
>>883
自然にそうなってしまいました。今、過去アップしたファイルを積んでいるフォルダをのぞいてみると、ファイル数は 300 超えています。
いろいろとコメントをいただいて修正した最終版ばかりなのですが、そうなっています。
885デフォルトの名無しさん:2011/04/16(土) 21:32:55.27
つかクラスメイトに知られるのがイヤだから晒さないとかw
普通他人の組んだコードなんて興味ねーよwわざわざコピってググって笑おうなんてヒマな奴の集まりなのかお前の学校はw
886 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/16(土) 21:40:59.19
もっと何かの役に立つソフトウェアを作れよw
勉強用の小規模なプログラムを300個作ったってそれが何なんだよw
887デフォルトの名無しさん:2011/04/16(土) 21:47:25.34
課題質問してる時点でどうなの?
888 ◆QZaw55cn4c :2011/04/16(土) 21:50:23.85
>>886
うん、それはそうなんですね。
お題をみつける能力は、これはこれで一つの能力なんですが、私にはそれは欠けているんでしょうね。
というか、宿題スレでちゃちゃっと 100 行ぐらいのコードを書いて結構満足してしまっているというか。

今、個人的なお題は、「クライアントはプリントスクリーンを定期的におこなって、サーバーに送り込む」という奴です。
なんとかスクリーンキャプチャできるようになりました。32bit DIB section はつかえる奴だと認識しました。
889デフォルトの名無しさん:2011/04/16(土) 21:55:46.17
お前の日記帳じゃないから
890デフォルトの名無しさん:2011/04/16(土) 22:05:20.23
>>888
悪質なウィルス作ってるようにしか聞こえないんだが
891デフォルトの名無しさん:2011/04/16(土) 22:05:45.95
ウイルスでもつくるのか
892デフォルトの名無しさん:2011/04/16(土) 22:09:05.32
欠落してるのはお題を見つける能力だけじゃないよね。
「クライアントはプリントスクリーンを定期的におこなって、サーバーに送り込む」
ならそこからどう膨らませていくか、それも欠落してる。
作ったら作りっぱなしなんだろ。
プログラマ全体の8割が何を作ったら良いかわからない奴等。
残った2割のうちの8割が作ったものを膨らませかたを知らない奴等。
そこで残った奴等のうちのまた8割がろくでもないデバッグに追い回され退屈な雑プログラムに従事していて
最期に残った2割が真に目的をもって道を切り開いてゆく奴等。
893 ◆QZaw55cn4c :2011/04/16(土) 22:10:47.65
>>890
さすがにウィルスは無理ですね。まず OS の穴をみつけないと。
いや、最近は、winny にのっけてユーザーにクリックさせる手合いもウィルスとかよぶそうですが、そうなのならウィルスのレベルも落ちましたね。
894 ◆QZaw55cn4c :2011/04/16(土) 22:15:05.85
>>892
>そこからどう膨らませていくか
今ひとつイメージがわきませんが、たとえば IPv6 に対応させちゃる、とかサーバー側はマルチクライアントにする、とか、伝送路中は暗号化・圧縮化・HTTP にのっけて
ファイヤーウォール超え、とか、そういうのを「膨らませる」、というのでしょうか?
いまいち「膨らませる」がよくわかりませんが、よろしければ、ひとつ。
895デフォルトの名無しさん:2011/04/16(土) 22:18:11.59
せめてVNCの真似事くらいのものは作ってみるとかさ
896 ◆QZaw55cn4c :2011/04/16(土) 22:22:01.80
>>895
んー、面白そうですね。
897デフォルトの名無しさん:2011/04/16(土) 22:22:48.52
クライアントはプリントスクリーンを定期的におこなって、サーバーに送り込む
のが目的の人なんていない
それを使って何ができるのかってことでしょう
自分もうまい案は浮かばないが「日々の作業記録が画像として自動で残ります」っていうソフトにするとか
やりたいことが決まると次に実装する機能も見えてくるし
898デフォルトの名無しさん:2011/04/16(土) 22:30:10.70
>>897
>それを使って何ができるのかってことでしょう

つまりそういう事だよね。
勉強用の小規模なプログラムを300個作ったってそれだけじゃ
ただ積み重なっただけで他の誰の役にも立たないクズプログラムだ。
味見のためだけの料理を繰り返し作るようなもん。
899デフォルトの名無しさん:2011/04/16(土) 22:40:34.79
つまり>>894は「この肉へのコショウのフリ加減が絶妙〜」とか言ってるだけなんだよね。
客のテーブルに載せるひとつの皿として完成していない。
もしくは皿ごとにバラバラで、カップルの特別な夜に華を添えるディナーのコースとして出来上がっていない。
900 ◆QZaw55cn4c :2011/04/16(土) 22:51:19.50
なるほど。
となるとマーケティングとかマーチャンダイジングとか、その手の頭の回し方も必要、ということですね。
コード書きながら考えときます。
901デフォルトの名無しさん:2011/04/16(土) 23:09:04.58
>>900
職業プログラマ? それとも単に趣味グラマ?
902デフォルトの名無しさん:2011/04/16(土) 23:15:12.10
UU
903デフォルトの名無しさん:2011/04/16(土) 23:36:01.09
モリタポ有償スレから出てくんなよw
904デフォルトの名無しさん:2011/04/16(土) 23:50:01.94
ここで質問してたクラスメイトに知られたくない君がモリタポ基地外にアイドルスレで質問しててわろたw

http://yuzuru.2ch.net/test/read.cgi/idol/1298418299/l50
905 ◆QZaw55cn4c :2011/04/17(日) 00:01:52.63
>>901
趣味です。だから「売れる」という要素はあまり考えてこなかったのです。皆さんのお話は参考になります。
906デフォルトの名無しさん:2011/04/17(日) 00:03:02.86
>>905
他スレに迷惑かけんなよクズ
907デフォルトの名無しさん:2011/04/17(日) 00:51:09.86
>>905
マは開発屋でマーケティング、マーチャンダイジングが解るわけないだろ
料理のメニュー、値段はマが決めるんじゃないからな。マは言われたものを作るだけ

日本に多い下請け会社は売れるもののマーケティング、マーチャンダイジングなんて禄に出来ない
から下請けやってるんだか(言われたものを基本的に作るだけ)。
それが出来るなら自社ソフト製品を開発して売りまくっている。
908 ◆E7idzvHwo6 :2011/04/17(日) 00:57:55.31
Test
909デフォルトの名無しさん:2011/04/17(日) 01:05:21.17
>>904
このスレの先で見たコードがかなり異次元でわろた、こんなもんコンパイル通る訳ねーだろw
910 ◆QZaw55cn4c :2011/04/17(日) 01:16:20.73
>>907
趣味でやっており、皆に使ってもらえるフリーソフトを作ることを目標としています。現在はそのための体力づくりの日々です。
「売れるかどうか」という極めて難しい目標は当面考えませんが、「使ってもらえるかどうか」くらいなら手が届きそうですし、この問題もマーケティングに含まれそうな気がします。
職業でなさるときはマーケティングまでは考慮することはないのですか?とすると、フリーソフトを作るときには、規模は別にせよ実は、より経営に近い、幅広い思考が要求されるのですね。
911デフォルトの名無しさん:2011/04/17(日) 01:20:32.32
体力づくりなんてやるよりとっとと作ってみるのが一番だけどな

と、中学の頃から7年くらい入門本を卒業出来なかった俺が言ってみる。
912デフォルトの名無しさん:2011/04/17(日) 03:37:41.50
ほっほっ
913デフォルトの名無しさん:2011/04/17(日) 06:59:41.50
>873
>晒したくはありません・・・
>どうしてもです。何故なら名簿作りの課題なんですが全部コード書くといろいろ
>クラスメートとかに知られたら嫌だからです。

再現する最低限のコードを公開しなよ。原因も絞れるから、それだけで
バグが取れることもある。

宿題スレへ丸投げでもいいが、問題を晒す必要があるぞ。
914デフォルトの名無しさん:2011/04/17(日) 10:27:29.02
情報を小出しにしてバグを取ってもらおうなぞ虫の良すぎる話だ。
東電の隠蔽体質とおんなじだぞ。
問題の箇所を特定するためにプログラムは全部呈示してもらう必要がある。
自分の思っていたのとは全く別の場所での間違いが遠く離れた場所でバグ
として出てくる事は良くある事だ。
915デフォルトの名無しさん:2011/04/17(日) 10:33:23.30
事情を知ってる人には既にばればれだろうなw
916デフォルトの名無しさん:2011/04/17(日) 10:33:46.98
もう女性アイドルのスレで教えてもらってんだから良いだろw
917デフォルトの名無しさん:2011/04/17(日) 11:43:17.07
2011-11-02 23:16:35<>abc<>131325
日時・ID・パスワードで上記の書式が各行に1行づつありまして、これが100万行あります
日付は↑の通りで各桁は2桁固定、IDとパスワードは半角英数字の小文字のみ
これらを日時順の若いのを上にソートしたいのですがどのようなソートが効率よいでしょうか?
918デフォルトの名無しさん:2011/04/17(日) 11:45:08.64
俺はマージソートが好き
919デフォルトの名無しさん:2011/04/17(日) 11:46:13.95
>>917
『C/C++の宿題片付けます 147代目』
http://hibari.2ch.net/test/read.cgi/tech/1301553333/

ここまでしてあげないとわからないバカなのか?
920デフォルトの名無しさん:2011/04/17(日) 11:48:39.20
>>916
実は例の小池里奈スレは俺が個人的にナビゲートロックしているスレだった
本当に偶然だけど、しかし何をやってるんだよあのアホどもは
921デフォルトの名無しさん:2011/04/17(日) 11:51:41.63
>>917
日付をtime_tの配列に変換してそれでqsort() or std::sort()ソートすればいいですね
構造体にぶち込むといいと思います
そしてそのポインタの配列を作ってそれをソートすればデータの移動に掛かる時間が
大幅に削減出来ます
922デフォルトの名無しさん:2011/04/17(日) 11:53:49.80
>>918
データが多すぎてメモリに入り切らない場合は外部マージソートが一番高速ですが
それでもメモリ内でソートするのにくらべるとひどく時間がかかりますね
どの程度のデータ容量になるのか計算してメモリ内で済むならそちらの方がいい
923デフォルトの名無しさん:2011/04/17(日) 11:55:23.82
>>919
質問をよく読まないバカ発見
924デフォルトの名無しさん:2011/04/17(日) 11:56:25.89
100万件ならバブルソートじゃ問題あるの?
925デフォルトの名無しさん:2011/04/17(日) 11:56:36.50
まとめてDBへぶん投げてクエリ投げてデータ返してもらう方が圧倒的に早いよ
926デフォルトの名無しさん:2011/04/17(日) 11:57:30.00
>>924
100万件でバブルソートやってみろよ
気が遠くなるぞ
927デフォルトの名無しさん:2011/04/17(日) 11:58:18.82
だからDBに任せろって
928デフォルトの名無しさん:2011/04/17(日) 11:58:43.28
>>925
DBを持ってる環境の人かどうか分からないし、DB機能を備えているコンパイラ
エディションは最上位クラスになるし、ちょっとその答えはどうかと
929デフォルトの名無しさん:2011/04/17(日) 12:02:36.41
>>928
バカジャネーノ?
MySQLだってPostgreSQLだって無償で配布されてんだしべつに考える必要ないだろ。
行が増えたり、特定の条件で検索するなんてのも楽になる。
930デフォルトの名無しさん:2011/04/17(日) 12:02:57.06
>>917
100万行を一度読み込み、
日付とデータ位置情報の配列を作る。
日付でソートする。
ファイルのデータ位置を読み込み、出力する。

こんなとこかな?
931デフォルトの名無しさん:2011/04/17(日) 12:03:24.43
質問の題意に従えよ。
どんなソート方法か聞いてんだから
932デフォルトの名無しさん:2011/04/17(日) 12:04:01.41
>>919
恥さらし乙
933デフォルトの名無しさん:2011/04/17(日) 12:05:36.03
ソート方法よりも、IOの方で時間がかかるんじゃないかな?
934デフォルトの名無しさん:2011/04/17(日) 12:06:07.96
>>931
だからSQLでソートさせる方法が最善だっての。バカかお前は。
935デフォルトの名無しさん:2011/04/17(日) 12:12:59.13
SQLのソートが速いわけがない
あほか
936デフォルトの名無しさん:2011/04/17(日) 12:13:26.66
ニヤニヤ
コードでマスかきたいだけなのか、ソートした結果が欲しいのかはっきりしろよw。

937デフォルトの名無しさん:2011/04/17(日) 12:19:24.44
in place merge sortなるものでいいんじゃないの?
938デフォルトの名無しさん:2011/04/17(日) 12:21:27.96

速度はメモリ上では、自作 > STL > DB

ディスク使用では、自作 > DB

だろう。
STLにディスクを使用するソートやmapはない。
939デフォルトの名無しさん:2011/04/17(日) 12:22:40.89
SQLは、大規模データ、汎用データ、同時アクセスなどを実現するために速度は遅い。
940デフォルトの名無しさん:2011/04/17(日) 12:28:51.92
>>939
ほう、で?その汎用なアプリに勝てるだけの速度のものをお前はひょいと小手先で作れると?
クラスの概念も無い標準のCで。
941917:2011/04/17(日) 12:30:04.19
データはファイルに記録されてます。
データはファイルの終端に追記される形で増えていくのですが、必ずしも日時順で追記されるわけではないのでソートしたいと思っている次第です。
記録はファイルベースですがソートするときだけデータベースのほうが早いのであれば、作業するときのみデータベースに入れてソートすることも検討したいと思います
記録自体はファイルベースで行います
942デフォルトの名無しさん:2011/04/17(日) 12:31:21.75
>>940
作れないよ、無能で悪かったな
943デフォルトの名無しさん:2011/04/17(日) 12:33:24.17
>>941
それなら、最初からDBに格納がよいかと
944デフォルトの名無しさん:2011/04/17(日) 12:36:01.54
データベースの使い方間違えてるぞ。
ソートするだけの為に、遅いデータベース使うなよ。
945デフォルトの名無しさん:2011/04/17(日) 12:39:37.58
これをよく使用しているが。なかなか速い。メモリ上のソートのみだけで巨大なのは無理だが。

http://www.vector.co.jp/soft/win95/util/se127691.html
946デフォルトの名無しさん:2011/04/17(日) 12:48:17.74
宣伝くせえ
947デフォルトの名無しさん:2011/04/17(日) 12:52:47.39
>>917
ソートコマンドじゃだめなの
948デフォルトの名無しさん:2011/04/17(日) 12:54:09.22
>>928
> DB機能を備えているコンパイラエディションは最上位クラス
どういうこと?
949デフォルトの名無しさん:2011/04/17(日) 13:00:43.96
年単位でファイル分割とかしたら
950デフォルトの名無しさん:2011/04/17(日) 13:02:38.59
インサーションソートが正義
安定じゃないソートは全て欠陥アルゴリズム
951デフォルトの名無しさん:2011/04/17(日) 13:11:33.24
つーか日曜日に2ちゃんに集ってる奴等がどんなに頭ひねったところで
いわゆる標準的に知られているサーチの方法以上に効率のいい方法なんて出て来るわかないだろ。
検索だけで一本の論文が書けるほどのテーマだっつーのに生半可が考えてどうなるもんでもなかろううが。
952デフォルトの名無しさん:2011/04/17(日) 13:18:04.02
大規模なソートなら、たとえば100ギガ = 20メガ*5000個と分割して
各20メガをメモリ上でソートしてディスクへ書き出す。
あとはキャッシュを効かせて、5000個をマージしていく。
953デフォルトの名無しさん:2011/04/17(日) 13:25:12.04
2ちゃんで聞いてるんだから、生半可が考える程度で十分
954デフォルトの名無しさん:2011/04/17(日) 13:31:52.17
>>953は良いことを言った
955デフォルトの名無しさん:2011/04/17(日) 13:32:09.67
ボゴソートでいいじゃん
956デフォルトの名無しさん:2011/04/17(日) 13:33:50.26
>>951
さすが日曜日に集まってきただけはあるよね。
サーチじゃなくてソートの話だ。
957デフォルトの名無しさん:2011/04/17(日) 13:35:47.61
>>956
他人の揚げ足取る時だけは元気だな。有益なコードは何一つ提示しないくせに。
958デフォルトの名無しさん:2011/04/17(日) 13:37:05.06
そうか?今回の内容でソートコマンドを使う以外にいい策はおもいつかなんだよ。
コードを書いてたらまだソートできてないかもしれないけど。。
959デフォルトの名無しさん:2011/04/17(日) 13:38:58.33
それよりも揚げ足って。まさかの釣りじゃない宣言か。
960デフォルトの名無しさん:2011/04/17(日) 13:39:10.61
>>957
自分は有益なコードを提示してるような口ぶりだな。
961デフォルトの名無しさん:2011/04/17(日) 13:41:59.57

「これ電源切った方が早くないっすか?」(「大捜査線THE MOVIE3ヤツらを解放せよ!」より)

人間はとかく目の前の問題に注目するあまり事を難しく考え過ぎて
ついつい最も簡単な解決策を見逃しがちだ。
962デフォルトの名無しさん:2011/04/17(日) 13:45:18.32
そんなあなたにライト、ついてますか?
963デフォルトの名無しさん:2011/04/17(日) 13:46:47.47
チーズなら俺が食ったよ
964デフォルトの名無しさん:2011/04/17(日) 13:48:29.49
つまり効率のいいソートのプログラムを考えるより
ソートしないで済む方法を取った方が解決の早道だったりするわけだ。
965デフォルトの名無しさん:2011/04/17(日) 17:42:38.39
http://codepad.org/Moj23gdP

100万行の>>917を生成するプログラム作ったからプログラムやDB使って
皆で時間を競おうぜ!
966デフォルトの名無しさん:2011/04/17(日) 17:47:22.68
>>965
>"%04d-%02d-%02d %02d:%02d:%02d %s %s"
惜しいw
967デフォルトの名無しさん:2011/04/17(日) 17:57:11.34
>>965
genrandがおかしいよ
968デフォルトの名無しさん:2011/04/17(日) 18:00:03.31
>>965
17秒。>>945のそ〜太では。8年くらい前の低価格PC
969デフォルトの名無しさん:2011/04/17(日) 18:05:33.21
適当だけど
http://codepad.org/sCU9iEEV

こっちも適当だけど
http://codepad.org/fIJmmwrv
970デフォルトの名無しさん:2011/04/17(日) 18:10:01.55
SQLServer2008で3秒
971デフォルトの名無しさん:2011/04/17(日) 18:12:59.24
>>970
かかりすぎじゃね?
972デフォルトの名無しさん:2011/04/17(日) 18:23:00.57
ありゃ
<> ってスペースじゃないのか
973デフォルトの名無しさん:2011/04/17(日) 18:23:41.45
sortコマンドで実行したら、 4.72 seconds
974デフォルトの名無しさん:2011/04/17(日) 18:30:14.06
windowsのsortってどんなアルゴリズムなんだろう
cygwinのtimeで計ったらユーザCPU時間が0.016sだった
cygwinのsortだと59sくらいかかってる
975デフォルトの名無しさん:2011/04/17(日) 18:36:54.18
>>972
2chのdatファイルも<>がデリミタ。昔はよく見たデリミタだったように思う。
976デフォルトの名無しさん:2011/04/17(日) 18:41:16.64
乱数に時間食うだろうと速くしてみた。

#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);}
977デフォルトの名無しさん:2011/04/17(日) 18:43:22.77
速くする対象が違うわろた
978デフォルトの名無しさん:2011/04/17(日) 18:47:40.42
postgresqlが10秒くらい@そこそこの仮想マシン
979デフォルトの名無しさん:2011/04/17(日) 18:49:15.80
メモリに乗らない量でやらないと、ソートの工夫する意味ねえだろ。
最低でも1ギガはないと。
これ位だとアルゴリズムの有意差がはっきりする。
980デフォルトの名無しさん:2011/04/17(日) 18:54:56.32
% 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

ソートコマンドこれであってる?
981デフォルトの名無しさん:2011/04/17(日) 18:55:35.68
ところでcの関数の一覧が載ってるリファレンスみたいな辞書が一冊欲しくなったんだけど
何かオススメ無いかな?
982デフォルトの名無しさん:2011/04/17(日) 18:57:53.30
>>979
優位性は目的を決めないと意味をなさないだろ
いつぞや円周率の計算が速い CPU が「優位」だよという皮肉があったように
983デフォルトの名無しさん:2011/04/17(日) 19:05:44.18
>>981
C/C++辞典
984デフォルトの名無しさん:2011/04/17(日) 19:14:16.59
>>975
了解
しかし単純にqsort使うと馬鹿遅いな
time_tでソートしてるだけなのに
985デフォルトの名無しさん:2011/04/17(日) 19:22:35.17
全部メモリに読み込んで、strcmpでqsortするプログラムで
$ time ./a pass.txt > out.txt
real 0m1.978s
user 0m1.295s
sys 0m0.124s
だった
986デフォルトの名無しさん:2011/04/17(日) 19:26:11.20
>>985
えらく速いな
Core i7かい?
データが全部2次キャッシュに乗ってるとか
987デフォルトの名無しさん:2011/04/17(日) 19:37:10.90
http://codepad.org/ml2b3vRi

このプログラムを使うとソートに1分ほどかかっちゃうけどお前らどれ位?
構造体のポインタをソートしているからデータの移動は最小限のはずなんだが
988デフォルトの名無しさん:2011/04/17(日) 19:41:49.20
>>987
このスレで出てる時間は
ソートだけの時間ではなく
time,timeitなどで計測する入出力も全部含めた
プログラム起動〜終了の時間だと思うよ
989デフォルトの名無しさん:2011/04/17(日) 19:49:26.06
ディスクに書き込むまでの時間で計れよ。
>>945のそ〜太2は書き込み終了まで古いPCで17秒。
990デフォルトの名無しさん:2011/04/17(日) 19:50:18.58
>>988
それは簡単に改造できるけど、ソートに時間が掛かりすぎると思う
今の環境はqsortのルーチンをDLLに置いてあって呼び出すので
システムコールの時間が掛かりすぎるのだと思う
静的リンクすればかなり速くなると思うけどそれでも0.1秒とかはないぜ
991デフォルトの名無しさん:2011/04/17(日) 19:54:31.50
DLLも静的も大差は出ない。
実質的に内部のアルゴリズムが遅いだけ。
むしろ頻繁に使うものはDLLからロードした方が速い可能性あり。
OSのキャッシュやHDDのキャッシュに乗っているかもしれないので。
992デフォルトの名無しさん:2011/04/17(日) 19:56:45.33
LIBもDLLも(HDD)ディスクのデータをメモリマップドファイル使って擬似的にロードしているだけのはず。
993デフォルトの名無しさん:2011/04/17(日) 19:58:41.46
じゃあなんで>>987が遅いんだろう?
0.1秒とかとても出ないぜ
読み込みの部分は十分に速いけど実行時半の大半はqsort()だよ
994デフォルトの名無しさん:2011/04/17(日) 20:07:40.25
>>987
へぼすぎる
995デフォルトの名無しさん:2011/04/17(日) 20:10:23.89
原因がわかりました
読み込みに失敗しており、全てのtime_tが0になっていました
こんな状態でqsort()を使うと最悪の結果になります
デバッグします
996デフォルトの名無しさん:2011/04/17(日) 20:11:39.37
そもそも

"%04d-%02d-%02d<>%02d:%02d:%02d<>%s<>%s"

ではうまく読み込みませんね
正規表現の機能なんてないんだから
997デフォルトの名無しさん:2011/04/17(日) 20:14:00.63
>>993
timeじゃ計れないのでtimeGetTimeに置き換えたけど
40〜50msだったよ
998デフォルトの名無しさん:2011/04/17(日) 20:16:40.36
次スレ立てます
999デフォルトの名無しさん:2011/04/17(日) 20:18:39.36
次スレ
C言語なら俺に聞け(入門編)Part 82
http://hibari.2ch.net/test/read.cgi/tech/1303039075/
1000デフォルトの名無しさん:2011/04/17(日) 20:27:13.15
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。