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

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

★前スレ
C言語なら俺に聞け(入門編)Part 88
http://hibari.2ch.net/test/read.cgi/tech/1312926287/
★過去スレ
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++の宿題片付けます 152代目
http://hibari.2ch.net/test/read.cgi/tech/1312201995/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
★ぬるぽ。

長くなりそうなコードはcodepadに貼り付けてもいいでしょう
http://codepad.org/
2デフォルトの名無しさん:2011/08/31(水) 20:08:18.31
よく、「C/C++」って表記見ますけど、区別ないんですか?
3デフォルトの名無しさん:2011/08/31(水) 20:15:06.53
>>2
表記されてる本を読んでみるとわかると思うが、前半はC、後半はC++と、明確に別れてる
4デフォルトの名無しさん:2011/08/31(水) 21:11:17.20
前スレでまともな答が来なかったからもう一度

脆弱性のある関数など実用的なプログラムで使うべきでない関数とか知りたいんだけど
いいサイトない?もしくは本。
5デフォルトの名無しさん:2011/08/31(水) 21:13:48.35
>>4
microsoft がセキュア版と称しているものの元になっている関数群
6デフォルトの名無しさん:2011/08/31(水) 21:16:19.71
>>4
getsで検索すると出てくるページ達
7デフォルトの名無しさん:2011/08/31(水) 21:18:24.78
これ覚えれば、絶対みたいなのはないような
8デフォルトの名無しさん:2011/08/31(水) 21:19:27.25
よく言われるのが、「gets()は使うな。fgets()を使え。」というもの。
バッファに読み込むサイズをしていできないgets()を使うと、バッファーオーバーランの危険性があると言われる。
9デフォルトの名無しさん:2011/08/31(水) 21:53:43.32
mallocやcallocで確保したメモリをfree後は参照してはいけないけど
freeした後に再度mallocやcallocでメモリを再確保するのもダメ?

例えば、繰り返し文の処理内や、関数呼出し毎に関数内で
malloc->freeみたいな
10デフォルトの名無しさん:2011/08/31(水) 22:17:59.36
いいけど?
11デフォルトの名無しさん:2011/09/01(木) 01:38:18.56
初歩的な質問で申し訳ありません。
C言語は「シー言語」と読むのが正しいのでしょうか?
それとも「スィー言語」でしょうか?
12デフォルトの名無しさん:2011/09/01(木) 02:15:16.40
シー言語としか聞いたことが無いです
13デフォルトの名無しさん:2011/09/01(木) 02:21:00.67
英語の発音記号では、Sea[siː]、She[ʃ iː]となります。[s]と[ʃ]の区別はとても重要です。日本人には難しい音ですが、英語ネイティブははっきりと音を区別しています。
日本人が発音すると、Sea[siː]と言っているつもりでも大体はShe[ʃ iː]と聞こえてしまいます。またアルファベットの“C”の発音はSea[siː]と同じですが、これも多くの日本人がShe[ʃ iː]と発音してしまっています。
14デフォルトの名無しさん:2011/09/01(木) 02:28:14.82
どうちがうんだ?
15デフォルトの名無しさん:2011/09/01(木) 02:35:05.61
16デフォルトの名無しさん:2011/09/01(木) 02:47:43.87
当たり前ですがネイティブ・スピーカーは「スィー」と言っていますね
http://www.youtube.com/watch?v=KlPC3O1DVcg
17デフォルトの名無しさん:2011/09/01(木) 02:48:29.02
ABCも読めんのか
あーべせー
18デフォルトの名無しさん:2011/09/01(木) 03:05:13.18
シーって言ってる奴が多いっていうしょうもないネタだろそのくらいも分からないのか>>17
19デフォルトの名無しさん:2011/09/01(木) 05:05:51.93
整数入力に対し0,0,1,2,3,4,5,6を繰り返し返す関数の中身てどう書けばいいんだろう?
F(0)とF(1)で0、F(2)で1、〜F(7)で6、F(8)とF(9)で0、F(10)で1、〜F(100)で3、〜F(104)とF(105)で0、〜
20デフォルトの名無しさん:2011/09/01(木) 06:01:48.41
int F(int n)
{
n %= 8;
return n ? n - 1 : n;
}
21デフォルトの名無しさん:2011/09/01(木) 11:07:49.50
#include <iostream> // C++
using namespace std;
int F(int n){
  static int data[8]={0,0,1,2,3,4,5,6};
  return data[n%8];
}
int main(){
  for(int i=0;i<10;i++) cout<<i<<"="<<F(i)<< " ";
  cout<<endl;
  i=100;cout<<i<<"="<<F(i)<<endl;
  i=104;cout<<i<<"="<<F(i)<<endl;
  i=105;cout<<i<<"="<<F(i)<<endl;
}
22デフォルトの名無しさん:2011/09/01(木) 11:18:52.99
うわーやっぱりC++の入出力の書き方ってきもいわ

int F(int n){
return (n+7)%8%7;
}
23デフォルトの名無しさん:2011/09/01(木) 11:21:48.46
C++でもprintf使用。
24デフォルトの名無しさん:2011/09/01(木) 11:26:53.84
整数を入力といっているが負数の場合は何を返せばいいんだろうか
25デフォルトの名無しさん:2011/09/01(木) 11:30:56.40
C++ならcout使わないともったいない(とあるCMのパクパク)
26デフォルトの名無しさん:2011/09/01(木) 13:06:19.20
他のプログラムが使ってるメモリの中の変数参照したいんだけど、無理?
27デフォルトの名無しさん:2011/09/01(木) 13:45:18.39
スィー言語なんて、言いにくいよ
28デフォルトの名無しさん:2011/09/01(木) 13:56:11.82
test
29デフォルトの名無しさん:2011/09/01(木) 14:12:03.97
>>26
デバッガでアタッチ汁
30デフォルトの名無しさん:2011/09/01(木) 16:40:41.87 BE:128194728-2BP(10)
セィー言語
31デフォルトの名無しさん:2011/09/01(木) 18:51:36.73
c++ならconstだろう 21は何を意図してstaticなんだろう?
32デフォルトの名無しさん:2011/09/01(木) 18:55:38.18
「c++なら」っていうのが意味不明
33デフォルトの名無しさん:2011/09/01(木) 21:07:44.92
つかぬことを伺いますが、下のようにchar配列を初期化をすると、
その配列の次のアドレスは必ず、NULL(\0)で初期化されるのでしょうか?

#include <stdio.h>

int main(void) {
char s[] = {'H','e','l','l','o',',','w','o','r','l','d'};
printf("[%s](%d)\n", s, sizeof(s) );
return 0;
}

これをコンパイル、実行をすると、出力は
>[Hello,world](11)
となり、配列のサイズとしてはNULL終端分のエリアは確保されていないように見えます。
ところが、下のように、配列の次のアドレスに文字を書き込むと、出力は、

int main(void) {
char s[] = {'H','e','l','l','o',',','w','o','r','l','d'};
char *p = s;
*(p+11) = 'A';
printf("[%s](%d)\n", s, sizeof(s) );
return 0;
}

>[Hello,worldA?Z$a[$a](11)
と'A'以降のゴミが出力され、'A'を書き込んでいた部分に'\0'が書かれていたように見えます。
また、printf()はその配列の次のアドレスまで読んで、'\0'の前まで出力していたように見えます。
34デフォルトの名無しさん:2011/09/01(木) 21:16:26.13
勝手にそうするコンパイラもあるかも知れないけど、何が入るかは不定
35デフォルトの名無しさん:2011/09/01(木) 21:28:11.54
c言語が一番強いの?
36デフォルトの名無しさん:2011/09/01(木) 21:51:14.78
>>35
アセンブラほどじゃないにしても、GUI作るとかは、「成せばなる。千里の道も一歩から」って感じ

何でも(理論上)作れるけど、今や開発する規模が大きすぎて、高速化したい所だけCを使うとかが多い
37デフォルトの名無しさん:2011/09/01(木) 21:55:08.29
>>33
領域破壊起こしてるじゃん。

char s[] = {'H','e','l','l','o',',','w','o','r','l','d'};
これはchar s[11];であることを定義してるから、s[11] は最低でも'\0'じゃなくちゃいけない。
なのにs[11]に'A'なんか突っ込んだらまずいっしょ。ナル文字なくなっちゃうんだから。
38!jinjya:2011/09/01(木) 22:01:41.73
> s[11] は最低でも'\0'じゃなくちゃいけない。
char s[11];なら
s[10] は最低でも'\0'じゃなくちゃいけない。
3937:2011/09/01(木) 22:19:08.09
>>38
指摘どもです。定義としてはchar s[12];だね。
だからs[11]は最低でも'\0'じゃなくちゃいけない。
40デフォルトの名無しさん:2011/09/01(木) 22:28:22.21
>>33の定義だと要素は11個しか用意してないから、
char s[11];
41デフォルトの名無しさん:2011/09/01(木) 22:34:06.50
>>40
その考えが正しいなら、sにはナル文字が入らないことになる。
このパターンはコンパイラでナル文字までの領域を確保するJK。
42デフォルトの名無しさん:2011/09/01(木) 22:39:34.56
末尾に \0 いれた分の領域を確保するのはダブルクォートで括った文字列で初期化したときだけだろ
43デフォルトの名無しさん:2011/09/01(木) 22:41:27.33
>>41
char s[] = {'H','e','l','l','o',',','w','o','r','l','d'};
これは、
char s[] = {72,101,108,108,111,44,119,111,114,108,100};
これと同じ
44デフォルトの名無しさん:2011/09/01(木) 22:46:49.88
char s[] = {'H','e','l','l','o',',','w','o','r','l','d','\0','\0'};
これならいける
45デフォルトの名無しさん:2011/09/01(木) 22:53:14.76
>>43
char s[] = {'H','e','l','l','o',',','w','o','r','l','d'};
これは、
char s[] = {72,101,108,108,111,44,119,111,114,108,100};
と同じだし、
char s[] = "Hello,world";
と同じ。
46デフォルトの名無しさん:2011/09/01(木) 22:57:05.71
>>41
コードをよく見る。sizeof(s)は11を返している。つまり、ナル文字分のサイズじゃない。
47デフォルトの名無しさん:2011/09/01(木) 22:57:50.54
>>45
同じじゃないよ。sのサイズを確認しる。
48デフォルトの名無しさん:2011/09/01(木) 22:59:14.81
>>45
#include <stdio.h>

int main()
{
int i;
char s1[] = {'H','e','l','l','o',',','w','o','r','l','d'};
char s2[] = {72,101,108,108,111,44,119,111,114,108,100};
char s3[] = "Hello,world";
for (i = 0; i < sizeof(s1); i++)
printf("%d ", s1[i]);
printf("\n");
for (i = 0; i < sizeof(s2); i++)
printf("%d ", s2[i]);
printf("\n");
for (i = 0; i < sizeof(s3); i++)
printf("%d ", s3[i]);
printf("\n");

return 0;
}
これを実行してみて
4945:2011/09/01(木) 23:11:59.55
>>48
認識違ってた。スマソ、吊ってくるorz
50デフォルトの名無しさん:2011/09/01(木) 23:12:50.24
早くみんな死んでしまえ
5133:2011/09/01(木) 23:17:58.00
で、結論でました?
52デフォルトの名無しさん:2011/09/01(木) 23:21:19.29
コンパイラがよしなに取りはからってくれた
それだけ
53!jinjya:2011/09/01(木) 23:26:53.57
>>33
バグだ!
54デフォルトの名無しさん:2011/09/01(木) 23:32:05.76
>>33
>>44のレスは試してみたの?
5544:2011/09/01(木) 23:37:18.01
char s[13] = "Hello,world";
これでもいける
5644:2011/09/01(木) 23:41:50.09
>>55
>char s[13] = "Hello,world";
>これでもいける

と思ったがローカル変数として初期化している場合どうなんだっけ?
間違えているかもしれん
57デフォルトの名無しさん:2011/09/01(木) 23:44:36.22
>>54
そうすれば正常に動くのはわかってます。質問はそんなことじゃありません。
58デフォルトの名無しさん:2011/09/01(木) 23:52:59.63
>>57
もう答え出てんじゃんw
59デフォルトの名無しさん:2011/09/01(木) 23:57:13.30
実験ではNULL終端されるらしい、ということは分かりますが、
それは言語仕様なのでしょうか?ということです。
60デフォルトの名無しさん:2011/09/02(金) 00:01:37.91
>>59
どこに目ぇつけてんだ
61デフォルトの名無しさん:2011/09/02(金) 00:04:05.26
たまたまNULL終端されたけど、それは、コンパイラの気まぐれじゃないのか?
62デフォルトの名無しさん:2011/09/02(金) 00:30:54.68
ていうか'\0'はNULであって、NULLじゃないし。
63!jinjya:2011/09/02(金) 00:34:40.72
> char s[13] = "Hello,world";
72 101 108 108 111 44 119 111 114 108 100 0 0
この最後の0は必ず0か?という質問ならいいんじゃない。
64デフォルトの名無しさん:2011/09/02(金) 01:03:27.44
スタック上は(32Bit環境なら)4バイト単位で確保されるんだろうけどな。
65デフォルトの名無しさん:2011/09/02(金) 01:06:25.98
char a[256]={0};
これで0クリアさせてた。
やめた方がいいかな?
66デフォルトの名無しさん:2011/09/02(金) 01:10:25.02
>>65
(特殊な環境で)古いコンパイラを使うような場合にマズイかもしれない
67デフォルトの名無しさん:2011/09/02(金) 01:16:50.66
>>65
規格上は問題ない
68デフォルトの名無しさん:2011/09/02(金) 05:21:53.73
問題ないね
69デフォルトの名無しさん:2011/09/02(金) 05:24:01.58
NULLPO
70 ◆QZaw55cn4c :2011/09/02(金) 06:31:09.55
>>65
昔は bzero() / memset() でクリアするのがお作法だったが(socket プログラミングね)、なるほどそういう手もあったのか。
71デフォルトの名無しさん:2011/09/02(金) 07:13:12.43
で、>>33 はどうなんだ
4byte 境界のおかげでたまたま '\0' が入ったのなら、
char s[] = {'H','e','l','l','o',',','w','o','r','l','d','!'}
これだと '\0' は入らない?
もちろんコンパイラに寄るのは承知の上で、>>33 のコンパイラだとどうなるのか気になる
7233:2011/09/02(金) 07:25:03.23
#include <stdio.h>

int main(void) {
  char s[] = {'H','e','l','l','o',',','w','o','r','l','d','!'};
  printf("[%s](%d)\n", s, sizeof(s) );
  return 0;
}

$ ./a.exe
[Hello,world!?C$aD$a](12)

'\0' 入らないみたいですね!ということは、「たまたま」と考えた方がいいということですね。
コンパイラは gcc 3.4.4 です。
73デフォルトの名無しさん:2011/09/02(金) 07:37:11.16
まだいてくれたか
解決して良かった
7433:2011/09/02(金) 07:51:08.57
ttp://www.uproda.net/down/uproda354304.jpg
つまり、この本のこの記述はウソってことですね。
75 ◆QZaw55cn4c :2011/09/02(金) 08:13:39.14
>>74
完全にまちがえてますなあ。書名・著者名を晒してください。
76デフォルトの名無しさん:2011/09/02(金) 08:16:15.35
それが言いたいがために
ねちねち粘ってたのかw
77デフォルトの名無しさん:2011/09/02(金) 08:44:39.89
そりゃ反例あがったのって >>72 で初だろw
まともな答えも出ずに見当違いのレスばっかり返ってきたらウズウズするだろうよ
78デフォルトの名無しさん:2011/09/02(金) 09:01:11.26
>33
上のソース、C machineで実行したら

[Hello,world゚](11)

となった。
79デフォルトの名無しさん:2011/09/02(金) 09:13:09.65
http://codepad.org/WwHvXmAa

#include <stdio.h>
int main(void) {
char s[] = {'H','e','l','l','o',',','w','o','r','l','d'};
char s2[] = {'H','e','l','l','o',',','w','o','r','l','d'};
printf("s :[%s](%d)\n", s, sizeof(s) );
printf("s2:[%s](%d)\n", s2, sizeof(s2) );
printf("s :0x%x\ns2:0x%x\n",(int)&s,(int)&s2);
return 0;
}

Output:

s :[Hello,world](11)
s2:[Hello,worldHello,world](11)
s :0xbfb5360d
s2:0xbfb53602

80デフォルトの名無しさん:2011/09/02(金) 09:20:22.06
スタックが汚れていない
81デフォルトの名無しさん:2011/09/02(金) 10:44:50.71
困った。QZが正しいことを言っている。
82!ninjya:2011/09/02(金) 12:02:33.58
jpgの写真撮るのがそんなに手間か
83デフォルトの名無しさん:2011/09/02(金) 12:34:48.21
変数への代入として += とか -= はよくみかけるんですが、ある書籍で |= というのがありました。パイプラインはターミナルでは使いますが、それとは別物のようで、調べても分かりません。どなたかヒントもらえますか?
84!ninjya:2011/09/02(金) 12:36:53.46
AND OR の ビットor
85デフォルトの名無しさん:2011/09/02(金) 12:38:44.56
a += b が a = a + b なのと同様に
a |= b は a = a | b
86デフォルトの名無しさん:2011/09/02(金) 12:40:40.99
入門書の一冊も持って無いのか
87デフォルトの名無しさん:2011/09/02(金) 12:56:32.09
すいませんネットオンリーな情弱なので
88デフォルトの名無しさん:2011/09/02(金) 13:18:20.74
ネットでいいと判断したなら自分で調べるようにしろよ
C言語 演算子 とかで出てくるだろうよ
89デフォルトの名無しさん:2011/09/02(金) 14:20:52.68
そんなに強く言わないで
別人なんだから
90デフォルトの名無しさん:2011/09/02(金) 15:50:52.91
コンピュータ関連の書籍って、日本人の書いたものでまともなものってある?
なんか、まともな本は全部アメリカ人の本の様な希ガス・・・
91デフォルトの名無しさん:2011/09/02(金) 16:26:25.61
まともとまともじゃない基準を明確にせよ。
つか「コンピュータ関連の書籍って」範囲広すぎ。
92デフォルトの名無しさん:2011/09/02(金) 17:38:48.42
(洋書読んでる俺カッケー)
93デフォルトの名無しさん:2011/09/02(金) 17:40:02.26
日本語がまともに読めてないからそう感じるんじゃないの
94デフォルトの名無しさん:2011/09/02(金) 20:06:43.61
同じ処理をさせるならWin32APIとかで作るGUIより普通にCUIの方がメモリも少なく動作も速い・・・ですよね?
95デフォルトの名無しさん:2011/09/02(金) 20:10:37.04
C言語解説書もラ製もDOS/Vパワーレポートも「Android携帯に必須のアプリ紹介」って本もコンピュータ関連の書籍だわな。
96デフォルトの名無しさん:2011/09/02(金) 20:15:06.10
Win32API使ったCUIもあるぞ。
GUIはウィンドウ関連のAPIを使ってるだけだし。
97デフォルトの名無しさん:2011/09/02(金) 20:34:23.06
CでGUIソフト作る場合Win32API使うのがメジャーですか?
今時はやりのGUIライブラリとかないですか?
98デフォルトの名無しさん:2011/09/02(金) 20:37:06.85
OpenGL
99デフォルトの名無しさん:2011/09/02(金) 20:43:02.40
Qt
100デフォルトの名無しさん:2011/09/02(金) 20:57:56.85
まてまて、ラ製ってまだ出てるのか?
101デフォルトの名無しさん:2011/09/02(金) 21:22:31.70
>>97
DirectX
102デフォルトの名無しさん:2011/09/02(金) 21:42:12.78
なんでC言語のGUI開発でマウス操作で部品貼り付けられるのないんだよなめてるだろ
103デフォルトの名無しさん:2011/09/02(金) 21:58:20.06
MFC+ダイアログベース

HTML+CGIでもGUIじゃね?
104デフォルトの名無しさん:2011/09/03(土) 00:03:35.56
MFCはC++
105デフォルトの名無しさん:2011/09/03(土) 00:07:29.25
Cのお仕事って、メモリを意識しなきゃならない組み込み系か、
バッチ処理メインのバックオフィス系が主?他にある?
106デフォルトの名無しさん:2011/09/03(土) 00:14:00.70
Win32API+C(非C++)の環境ってあるの?
関数のオーバーロードでエラー出そうだけど。
107デフォルトの名無しさん:2011/09/03(土) 00:16:01.61
>>102
C++Builderがかつて存在した
108デフォルトの名無しさん:2011/09/03(土) 01:04:36.29
GUIって基本的にオブジェクト指向じゃないと書けないんじゃないの?
109デフォルトの名無しさん:2011/09/03(土) 01:07:27.49
110デフォルトの名無しさん:2011/09/03(土) 01:09:27.23
>>108
作法に則るならイベント駆動型で書きさえすればいい
作法無視(ゲーム等)ならポーリングすればいい

オブジェクト指向である必要は無いよ
111デフォルトの名無しさん:2011/09/03(土) 01:18:18.21
構造体の値渡しをする際、どうやったら反映された結果を返すことができるのでしょうか…。
ポインタ使えば楽にできるのに、値渡しだと上手くいきません。
112デフォルトの名無しさん:2011/09/03(土) 01:19:37.27
>>111
return 構造体;
113デフォルトの名無しさん:2011/09/03(土) 01:45:20.61
オブジェクト指向と親和性は高いけどね>GUI
114デフォルトの名無しさん:2011/09/03(土) 01:56:57.76
まあSmalltalkが証明しているようなものか
115デフォルトの名無しさん:2011/09/03(土) 01:59:12.71
GUIぺたぺたプログラミングで引数の自動生成を綺麗にまとめれば
むしろオブジェクト言語は邪魔というかマ様への負担にしかならんと思う
116デフォルトの名無しさん:2011/09/03(土) 04:03:46.00
>>112
どうやったら上手く動くでしょうか。

> coca cola 120
> coca cola 150

と出力されるようにしたいのですが。

コード:http://codepad.org/zYHhnfJ5
117デフォルトの名無しさん:2011/09/03(土) 04:17:36.20
118デフォルトの名無しさん:2011/09/03(土) 13:40:01.33
ttp://www.nicovideo.jp/watch/nm6415611
この動画を見たのですが
プロトタイプ宣言のところでどうして
main関数のa,bにtasizan関数のx,yが代入されるのかわかりません・・
int main(void){
int a,b,add;
acanf("%d%d",&a,&b);
add=tasizan(a,b);
printf("add=%d\n",add);
return 0;
}
int tasizan(int x,int y){
int answer;
answer=x+y;
return answer;
}
誤字脱字が多いと思いますが脳内補正してください

119デフォルトの名無しさん:2011/09/03(土) 13:45:47.28
動画見てないけど、a、bがx、yに代入されるけどその逆にはなってないぞ。
120デフォルトの名無しさん:2011/09/03(土) 13:57:13.34
すみません間違いました
main関数に書いてるadd=tasizan(a,b);でどうして
addにanswerの値が代入されるのでしょうか
121デフォルトの名無しさん:2011/09/03(土) 14:05:18.38
main関数とtasizan関数は別々だ。
add=tasizan(a,b); ここでtasizan関数を呼び出している。
tasizan関数はanswerを返す
よってaddにanswerが代入される
122デフォルトの名無しさん:2011/09/03(土) 14:12:10.76
>int tasizan(int x,int y){

最初のところに int ってあるだろ、これは関数tasizanがint型の数値を返すという事を示している。
関数tasizan 内に
return answer;
ってあるだろ。これが返す値だ。

123デフォルトの名無しさん:2011/09/03(土) 14:24:04.15
>121
>122
return answerでanswerという変数?をtasizan関数に代入するという意味でいいでしょうか?
そしてどこかでtasizan関数を呼び出した?時にanswerを表示するでいいですか?
あともうひとつだけmain関数は変数abの値をどこでtasizan関数に渡しているんでしょうか
124デフォルトの名無しさん:2011/09/03(土) 14:30:08.92
125デフォルトの名無しさん:2011/09/03(土) 14:32:46.51
>124
ありがとうございます
早速みてみます
126デフォルトの名無しさん:2011/09/03(土) 14:37:55.48
>124
なるほど理解できました!
>121
>122
みなさんありがとうございました
127デフォルトの名無しさん:2011/09/03(土) 14:43:35.03
>>124
そこ、丁寧だなぁww しかし、わかんない人って、そこからわかんないんだな。
128デフォルトの名無しさん:2011/09/03(土) 14:52:05.43
数学感覚で変数や関数を見てるのかねぇ。

関数は数値に置き換えられるモノだとか。
129デフォルトの名無しさん:2011/09/03(土) 15:06:56.51
>>124
あぁ、ダメになるサイトだ。
130デフォルトの名無しさん:2011/09/03(土) 15:11:43.75
ポインタもアレだが構造体がワケワカラン
構造体の配列さっぱりです

>>129
ダメになっちゃうの?
131デフォルトの名無しさん:2011/09/03(土) 15:14:38.63
>>130
間違いが書かれているから指摘したら、切れられた。
更に指摘したら、言い訳が掲載された。
読んだ人がダメになるかどうかは、読んだ人次第。
132デフォルトの名無しさん:2011/09/03(土) 15:16:07.26
凄いなコイツw
133デフォルトの名無しさん:2011/09/03(土) 15:20:47.39
数学出来る人は最初にアセンブラからやるべき
というか地頭のいい人はプログラミング言語なんてやる必要ないでしょ
マシン語とマクロアセンブラさえあれば他には何もいらん
阿呆が大きなコード管理出来ないから高級言語なんてもんに頼らなきゃいけないだけで
情報工学とかウンコだよね
134デフォルトの名無しさん:2011/09/03(土) 15:24:02.20
お・・・おうww
135デフォルトの名無しさん:2011/09/03(土) 15:32:55.31
数学出来る人は


筆算でやれよ
136デフォルトの名無しさん:2011/09/03(土) 16:00:19.82
そんな理屈、オマイの脳内でしか通用しねーよ
137デフォルトの名無しさん:2011/09/03(土) 16:43:05.42
アセンブラをやったからこそ親和性の高い高級言語が欲しくなる。

BASIC+アセンブラの不便さといったら…
138デフォルトの名無しさん:2011/09/03(土) 16:44:35.94
>>131
解説サンクス

でダメになるってんで見に行ったんだけど

void func(void)
{
処理
if (条件) return; ⇒ 省略不可

処理
return; ⇒ 省略可
}

返り値も引数も無い関数の途中にreturnってあり得るの?
return 0; って記述すると停止するとか?
って自分で実行すれば良いのか
ちょっとやってみるか
139デフォルトの名無しさん:2011/09/03(土) 17:21:20.21
関数途中で抜けるのにreturn普通につかわね?

140デフォルトの名無しさん:2011/09/03(土) 17:22:12.10
GOSUB 〜 RETURN
CALL 〜 RET
141デフォルトの名無しさん:2011/09/03(土) 17:29:19.45
>129
間違いの箇所教えてくれ。
142デフォルトの名無しさん:2011/09/03(土) 18:36:12.86
こういう内容が特に新しくもない焼き直しみたいなCの入門書って、なんで繰り返し出版されるんだろ。
それでも売れるのかな???
143デフォルトの名無しさん:2011/09/03(土) 18:42:22.64
>>142
若者が騙されて入門して来るんだよ
毎年毎年
144デフォルトの名無しさん:2011/09/03(土) 18:52:53.90
大学教授が書く→出版→受講者に売る。
145デフォルトの名無しさん:2011/09/03(土) 18:57:46.04
×大学教授が書く→出版→受講者に売る。
○大学教授が院生に書かせる→出版→受講者に売る。
146デフォルトの名無しさん:2011/09/03(土) 19:07:15.23
>>131
このサイトの管理人が掲示板で切れたのを見たことないな。
へんなこと書いたんじゃないのか?
147デフォルトの名無しさん:2011/09/03(土) 19:16:07.06
>>138
有り得る。
例えば引数のチェックでNGの場合とか。

void func(int nArg)
{
  // 引数がNGの場合は処理を行わない
  if (nArg < 0) {
    return;
  }

  処理

  return;
}
148!jinja:2011/09/03(土) 19:32:41.61
パラメータ無くてもexternな変数とか
149デフォルトの名無しさん:2011/09/03(土) 20:55:05.01
>>147
>返り値も引数も無い関数
150デフォルトの名無しさん:2011/09/03(土) 20:58:54.11
>>138だけど

答えてくれた方ありがとうございます
151デフォルトの名無しさん:2011/09/03(土) 21:02:06.93
連投スマヌ

グローバル変数を参照してれば途中で抜けるのもありなのかな?
152デフォルトの名無しさん:2011/09/03(土) 21:21:25.20
>>151
それは>>148が回答してるでしょ。
153デフォルトの名無しさん:2011/09/03(土) 21:34:34.26
void ret_test(void)
{
return;
}
154デフォルトの名無しさん:2011/09/03(土) 21:41:08.41
void TestMem(void)
{

char *Buf=(char *)malloc(1024*16);
if(Buf==NULL) {
return ;
}
...
}
155デフォルトの名無しさん:2011/09/03(土) 21:48:59.48
毎回同じことをする固定処理で失敗しても呼び出し元に報告する必要がない処理
156デフォルトの名無しさん:2011/09/03(土) 23:58:09.84
C言語の質問です。
今C言語の基礎を終わせ、DXライブラリを今から勉強してゲームを作りたいと思っています。
もし完成したらベクター等で配布しようと思っているんですが、
やはりCで書いたプログラムは環境が整ってないと起動することはできないのでしょうか?
もし配布した後に起動できない、のようになったらちょっとまずいと思うんですが……
157デフォルトの名無しさん:2011/09/04(日) 00:00:29.11
VisualC++でコンパイルしたならvc…….dllがないと動かないな
158デフォルトの名無しさん:2011/09/04(日) 00:18:55.28
ごめんなさい、初心者すぎてわかりません。
そのvc…….dllというのは用意するのは簡単ですか?
159デフォルトの名無しさん:2011/09/04(日) 03:28:10.74
>>152
うほっ!
ご指摘有難うございます。
再確認したらそうでしたね
あの単語が脳内で理解されるまで時間がかかってしまいました…

>>154,155が意味不明だけど
おいおい理解出来る様になりたいです

皆さん有難うございます
精進してきまする
160デフォルトの名無しさん:2011/09/04(日) 08:55:47.10
>>156
個人でゲームを作るならCなんて選択はマゾ以外の何物でもないと思う。

ゲーム用によく使われているスクリプト言語の方が良いんじゃね?
最近だったらPythonやLuaとか。
161156:2011/09/04(日) 09:16:42.28
>>160
ありがとうございます。
授業で習ったことがあったのでCが一番楽だと思ったんですが、検討してみます。
162デフォルトの名無しさん:2011/09/04(日) 15:02:26.06
CでもC++でもいいんですが
NIC2枚差したWindowsPCをブリッジのような形にして、
指定したパケットだけ落とすプログラムって作成可能でしょうか?

Linuxであればできますが、Windowsでの作り方が分からず困っています。


(NIC(1),NIC(2)をブリッジし、共に192.168.1.0ネットワーク)


NIC(1)
_____|____
|windowsPC| ×ここでHTTPパケットを落とす
NIC(2)|
|
|↑HTTPパケット
163デフォルトの名無しさん:2011/09/04(日) 15:09:40.97
wincap?
164デフォルトの名無しさん:2011/09/04(日) 15:10:04.78
>>162
よく分からんので検索ワードだけ
パケットフィルタリング C言語
165デフォルトの名無しさん:2011/09/04(日) 15:13:52.10
一度、C言語を知ってしまうと、CGIとかを作るときにも、
他の言語を覚えなくても、C言語でやってしまえばいいと
思うんだけど、どうかな?
166デフォルトの名無しさん:2011/09/04(日) 15:18:58.73
全部ハードウェアで実現すればいいよ
167デフォルトの名無しさん:2011/09/04(日) 15:24:28.86
168デフォルトの名無しさん:2011/09/04(日) 15:46:36.36
>>165
文字解析なんぞは他の言語がうらやましくもある
169デフォルトの名無しさん:2011/09/04(日) 16:42:56.60
winsock2から生IPパケット吐ける様になったからIPだけなら直ぐに作れるんじゃないかな
170デフォルトの名無しさん:2011/09/04(日) 18:08:28.26
ヘリコプターで近所のコンビニにポテチを買いに行くぐらい無駄な行為
171デフォルトの名無しさん:2011/09/04(日) 18:25:09.05
>>170
アメリカだと、ありそうな話
172デフォルトの名無しさん:2011/09/04(日) 18:36:04.31
ねーよ
173デフォルトの名無しさん:2011/09/04(日) 19:10:07.31
構造体の参照渡しが上手く出来ません。
ミスの指摘をお願い出来ますか

「ヘッダファイル内」
void cursor(struct button *btn);

「main関数内」
struct button{
int buttonX;
int buttonY;
}btn,*pbtn;

void cursor(struct button pbtn);

error:型"button *"の引数は型"button *"のパラメータと互換性がありません。
174173:2011/09/04(日) 19:14:05.82
172修正します

「ヘッダファイル内」
void cursor(struct button *btn);

「main関数内」
struct button{
int buttonX;
int buttonY;
}btn,*pbtn;

pbtn = &btn;

cursor(pbtn);

error:型"button *"の引数は型"button *"のパラメータと互換性がありません。
175デフォルトの名無しさん:2011/09/04(日) 19:23:24.86
ヘッダ内のstruct buttonとmain関数内のstruct buttonは別物なんでは
ヘッダの頭の辺りにstruct buttonの定義を書くといいと思う

よくわからないけど
176デフォルトの名無しさん:2011/09/04(日) 19:30:23.71
「ヘッダファイル内」
typedef struct{
int buttonX;
int buttonY;
} button;

void cursor(button *btn);

「main関数内」
button btn;
button * pbtn;

pbtn = &btn;

cursor(pbtn);

これじゃだめ?
177デフォルトの名無しさん:2011/09/04(日) 19:32:38.11
もしかしてヘッダファイルの struct button *btn って int * にみなされちゃう系?
178173:2011/09/04(日) 19:36:34.09
>>175,176
アドバイスどうも有難うございました。今コンパイル通りました。
えーと、つまりヘッダファイルで関数宣言する前に構造体を書いてなかったからエラー出てた、ってことなんでしょうかね
179デフォルトの名無しさん:2011/09/04(日) 21:56:06.34
pbtnって省略できるんじゃね?
因みにpbtnの役割ってなんなのかな?
コードは書けば書くほどバグが入り込むから一文字でも少なく書かないと。
可読性を損なう時は多少長くてもしょうがないと思うけど。

「main関数内」
button btn;
// button * pbtn;

//pbtn = &btn;

cursor(&btn);
180デフォルトの名無しさん:2011/09/05(月) 00:29:23.39
>>168
文字の扱いはたしかにCは苦手っぽいね。
かといって、それだけのために他の言語を覚えるのは
結構かったるい感じだね
181デフォルトの名無しさん:2011/09/05(月) 01:00:12.43
正規表現が標準で実装されてたら助かるんだけどな
まぁテキストに対して複雑な処理をするなら当時だと
awkでも使っとけってことだったのか
182デフォルトの名無しさん:2011/09/05(月) 01:34:13.71
Cにしてみれば文字なんていうものはないんだよね
charという型名のせいで勘違いしやすいけど
183デフォルトの名無しさん:2011/09/05(月) 01:54:07.30
それは勘違いだとおもう
184デフォルトの名無しさん:2011/09/05(月) 04:01:20.68
>>180
漢字とか扱うとCなんて使ってられない。
他の言語覚えた方がずっと近道。
185デフォルトの名無しさん:2011/09/05(月) 07:52:58.62
ま、ライブラリに丸投げすれば一緒だけどな
186デフォルトの名無しさん:2011/09/05(月) 08:12:08.96
尻から目が出た!
187デフォルトの名無しさん:2011/09/05(月) 09:30:21.37
VCが変数名に漢字使えてわらた
使い道あるかは知らん
188デフォルトの名無しさん:2011/09/05(月) 09:51:35.90
CでTDDしている人いますか?
なにかツールを使っているなら、お勧めを教えてください
189デフォルトの名無しさん:2011/09/05(月) 10:23:44.70
ソースコード読んでて関数の定義部分を確認したい場合に
タグジャンプを使わずに一旦関数名でプロジェクトファイル全体をgrepして
関数定義の部分を目で確かめて表示させるやつってなんなのなんでタグジャンプ使わないの馬鹿なの
190デフォルトの名無しさん:2011/09/05(月) 15:10:41.81
>>189
タグジャンプを知らないか慣れてないか信用できないのだろ。
191デフォルトの名無しさん:2011/09/05(月) 17:35:43.75
「まだそんなツール使ってるの?情弱www」
192デフォルトの名無しさん:2011/09/05(月) 17:43:03.53
193デフォルトの名無しさん:2011/09/05(月) 17:56:23.46
C言語から移行しやすい、webアプリの言語ってどれなのでしょうか?
194デフォルトの名無しさん:2011/09/05(月) 18:00:48.35
Perlええよ
195デフォルトの名無しさん:2011/09/05(月) 18:03:30.54
>>192
箱に決まっているだろ。常考
196デフォルトの名無しさん:2011/09/05(月) 18:07:28.49
問題がバレたら、試験にならんだろうが
197デフォルトの名無しさん:2011/09/05(月) 18:21:05.40
>>195
アスペ乙ww
198デフォルトの名無しさん:2011/09/05(月) 18:28:03.15
C言語の参考書買って勉強しまくって、C言語の達人といわれる
おれだが>>162の質問が何をしてるのか全く分からない。

詳しい人教えて。NICってなに?Linuxってなに?

199デフォルトの名無しさん:2011/09/05(月) 18:31:04.69
おまいら、このスレで暇つぶしすんな。
200デフォルトの名無しさん:2011/09/05(月) 19:05:07.65
>>197
自閉症とアスペルガーの区別もつかん奴に
煽られてもなぁ・・・
201デフォルトの名無しさん:2011/09/05(月) 19:11:12.66
Cの達人()
202デフォルトの名無しさん:2011/09/05(月) 19:16:54.27
>>193
取り敢えず入りやすいのはPHPかな。
大抵のレンタルサーバで使えるし。

Perlがあがってるけど、あれはややこしくておすすめできない。
Cと違うところがたくさんありすぎる。
203デフォルトの名無しさん:2011/09/05(月) 21:50:49.53
質問いいですか?

構造体のメンバ変数を全てファイル出力する場合
やはり1つ1つアクセスしてfprintなどで出力するしかないのでしょうか?

構造体などを引き渡すだけで一気に出力などをする方法などはないのでしょうか?
開発環境はVC++です。
204デフォルトの名無しさん:2011/09/05(月) 21:54:13.79
ならsizeof分だけfwriteしてパディング分のゴミデータ出力してはまれよクズ
205デフォルトの名無しさん:2011/09/05(月) 22:01:05.50
otfのヘッダーを読み出したいのですが、エンディアンがビックなので結局変数の変換が必要になってしまいます。
エンディアンの異なるデータを、構造体レベルで一気にコピーする簡単な方法はありませんか。記述量が少ないほど良いです。
(アライメントはgcc拡張で対応する前提です)
206デフォルトの名無しさん:2011/09/05(月) 22:05:33.72
>>204
メンバにポインタが含まれていたらまじはまれる
207デフォルトの名無しさん:2011/09/05(月) 22:10:22.12
それらを書くのがプログラマだろ
黙って打て
208デフォルトの名無しさん:2011/09/05(月) 22:38:55.45
書き出しデータの先頭か、構造体にエンディアン情報の変数追加して
読み込み時にエンディアン変換かましたら?
209デフォルトの名無しさん:2011/09/05(月) 22:40:28.31
保存するときは常にネットワークエンディアンで保存するようにすればいい
210 ◆QZaw55cn4c :2011/09/05(月) 22:41:27.87
>>203
#progma
などでなんとかならないのなら、そしてコンパイラ依存をさけたいのなら、おっしゃるとおり、
「1つ1つアクセスしてfprintなどで出力する」
のが正解です。
211デフォルトの名無しさん:2011/09/05(月) 22:43:55.25
C++だとこういう処理をクラス化するのが楽しいんだけどなぁ。
212デフォルトの名無しさん:2011/09/05(月) 23:23:14.65
よかった、QZはやっぱり馬鹿だった。

>>211
そうそう。FileIntとかFileDoubleなんてクラスを作ったりしてね。
エンコーディングの問題はそいつらに任せられるから、
上の方の処理では意識することが少なくて済む。

って、Cで同じようなことをやってもいいけどトリッキーにしかならないからなぁ。
213 ◆QZaw55cn4c :2011/09/05(月) 23:26:19.02
>>210
×#progma
○#pragma

214デフォルトの名無しさん:2011/09/05(月) 23:27:21.15
文字列を8文字のブロックにわけて数値化する方法を探しているんだけど、
有名なやつとかある?
215デフォルトの名無しさん:2011/09/05(月) 23:28:37.40
VCで作っててCベタ書きするなんて意味が無いと思うんだが…
216デフォルトの名無しさん:2011/09/05(月) 23:28:56.01
頭がトリッキーだと逝ってるような
217 ◆QZaw55cn4c :2011/09/05(月) 23:39:54.22
>>209
いやもう事情が許すかぎりテキストにして出力するのが一番かと。それがだめなら仕方ありませんが。
218デフォルトの名無しさん:2011/09/06(火) 00:06:00.29
>>214
charポインタが指す内容をlong longで型キャストしてやりゃいいんじゃねぇの?
219デフォルトの名無しさん:2011/09/06(火) 00:08:41.85
>>214
何をやりたいのか、さっぱり?
220デフォルトの名無しさん:2011/09/06(火) 00:12:30.55
Base64 Base32
有名じゃなきゃって、意味わからん
221デフォルトの名無しさん:2011/09/06(火) 00:58:18.39
じゃぁ、パンツが見えるかもしれない、スカートをどうしてはくんですか?
222デフォルトの名無しさん:2011/09/06(火) 01:00:51.67
見られても良いパンツはいてるから
もしくは、見えそうで見えない小悪魔的演出をしてるから。
223デフォルトの名無しさん:2011/09/06(火) 01:01:16.45
今や、スカートの下に長パン?履く時代だよ
224デフォルトの名無しさん:2011/09/06(火) 01:03:30.73
>214

>218 のようにポインタ使うか、サイズ決まってるならunion使うか。
225デフォルトの名無しさん:2011/09/06(火) 01:07:47.14
コードも見んと会話が成立してるところが凄い
226デフォルトの名無しさん:2011/09/06(火) 01:13:26.81
コード無いから検証する手間が省ける。
227デフォルトの名無しさん:2011/09/06(火) 01:16:45.83
お花畑的な考え方だね
228デフォルトの名無しさん:2011/09/06(火) 01:22:18.26
質問のレベルで答えのレベルも変わるだろ。
提供された範囲で答えるしか無いんだし。

具体的なコードが提示されれば又別だよ。
229デフォルトの名無しさん:2011/09/06(火) 01:32:58.64
>>195
カゴ⇒自分⇒アン⇒箱の順に探すに決まってるだろ。
230214:2011/09/06(火) 05:53:50.02
>>218 >>219 >>224

説明不足ですまん。
RSAやってて
数値⇔文字列
の処理を暗号復号の前後にしなくちゃいけないからその方法を探してた。
まぁ、いろいろやってみるわ。
231デフォルトの名無しさん:2011/09/06(火) 10:20:56.95
かってにやれば
232214:2011/09/06(火) 12:58:11.82
ごめんなさい。
233デフォルトの名無しさん:2011/09/06(火) 17:03:22.24
もう次回からここのスレタイ
C言語なら俺に聞かないでくれ(お断りします編)にした方がいいんじゃね?
234デフォルトの名無しさん:2011/09/06(火) 17:07:03.37
入門前の人には質問の仕方から覚えてもらわないと
235デフォルトの名無しさん:2011/09/06(火) 17:37:44.52
http://codepad.org/VDC8hvKu

このコードで構造体Bの中の構造体Aの値だけを変えたいんですがどこを直せばいいですか?
236デフォルトの名無しさん:2011/09/06(火) 17:59:36.17
http://yuzuru.2ch.net/test/read.cgi/pc2nanmin/1080308026/829
何故たくさんの場所で聞くと答えが速くもらえると思うのか
237デフォルトの名無しさん:2011/09/06(火) 18:10:35.28
>>236
突っかかるみたいであれだけど、たくさんの場所で聞くこと自体は合理的な選択じゃね?
ただしローカルルールを理解しようとしない愚か者なわけだが
238 忍法帖【Lv=40,xxxPT】 :2011/09/06(火) 18:17:00.67
>>237
あんた馬鹿?
239デフォルトの名無しさん:2011/09/06(火) 18:17:07.89
マルチポストは嫌われるって、知らんのかな。。。

結果的には適切なスレ見つけて、一箇所で聞いた方が教えてもらえるんだよ
240デフォルトの名無しさん:2011/09/06(火) 18:24:36.72
>>238
皮肉を言ってるのはわかるがマルチやっちゃうような初心者質問者には伝わらねーよって言いたいわけ
241デフォルトの名無しさん:2011/09/06(火) 18:35:57.17
マルチ、マルチうるせーな。わかんねーなら黙ってろ。
242デフォルトの名無しさん:2011/09/06(火) 18:37:53.79
>>239
マルチポストがばれない限りはマルチポストのほうが回答がつく確率は高いという話だと思う
嫌われないなんてことは誰も書いてないかと
243デフォルトの名無しさん:2011/09/06(火) 18:39:42.86
あ、マジレスすると、構造体Bの中の構造体Aの値を変えているところをなくせばいいよ
244デフォルトの名無しさん:2011/09/06(火) 18:40:00.20
>>242
でも大抵ばれてるのを見かける
245 忍法帖【Lv=40,xxxPT】 :2011/09/06(火) 18:46:18.94
>マルチポストがばれない限りはマルチポストのほうが回答がつく確率は高いという話だと思う
実はそうでもない。
例えばこのスレ辺りにピンポイントで質問すれば、間がよければマルチポストするより早くレスがつく。
246デフォルトの名無しさん:2011/09/06(火) 18:49:48.52
>>244
マルチ氏ねとレスをした人の行動を考える。

・質問を見る→2chおよびその他のサイトをみて、同じ質問があれば、マルチ氏ねとレスをする
・常に2chおよびその他のサイトを巡回しており、質問を見かけるが回答をせずに放置する
 →同じ質問を見かける→マルチ氏ねとレスをする
・マルチポストをした上で、マルチ氏ねと自演をする

いずれにしても、マルチ氏ねとレスをした人は擁護されえない人物であろう。
247デフォルトの名無しさん:2011/09/06(火) 18:50:07.13
似たようなスレには結局同じメンバーが集う。
248デフォルトの名無しさん:2011/09/06(火) 18:54:24.62
>>246
マルチポストしてる人同様、答える側も関連スレ巡回してるのは当然だと思うんだが。。。
バレないって考える根性が嫌われるんじゃないかねぇ。。。
249デフォルトの名無しさん:2011/09/06(火) 19:00:24.72
>>248
もしかするとマルチポストで、すでに回答がついているかもしれないから、回答せずに巡回をするってことだよね
250デフォルトの名無しさん:2011/09/06(火) 19:03:36.12
つうか、専ブラで巡回するときに更新があったスレ全部開いてみるってやってる奴は少なくないだろ。
骨髄反射じゃなく、一通り見てレスするタイプなら気が付かない方がおかしいし、何度も見るとイラッとする。
251デフォルトの名無しさん:2011/09/06(火) 19:21:35.14
必死杉。
252 ◆QZaw55cn4c :2011/09/06(火) 19:44:04.53
マルチがなぜ悪いのか説得力のある説明が、これまで一つも上がっていない件について。

私?気が向いたらマルチの一つに答えています。
マルチに特に悪い感情はありません。というかマルチが嫌われる理由が想像できない。
253デフォルトの名無しさん:2011/09/06(火) 19:46:23.14
>>251
イラっとする人が何度も何度もイラっとする事を経験してるんだから、見た瞬間に怒り爆発って気持ちは分からなくはない
254デフォルトの名無しさん:2011/09/06(火) 19:49:27.84
こういう感情失禁って、前頭葉が弱い証拠なんだよな・・・
255デフォルトの名無しさん:2011/09/06(火) 19:55:50.80
>>252
別にお前を説得する必要はない
256デフォルトの名無しさん:2011/09/06(火) 20:01:49.05
fgets と scanf を共存して使ってるコードを見た気分になれる
257デフォルトの名無しさん:2011/09/06(火) 20:13:46.05
携帯通信量増大の原因のひとつだからww
258デフォルトの名無しさん:2011/09/06(火) 20:23:59.75
流石にそれは無いな
どっちかと言うと、似たようなスレを巡回してる人が多い故に、何度も同じ質問されてる感覚にイラっと来る人が多いって感じかね
259デフォルトの名無しさん:2011/09/06(火) 20:29:57.09
>>252
まずは日本語ちゃんと理解できるようになろうな
260デフォルトの名無しさん:2011/09/06(火) 20:43:32.18
stdlib.hでEXIT_FAILUREは1と定義されてますが、main関数で1がreturnされたとき、
OS側は何かするんですか?
261デフォルトの名無しさん:2011/09/06(火) 20:47:17.99
OSは何もしない。ただ、そういう値をプログラムが返してきたということを、
呼び出し元のプログラムに伝えることはする。
262デフォルトの名無しさん:2011/09/06(火) 21:03:06.40
では、正常終了したか不成功終了したかの値は(呼び出し元プログラムがわかっていれば)何でもいいってことですかね?
まあ、慣例に従いますが。
263デフォルトの名無しさん:2011/09/06(火) 21:42:57.62
あ〜疲れた
264デフォルトの名無しさん:2011/09/06(火) 22:18:20.34
EXIT_SUCCESSはいいとしてEXIT_FAILUREは実用性ないな。
265デフォルトの名無しさん:2011/09/06(火) 23:32:39.12
そんなことはない。
266デフォルトの名無しさん:2011/09/07(水) 02:37:45.31
OSは大抵何もしないが、コマンドインタプリタはその限りではない。
例えば、EXIT_FAILUREに反応してアラートを上げるウィンドウシステムがかつてあった。
267デフォルトの名無しさん:2011/09/07(水) 02:39:48.29
make は 0 以外を返されると中断して以降の処理を行わないとか
268デフォルトの名無しさん:2011/09/07(水) 06:22:51.16
make && ./a.out
とかよくやるもんね。
269デフォルトの名無しさん:2011/09/07(水) 15:42:30.12
なにそれmakeに成功したら実行ってこと?
270デフォルトの名無しさん:2011/09/07(水) 16:12:52.83
>>269
一行でコンパイル実行
失敗しても古いのを実行は、しない
271デフォルトの名無しさん:2011/09/07(水) 16:56:03.29
>>265
成功は0だけど、エラーのリターン値はマイナスでエラーの種類ごとに
値が違うって感じの多いじゃん。
272デフォルトの名無しさん:2011/09/07(水) 17:44:06.40
>>269
そう
273デフォルトの名無しさん:2011/09/07(水) 17:48:57.71
>>269
うん
274デフォルトの名無しさん:2011/09/07(水) 19:43:49.13
H8マイコンを使ってディップスイッチの状態を読み込んで7セグLEDを点灯させる
プログラムを作る予定なんですが、参考になるサイト知りませんか?
275デフォルトの名無しさん:2011/09/07(水) 19:45:12.27
>>274
ん、学生君?
276デフォルトの名無しさん:2011/09/07(水) 19:52:06.94
>>274そうです
    ただ電気系なのでC言語は疎いです
277デフォルトの名無しさん:2011/09/07(水) 20:07:40.44
ここで聞くよりはルネサススレとか組み込みスレとか秋月スレとかで聞く方がいいべ
ソフトだけなら自力で調べればその程度はできるだろうが
278デフォルトの名無しさん:2011/09/07(水) 20:08:58.38
>電気系なので
は言い訳にならんでしょ
ここで質問しても答えてくれる人はおらん気がするけど
回路図書くところからやらんとプログラムに行きつかんでしょ
279デフォルトの名無しさん:2011/09/07(水) 20:24:45.92
逆コンパイルが怖いです。
、というか難読化して訳わからなくしてもそのままコピペ→コンパイルされたらお終わりなんじゃ?
280デフォルトの名無しさん:2011/09/07(水) 20:28:31.48
そのままコピペ&コンパイルすると元のアプリ出てくるだけやん
281デフォルトの名無しさん:2011/09/07(水) 20:29:08.34
腕なし自慢でもしたいのかね?
282デフォルトの名無しさん:2011/09/07(水) 20:32:23.26
>>280
いや・・だからハッキリわかってるところだけチョコチョコっと変えてアルゴリズムとかはそのまま使えちゃうでしょ?
283デフォルトの名無しさん:2011/09/07(水) 20:32:26.85
>>279
ローカルで動作するプログラムなら解読されるのは防げない
だけど解読のコストが高くなれば諦める可能性が高くなる

実行ファイルにしてしまえば変数名、関数名が消えるから難読化になってる
難読化ツールを使えば実行時に自己書き換えをするからもっと解読が面倒になる
284デフォルトの名無しさん:2011/09/07(水) 20:36:45.06
>>277 ありがとうございます
     そっちに行ってみます
285デフォルトの名無しさん:2011/09/07(水) 20:41:48.32
GOTOだらけにしてグチャグチャにするってのは効果ありますかね?
286デフォルトの名無しさん:2011/09/07(水) 20:46:02.23
難読化はド素人がやれば自然に出来ることなんだけど
287デフォルトの名無しさん:2011/09/07(水) 20:48:30.72
解読されて困ることってあるの?
288デフォルトの名無しさん:2011/09/07(水) 20:49:34.11
>>285
自分で作った実行ファイルを自分で解析してみればいいと思うよ
289デフォルトの名無しさん:2011/09/07(水) 20:50:39.60
>>287
シナ人にパクられる
290デフォルトの名無しさん:2011/09/07(水) 20:52:16.88
関数にstatic変数を幾つも用意し、呼び出す度に値を書き換える。
さらにその値に応じて、関数の動作そのものを変えてしまう。
その関数が200行程度あれば、解読したいと思う意欲は相当そがれる。
291デフォルトの名無しさん:2011/09/07(水) 20:57:16.83
入力と出力がはっきりわかる奴は中身見ないでもコピーされちゃうよ
292デフォルトの名無しさん:2011/09/07(水) 21:06:22.87
それはクローン

と言うか、盗まれたく無いのはファイルフォーマットの場合の方が多いんじゃ無いのかな
Officeとかadbe製品とか
293デフォルトの名無しさん:2011/09/07(水) 21:10:45.39
IOCCC のはソースコードからして読めないw
294デフォルトの名無しさん:2011/09/07(水) 21:30:00.41
仕込みみたいなのは読まれたくなよなあ
自分はやらんけど、変なこと
295デフォルトの名無しさん:2011/09/07(水) 21:53:20.93
>>292
おい
何か足りないぞ
296デフォルトの名無しさん:2011/09/07(水) 22:26:27.59
最近の実行ファイルは暗号化されてるんだっけ?
まぁ実行時には複合化されるからクラックの手間増やすぐらいにしか役立たないみたいだけど。
297デフォルトの名無しさん:2011/09/07(水) 22:41:43.18
おい
何と複合するんだ
298デフォルトの名無しさん:2011/09/07(水) 22:45:24.32
.netのこと逝ってるんじゃあ
299デフォルトの名無しさん:2011/09/07(水) 22:52:55.02
おれは今まで公開したソフトは全部ソース付きで3条項BSDかGPL2で公開してるよ。
これには利点が2つあって、

一つは、
コンパイル可能なソースコードをフル公開することにって、作者として信頼される。
変なウイルスやバックドアなどの仕掛けを仕組んでないことの証明になる。
exeやdllをパッと上げても、気味悪がって誰も使ってくれないのが普通。でもソース付きだとある程度信用して使ってもらえる。

もう一つは、
バグ修正や機能追加などの面倒な要望が来たときに、
「コードも公開してありますから、ご自由に改変してくれていいですよ(ニッコリ」と、自分が悪者にならずに断る口実にできるwww

もう一つ、
ソースコードのバグを見つけて、修正パッチを送ってもらえる。
という利点もあるはずなんだが、自分はこのメリットにあずかったことは一度も無いわ。
300デフォルトの名無しさん:2011/09/07(水) 22:57:19.40
めんどうだからライセンスなんて確認しない
301デフォルトの名無しさん:2011/09/07(水) 22:58:57.35
「復号」だってことだろ
302デフォルトの名無しさん:2011/09/07(水) 23:07:05.94
patchに仕込み入れた器用な奴がいたなあ
バレたけどね
303デフォルトの名無しさん:2011/09/08(木) 03:17:56.10
つーかド素人程やたらリバースエンジニアリングを怖がるよね。
Delphiユーザーとかに多い。
304デフォルトの名無しさん:2011/09/08(木) 03:23:41.24
なんでこれで動くの?
の方がかっこいいと思うけどね
305デフォルトの名無しさん:2011/09/08(木) 03:24:11.42
svnで管理して一般人がコミットできるようにしてくれ
306デフォルトの名無しさん:2011/09/08(木) 03:28:52.16
妙な仕込み入れる奴がいるから、やるにしても注意せんとね
307デフォルトの名無しさん:2011/09/08(木) 04:58:13.37
Vectorとか見たら、エディタの正規表現置換の方がもっと柔軟な事が出来そうな処理でも堂々とシェアウェアにしてる人一杯いるよね。
ああいうのが難読化やらexepackerなんかを使うんだろうな。
308デフォルトの名無しさん:2011/09/08(木) 05:05:49.15
正規表現って正しいかどうかすぐにわからんでしょ。試行錯誤、経験
309デフォルトの名無しさん:2011/09/08(木) 06:19:28.62
検索してみたら正しいかどうか直ぐわかるじゃん
310デフォルトの名無しさん:2011/09/08(木) 06:27:33.77
e-mailアドレスか判定する正規表現、あれ理解できる?
311デフォルトの名無しさん:2011/09/08(木) 06:31:06.75
RFCに準拠したメールアドレスの正規表現
http://www.din.or.jp/~ohzaki/mail_regex.htm
312デフォルトの名無しさん:2011/09/08(木) 08:41:19.33
別に理解する必要ないだろ。
313デフォルトの名無しさん:2011/09/08(木) 08:48:24.88
rfc準拠メアドの正規表現がややこしいのは、一般的な使用では絶対に使う事のないようなコメントの実装までしてるからだろ
面倒臭がらずに読んだら理解は出来るだろうよ。
314デフォルトの名無しさん:2011/09/08(木) 09:56:16.43
それに、なんでわざわざマッチする文字パターンをhex表記にしてるんだろ。
それをエスケープさせて、わざとわかりにくくしているようにしか見えないw
315デフォルトの名無しさん:2011/09/08(木) 12:05:46.14
構造体の宣言で
#include <stdio.h>

typedef struct{
int x;
int y;
} Coord;

typedef struct{
Coord coord[3];
} Block;

int main(void)
{
Block x = {{1,2},{3,4},{5,6}};
return 0;
}

とすると「初期化式が多すぎる」とエラーが出るのは何故なんでしょうか?
316デフォルトの名無しさん:2011/09/08(木) 12:09:32.51
>>315
括弧が足りないから
317デフォルトの名無しさん:2011/09/08(木) 12:09:37.58
Block が二次元配列じゃないからエラー
318デフォルトの名無しさん:2011/09/08(木) 12:14:19.16
おまいら、やさすぃなw
319デフォルトの名無しさん:2011/09/08(木) 12:20:09.06
構文構造を論理的過ぎるほど理解して書き始めたヤツでもないかぎり
誰でも一度は遭遇するミスだからチョット優しくなれるとおもう
320デフォルトの名無しさん:2011/09/08(木) 12:32:04.71
?? なんかカッコとかじゃなくて、おかしくないか?
321デフォルトの名無しさん:2011/09/08(木) 12:42:37.99
>>315
Block x =
{        //Block構造体の初期化
  {      //Block内の配列の初期化
    {1,2},  //Coord配列変数の初期化
    {3,4},
    {5,6}
  }
};
322デフォルトの名無しさん:2011/09/08(木) 12:55:21.80
>>318
まぁ、こういう分かり易いくらいに
馬鹿丸出し初心者のミスは答える方も楽だしw
323デフォルトの名無しさん:2011/09/08(木) 13:22:35.04
じぇんじぇんw
324デフォルトの名無しさん:2011/09/08(木) 13:52:21.24
この流れなら質問できる!

MacのXcodeで勉強しているんですが
インクリメントのタイミングが意味不明なんで教えて下さい

int a=1,b=1;

printf("a=%d,%d,%d¥n",a,++a,a);
printf("b=%d,%d,%d¥n",b,b++,b);

アウトプットされた答えが

a=2,2,2
b=2,1,2

b++が1なのにソレより前にあるbが2になるのは何故でしょうか
同様に++aより前にあるaが2になるのも謎なんですけど
仕様と言われちゃうと仕方ないけど寂しいです
お願いします
325デフォルトの名無しさん:2011/09/08(木) 13:56:13.69
>>324
未定義です
鼻から悪魔が出ます
冒険の書が消えます
背が縮んで
彼女と別れて
宝くじをなくします
326デフォルトの名無しさん:2011/09/08(木) 14:02:31.99
>>325

>>324だけど
>未定義です //ソコを知りたい!
>鼻から悪魔が出ます //最近鼻血が止まりません
>冒険の書が消えます //外出してません
>背が縮んで //後2cm欲しい
>彼女と別れて //彼女なんて伝説だろ?
>宝くじをなくします //買ったこと無い
327デフォルトの名無しさん:2011/09/08(木) 14:07:13.41
328デフォルトの名無しさん:2011/09/08(木) 14:13:38.75
printf("a=%d,%d,%d\n",a);
printf("a=%d,%d,%d\n",++a);
printf("a=%d,%d,%d\n",a);
printf("b=%d,%d,%d\n",b);
printf("b=%d,%d,%d\n",b++);
printf("b=%d,%d,%d\n",b);
329デフォルトの名無しさん:2011/09/08(木) 14:14:03.59
>>324です
>>325,327さんありがとうございました
330デフォルトの名無しさん:2011/09/08(木) 14:18:21.72
>>328
おぅ
メチャクチャな数字が出てきたぞい
331 忍法帖【Lv=40,xxxPT】 :2011/09/08(木) 14:21:59.99
>>330
そりゃそうだ、パラメータが足りてない。
332デフォルトの名無しさん:2011/09/08(木) 14:22:40.62
数値を数字って言っちゃう男の人って・・・
333デフォルトの名無しさん:2011/09/08(木) 14:35:39.85
>Block x = {{1,2},{3,4},{5,6}};
Block x = {1,2, 3,4, 5,6};
こっちでも通るんだよな。
334デフォルトの名無しさん:2011/09/08(木) 14:36:46.37
>>331
コレが鼻から悪魔っすか?

>>332
すまん男だしオッサンだ
335デフォルトの名無しさん:2011/09/08(木) 15:00:02.14
#include "stdio.h"
#define xyxx char
#define xyyxx putchar
#define xyyyxx while
#define xxyyyx int
#define xxxyyx main
#define xyxyxy if
#define xyyxyy '\n'
xyxx *xyx [] = {
"]I^x[I]k\\I^o[IZ~\\IZ~[I^|[I^l[I^j[I^}[I^n[I]m\\I]h",
"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~[IZ|_IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm_IZh",
"]IZx\\IZx[I^k[I\\o]IZ~\\IZ~\\I]|[IZl_I^j]IZ}]I^n[IZm\\IZm_IZh",
"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~_IZ|[IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm]IZh",
"]I^x[I]k\\IZo_I^~[I^|[I^l[IZj\\IZj]IZ}]I^n[I]m^IZh",'\0'};/*xyyxyxyxxxyxxxyy*/
xyxx *xyyx; xxyyyx xyyyx,xyyyyx,xyyyyyx=0x59,xyyyyyyx=0x29,/*yxxyxyyyxxyyyxyy*/
xxyx=0x68;xxxyyx(){xyyyyx=0;xyyyxx(xyx[xyyyyx]){xyyx=xyx[xyyyyx++];/*xyyyxxyx*/
xyyyxx(*xyyx){xyyyx= *xyyx++-xyyyyyx;xyyyxx(xyyyx--)xyyxx(*xyyx-xyyyyyyx);/*x*/
xyxyxy(*xyyx==xxyx)xyyxx(xyyxyy);*xyyx++;}}}/*xyxyxyyyyxxyxxxyyyxyyyxyxxyyy*/
336デフォルトの名無しさん:2011/09/08(木) 15:45:37.98
なんか怪しかったから
実際には動作させずに必死にどうなるか解析してしまった
337デフォルトの名無しさん:2011/09/08(木) 15:52:01.48
これ何やってんの?
338デフォルトの名無しさん:2011/09/08(木) 15:55:19.04
gcc -E でマクロを展開して読めば分かるさ
339デフォルトの名無しさん:2011/09/08(木) 16:06:45.42
マクロ展開してもまだすっと分かるレベルじゃないな
大体訳すとこんなことしてる
ttp://codepad.org/XhUt1Gjz
340デフォルトの名無しさん:2011/09/08(木) 16:16:14.49
obfuscated?
341デフォルトの名無しさん:2011/09/08(木) 16:33:50.17
プロジェクト管理してて不明瞭にされたって?
後で突っ込んでいいぞ。

struct {
unsigned char n;// 出力する回数 + 'Y'(0x59) (4 + 0x59 = ']'(0x5d))
char c; // 出力する文字 + ')'(0x29) ('?'(0x3f) + 0x29='h'(0x68))
// '?'文字を指定回数出力したら、次は改行する
];
342デフォルトの名無しさん:2011/09/08(木) 16:42:41.33
突っ込んでいいね
343デフォルトの名無しさん:2011/09/08(木) 16:48:10.41
いいね!
344デフォルトの名無しさん:2011/09/08(木) 19:52:26.05
プログラムで.jpgファイルをバイナリで開いて中身をコピーして
.jpg→.wavで新たなファイルを作り、
.wav→.jpgと再び同じ方法で戻したらファイルを開けなくなりました。
コピー先のメモリの容量も足りていたのにどこが問題なのでしょうか?
345デフォルトの名無しさん:2011/09/08(木) 19:56:19.36
書いたプログラムが間違ってるんだよ
346デフォルトの名無しさん:2011/09/08(木) 19:59:00.52
中の数値を配列に入れてファイルに出力したつもりなんですが
本来ならできるはずということで?
347デフォルトの名無しさん:2011/09/08(木) 19:59:29.44
diff取ってみればいいじゃん
348デフォルトの名無しさん:2011/09/08(木) 20:01:09.43
んるほど
349デフォルトの名無しさん:2011/09/08(木) 20:06:09.30
>>346
できるよ。ファイル読み書きの課題3ぐらいで出てきてもおかしくないレベル。
350デフォルトの名無しさん:2011/09/08(木) 20:39:26.56
>>344
windowsか?
バイナリで開いたのは読む側だけとかそういうことはないよな。
351デフォルトの名無しさん:2011/09/08(木) 20:50:50.88
>>334
コードを貼れ。
ttp://codepad.org
352デフォルトの名無しさん:2011/09/09(金) 02:07:58.94
諦めるな。一度諦めたらそれが習慣となる。
353デフォルトの名無しさん:2011/09/09(金) 23:36:40.93
void hoge(int n, void (*hage)(void)) { }
みたいに関数ポインタを引数に取る関数のプロトタイプは、
void hoge(int, void (*)(void));
みたいにしていいの?
354デフォルトの名無しさん:2011/09/09(金) 23:37:50.62
>>353
それでもいいけど typedef するのを勧める
355デフォルトの名無しさん:2011/09/10(土) 00:05:28.51
wikipediaのscanfのページのバッファオーバーランを回避する為の方法についての項で
以下のように書いてあります。

>さらに前述の改行コードがストリームに残る問題を考慮すると
>char a[20];
>scanf("%19s%*[^\n]%*c", a);
>となるが、この場合はaに入る文字列が 19バイト以下の場合には、入力ストリームにやはり改行文字が残る。

そこで,

#include <stdio.h>
int main(void){
char a[5];
scanf("%4s%*[^\n]%*c", a);
getchar();
return 0;
}

というプログラムを実行して,scanfの入力時に例えば「12<ENTER>」と入力すると,
上の文章に従えば,aに入る文字列が4バイト以下だから,入力ストリーム上に<ENTER>が残って,
getcharによる入力待ちは無いはずです.
しかし,実際にはgetcharの所で入力待ちになります.

wikipediaの説明が間違っていると思っていいでしょうか.
wikipediaの脚注にあるサイトにも上で引用したことと同じようなことが書いてあります.
そのサイトはソフトウェア開発会社のものなので,そうそう間違ったことは書かれないだろうと思います.
だから,本当に説明が間違っているのか自信が持てません.実行結果は上記の通りなのですが.
356デフォルトの名無しさん:2011/09/10(土) 00:10:45.51
>>354
おお、なるほど
ありがとうございました
typedef void (*hage_callback)(void);
void hoge(int, hage_callback);
void hoge(int n, hage_callback hage)
{
  int i;
  for (i=0; i<n; i++) hage();
}
void hage_proc(void) { }
int main(void)
{
  hoge(1, hage_proc);
  return 0;
}
357デフォルトの名無しさん:2011/09/10(土) 02:44:22.64
>>355
WinVistaの cmd 上と、cygwin端末上で確認したけど、入力待ちにならなかった。
どんな端末で動かしてるの?
358デフォルトの名無しさん:2011/09/10(土) 03:22:44.32
>>356
はげはげうるせーんだボケ(泣
359デフォルトの名無しさん:2011/09/10(土) 03:27:25.05
>>358
やぁ はげ
360デフォルトの名無しさん:2011/09/10(土) 10:05:06.18
>>355
wikipediaに書いてあるのと違ってるからさっさと見なおしてこい
>>357
>>355のコピペで入力待ちにならなかったってのは改行がwin風だからだろうかね
361デフォルトの名無しさん:2011/09/10(土) 10:34:03.49
10進数の1兆を16進数に変換して出力したいのですが、次のプログラムでは
正しく表示されません。
どうしたら全桁表示出来るでしょうか。


#include <stdio.h>

int main(int argc, char *args[])
{
unsigned long long data;

data = atoll(args[1]);
printf("result: %#llx\n", data);

return 0;
}
362デフォルトの名無しさん:2011/09/10(土) 10:39:05.35
http://ideone.com/e4RD8
でちゃよ?
363361:2011/09/10(土) 11:12:56.53
>>362
atoll通すとだめなんでしょうか?
364デフォルトの名無しさん:2011/09/10(土) 11:22:08.43
http://ideone.com/NEmzw
いんや特に無い
あとstdlib.h入れてリンクしてる?
365デフォルトの名無しさん:2011/09/10(土) 11:28:11.62
>>361
gcc 361.c -std=c99
366361:2011/09/10(土) 12:44:55.77
>>364

stdlib.hインポートしたら出来ました。
ありがとうございました。
367デフォルトの名無しさん:2011/09/10(土) 16:44:42.02
話が戻ってしまう上にスレチかもしれませんが
やっぱりWin32APIの関数でも逆コンパイルとかアセンブルしたらすぐわかってしまうのでしょうか?
368デフォルトの名無しさん:2011/09/10(土) 16:46:02.79
ちょっと何を心配しているのかわかりませんね
369デフォルトの名無しさん:2011/09/10(土) 16:47:34.81
逆コンパイラ「こういう動きのパターンはGetMessageだな」

を心配してます
370デフォルトの名無しさん:2011/09/10(土) 16:55:19.82
グローバルな関数名とかはモロわかりなのに何を言ってるんだい
371デフォルトの名無しさん:2011/09/10(土) 17:01:21.02
です・・・よね・・(苦笑)
372デフォルトの名無しさん:2011/09/10(土) 17:09:07.45
パクられて困るようなものを作ってるのかね?
373デフォルトの名無しさん:2011/09/10(土) 17:15:55.62
>>372
当たり前だろ
ゴミしか作れない奴にはわからんだろうけどな
374デフォルトの名無しさん:2011/09/10(土) 17:20:18.89
強気な割に質問のレベルが低すぎてお笑い状態
375デフォルトの名無しさん:2011/09/10(土) 17:41:06.34
初心者ってスキルも無いのにそういうのにはご執心するじゃん。
ゴミみたいなゲームでも作ってベクターあたりに上げようかと思ってんじゃね?

GPL違反発覚を誤魔化すために対策検討してるという事も考えられるが
それにしては質問がお粗末すぎるし・・・
376デフォルトの名無しさん:2011/09/10(土) 18:45:46.88
メッセージポンプなんて100人作っても大体同じだろ
逆コンパイラ使ってトリッキーなアルゴリズムの動きを見ようって奴もいるだろうけど、
そういうのってよりよい方法が文書で存在してるので正直逆コンパイル面倒ってなる

あとデバッグ情報無いのに変数名とか分かるっけ?
377デフォルトの名無しさん:2011/09/10(土) 18:51:02.45
dllとかに依存せんならわからんだろうけど
378デフォルトの名無しさん:2011/09/10(土) 19:35:37.83
GetMessageを掠め取られて困るようなプログラムってなんだろうw

シリアルコード認証あたりだろうけど、入門スレで聞くような題材じゃ無いよな。
379デフォルトの名無しさん:2011/09/10(土) 20:35:19.08
これからは主導インライン展開の時代
380デフォルトの名無しさん:2011/09/10(土) 20:37:38.44
外からhookされておしまいのような
381デフォルトの名無しさん:2011/09/10(土) 23:48:07.85
アスキーコードで受け取ったものを16進数にする方法を教えてください

0x46を受け取ったら、0xFにするような感じです。
382デフォルトの名無しさん:2011/09/11(日) 00:25:57.73
atoi()関数はどうだ?
383デフォルトの名無しさん:2011/09/11(日) 00:31:01.75
>>381
strtol() + sprintf()
384デフォルトの名無しさん:2011/09/11(日) 00:31:33.48
atoi()は10進数だったな。
385デフォルトの名無しさん:2011/09/11(日) 00:41:31.22
#define ASCII_CODE_1 'F' /* int */
#define ASCII_CODE_2 "F" /* 文字列 */
#include <stdio.h>
#include <string.h>
int main(void) {
  char buf[2], c['F'][4];
  int k, i['F'];
  strcpy(&c['0'][0], "0x0"); i['0'] = 0x0;
  strcpy(&c['1'][0], "0x1"); i['1'] = 0x1;
  strcpy(&c['2'][0], "0x2"); i['2'] = 0x2;
  strcpy(&c['3'][0], "0x3"); i['3'] = 0x3;
  strcpy(&c['4'][0], "0x4"); i['4'] = 0x4;
  strcpy(&c['5'][0], "0x5"); i['5'] = 0x5;
  strcpy(&c['6'][0], "0x6"); i['6'] = 0x6;
  strcpy(&c['7'][0], "0x7"); i['7'] = 0x7;
  strcpy(&c['8'][0], "0x8"); i['8'] = 0x8;
  strcpy(&c['9'][0], "0x9"); i['9'] = 0x9;
  strcpy(&c['A'][0], "0xA"); i['A'] = 0xA;
  strcpy(&c['B'][0], "0xB"); i['B'] = 0xB;
  strcpy(&c['C'][0], "0xC"); i['C'] = 0xC;
  strcpy(&c['D'][0], "0xD"); i['D'] = 0xD;
  strcpy(&c['E'][0], "0xE"); i['E'] = 0xE;
  strcpy(&c['F'][0], "0xF"); i['F'] = 0xF;
  k = ASCII_CODE_1;
  printf("%d: %0X / %s\n", i[k], i[k], &c[k][0]);
  strcpy(&buf[0], ASCII_CODE_2);
  k= buf[0];
  printf("%d: %0X / %s\n", i[k], i[k], &c[k][0]);
  return 0;
}
386デフォルトの名無しさん:2011/09/11(日) 01:25:52.07
>>385
バッファオーバーフロー
387デフォルトの名無しさん:2011/09/11(日) 01:36:37.49
#include<stdio.h>
#include<string.h>
#include<ctype.h>

int ascii2num(int ascii_code){
if(!isxdigit(ascii_code)) return -1;
if(isdigit(ascii_code)) return ascii_code-'0';
return toupper(ascii_code)-'A'+10;
}

int main(void){
int x;

x=0x46;
printf("ascii2num(0x%02x)=%d\n", x, ascii2num(x));
x=0x66;
printf("ascii2num(0x%02x)=%d\n", x, ascii2num(x));
x=0x10;
printf("ascii2num(0x%02x)=%d\n", x, ascii2num(x));

return 0;
}
388デフォルトの名無しさん:2011/09/11(日) 01:37:33.57
>>381
#include <stdio.h>
int main(void){
char s;
printf("s = ");
s = getchar();
if (s >= 0x30 && s <= 0x39)
s -= 0x30;
if (s >= 0x41 && s <= 0x46)
s -= 0x37;
printf("%p¥n", s);
return 0;
}
389デフォルトの名無しさん:2011/09/11(日) 01:55:10.74
なんでポインタじゃないのにpなんだxだろ
390デフォルトの名無しさん:2011/09/11(日) 12:11:30.77
なんでインデント幅が2なんだろ?
391デフォルトの名無しさん:2011/09/11(日) 21:45:40.68
C言語って高校生でもできますか?また、習得したら何に使うのですか?
392デフォルトの名無しさん:2011/09/11(日) 21:50:44.28
受験勉強に時間を費やした方が良い
プログラミングなんかできても就職にも何にも役に立たない
393デフォルトの名無しさん:2011/09/11(日) 22:09:51.62
受験勉強としては語学と微積分と行列に集中することをお勧めします。
394デフォルトの名無しさん:2011/09/11(日) 22:55:18.63
>>391
自分は中学の時に独学で覚えたけど、作りたいものが無かったら、覚えても無意味だよ
395デフォルトの名無しさん:2011/09/11(日) 23:59:31.03
高校でアセンブラ独学で覚えた。
アセンブラよりCの方が簡単…かな?

>また、習得したら何に使うのですか?
「英語は何に使うのですか?」レベルの質問。
やりたい事に使え。
396デフォルトの名無しさん:2011/09/12(月) 00:59:49.79
VisualStudioの2010ExpressでC++の入門書を使って勉強しようとしています。

しかし、入門書では、コマンドプロンプトでコンパイルする方法で説明されていますが、
VSを使ってコマンドプロンプト方式で勉強する方法がわかりません。
Projectを作成する時にもCLRコンソールアプリケーションというのを選択すると
ソースに以下のような表示が出てしまい、これで、コンソールに表示する状態になっている
ようですが、本に書いてある内容と違います。
本には、以下のようなソースがかかれています
----------------------------
#include <iostream>
using namespace std;
cout << "こんにちは世界";
------------------------------
VS2010には以下のようなソースが表示されてしまいます。
本のような表示で勉強するにはどうしたらいいのでしょうか?
------------------------------------

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
Console::WriteLine(L"Hello World");
return 0;
}
397デフォルトの名無しさん:2011/09/12(月) 01:12:07.40
CLR 以外
398デフォルトの名無しさん:2011/09/12(月) 01:51:39.39
>>396
それはC++じゃなくてC++/CLRという別の言語にさせられてる
なので、>>397のいうとおり、CLRを禁止する
399デフォルトの名無しさん:2011/09/12(月) 05:29:32.16
>>396
C++の話題はスレ違いだろ。
後、基礎的な勉強ならVCよりMinGWやCygwin導入した方が良いな。
400デフォルトの名無しさん:2011/09/12(月) 07:06:00.19
>>396
空のプロジェクトを選択
401デフォルトの名無しさん:2011/09/12(月) 11:30:38.32
なんでcallocで浮動小数点を確保しても0.0e0になるとは限らないんですか?
402デフォルトの名無しさん:2011/09/12(月) 12:55:00.80
>401
だいたい0.0になるから
403デフォルトの名無しさん:2011/09/12(月) 16:47:19.30
俺の環境でさっき試したらmalloocで確保しただけでvar==0.0e0になってた。
逆に気持ち悪い
404デフォルトの名無しさん:2011/09/12(月) 17:11:23.20
他のプロセスが残したデータが読めてしまうとセキュリティ上問題があるので、
OSからもらった直後はゼロでクリアする環境もある。
free/mallocを繰り返せばゼロ以外になるかも。
405デフォルトの名無しさん:2011/09/12(月) 20:53:06.99
オールビット0が浮動小数点数において0.0を示す事は規格で保証されてないよな
406デフォルトの名無しさん:2011/09/12(月) 21:37:40.53
IEEE754なら+0になると思うけど
それ以外の環境ってどんなのがあるの
407396:2011/09/12(月) 21:43:36.55
>>397
>>398
>>399
>>400

ありがとうございます。
指示通り空のプロジェクトを作ってみたのですが、
ファイルから、ソースコードを追加して、以下の
ようなコードを書いて、デバッグをしてみましたが、
「visual studio2010\Projects\test3\Debug\test.exeを開始できません。」
「指定されたファイルが見つかりません」

と表示されてエラーになります。
これはどうしたらいいのでしょう・・・
コマンドプロンプトみたいな形で勉強することはVSではできないのでしょうか?
-------------------------------
#include <iostream>
using namespace std;

int main()
{
cout << "こんにちは世界";
}
-------------------------------
408デフォルトの名無しさん:2011/09/12(月) 21:46:16.78
Linux+vi+gccからやり直せ
409デフォルトの名無しさん:2011/09/12(月) 21:55:25.88
>>407
下手な事するな

空のプロジェクトに新規ソースで作って打ち直せ

そしたら動くと思うから、そのソースを書き換えてまずは入門書の内容を進めろ

ツールの使い方は最低限に留めて、言語の学習に専念しろ

ツールの使い方は、入門書終わってからでも遅くない
(元々mfcや.net使うために複雑なんだから)
410デフォルトの名無しさん:2011/09/12(月) 22:06:32.84
>>407
自分はlinuxでgccのみなので詳しくないですが、
VC++ってiostream使うときにライブラリーのリンク指定する必要があったような記憶。

テンプレート実装以前のC++しか知らないけど、coutって今でも現役なのか・・・(感涙
411デフォルトの名無しさん:2011/09/12(月) 22:13:14.32
スレ違いの質問には答えるなよ馬鹿共。

>>396,407
↓で聞け


【初心者歓迎】C/C++室 Ver.76【環境依存OK
http://hibari.2ch.net/test/read.cgi/tech/1312621728/
くだすれC++/CLI(初心者用)part2
http://hibari.2ch.net/test/read.cgi/tech/1268613679/
★初心者にVisual C++を教えるスレ★ Part37
http://hibari.2ch.net/test/read.cgi/tech/1299982561/
412396:2011/09/12(月) 22:34:42.64
>>408
なんか、そのほうがいい気がしてきました・・
>>409
空プロジェクトに新規ソースを作ったのですが・・うまくいかないのです・・
>>410
おっしゃるとおり、iostreamのリンクが指定されていないのかもしれません。
というか、ライブラリのリンク先を指定する必要があるんですね・・
鬱です・・

>>411
ご迷惑おかけしました・・・C++はここではやはりだめでしょうか・・
413 ◆tr.t4dJfuU :2011/09/12(月) 22:44:05.72
1.VSを起動する
2.ファイルメニュー⇒新規作成→プロジェクト
3.Visual C++→全般→空のプロジェクト プロジェクト名と場所を入れる <OK>
プロジェクト名:test3
場所:...\visual studio2010\Projects
4.ソースファイル→右クリック⇒追加→新しい項目
5.コード→C++ファイル ファイル名を入れる <追加>
ファイル名:test3.cpp
#include <iostream>
6.ビルドメニュー⇒ソリューションのビルド
414396:2011/09/12(月) 23:14:25.11
>>413
今からやってみます。
あと、ちなみにLinuxでビルドしてみましたら、Linuxではできました
Linuxではg++っていうコンパイラを入れないといけないんですね。
よく知らなかったので驚きました。また報告します
415396:2011/09/12(月) 23:27:31.03
>>413
ありがとうございます。
はじめは言われたとおりにやってもだめだったのですが、
何度か行うと、ヘッダファイルが読み込まれて、うまくいくようになりました。
ただ、ビルドしたあとでデバッグを実行すると、一瞬黒いDOS窓が出て、
チラっとHelloWorldと出ただけですぐに消えてしまうのですが、これは仕方ないのでしょうか?
質問ばかりですみません・・・
416デフォルトの名無しさん:2011/09/12(月) 23:29:08.29
何回もやってると段々表示される時間が延びていくよ
417396:2011/09/12(月) 23:29:19.90
みなさん、本当にありがとうございます。
また、すれ違いだったようですみません。
統合開発環境って以外と難しいんですね
418デフォルトの名無しさん:2011/09/12(月) 23:37:37.77
>>415

#include <iostream>
using namespace std;

int main()
{
cout << "こんにちは世界";
while(1){}
}

こうしたら終わらない
419 ◆tr.t4dJfuU :2011/09/12(月) 23:59:42.50
3.Visual C++→CLR→空のCLRプロジェクト プロジェクト名と場所を入れる <OK>

表示されてる時間がチョット伸びる
Visual Studio 2010 Part16
http://hibari.2ch.net/test/read.cgi/tech/1312046969/l5
420デフォルトの名無しさん:2011/09/13(火) 00:21:41.56
これからC言語を勉強したいので用意するものを教えてください
421デフォルトの名無しさん:2011/09/13(火) 00:26:51.02
>>420
K&R, ubuntu
422355:2011/09/13(火) 00:43:39.77
>>357
WindowsXPのコマンドプロンプトで、コンパイラがBorland c++ Compilerです。

>>360
改行はあまり関係ないみたいです。例えば次のプログラム

#include <stdio.h>

int main(void){
  char a[8] = "A";
  char b[8] = {'\0'};
  char c = '\0';

  sscanf(a, "%[B]%c", b, &c);
  printf("b:%s.\n", b);  /* 「b:.」と表示されるはず */
  printf("c:%x.\n", c);  /* 「c:0.」と表示されるはず */

  return 0;
}

を実行すると、自分の環境では

b:.
c:41.

と出力されてしまいます。
423396:2011/09/13(火) 01:25:39.51
>>416
全然のびません・・・
>>418
ありがとうございまう。参考にしました
>>419
CLRを使うだけで若干こわいんですが・・
424デフォルトの名無しさん:2011/09/13(火) 01:27:36.36
全裸になって四つん這いになって片足を上げてしーこっこしたらうまくいくよ
425デフォルトの名無しさん:2011/09/13(火) 02:25:54.89
コマンドプロンプトからコンパイル、リンク、実行が、はやくできるといいね
統合開発環境は関係ないよ(ヘルプは便利かも)
コマンドラインでやるには、
パスがとおってるか、そういう問題を解決するべき
426デフォルトの名無しさん:2011/09/13(火) 04:14:21.51
>>423
なんでスレ違いだってわかっていながら延々話してんだ?
427デフォルトの名無しさん:2011/09/13(火) 05:02:10.11
++だからでしょ
428デフォルトの名無しさん:2011/09/13(火) 08:52:23.88
配列("array")のアドレスについてお聞かせください。

char array[6] = "Apple";

ここで、printf("%p")で表示すると"array"と"&array"とで表示されるアドレスが同じになります。
"array"と"&array[0]"で表示される値が同じなのはなんとなく理解できるのですが、
"array"と"&array"で表示される値が同じになる理由がよく理解できません。
この二つの表記ってプログラム上どっちを書いても全く同じになるのでしょうか?
よろしくお願いします。
429デフォルトの名無しさん:2011/09/13(火) 08:54:14.34
指した先の型は違っても、値が同じと言うだけのこと。
430デフォルトの名無しさん:2011/09/13(火) 09:13:25.10
>>428
http://c-production.com/contents/c/sec10.html

勉強中でココを見てます
配列についても解説してるよ
431デフォルトの名無しさん:2011/09/13(火) 09:22:19.54
>>429
素早いレスどうもです。
ただ申し訳ないのですが、こちら側の力不足で未だに理解できませんです...orz

「指した先の型」とは、"array""&array"の指している先の型ということでしょうか?
"array"が指している先の型はchar型のアドレス(配列の先頭アドレス)だと思うのですが、
"&array"が指している先の型とは何になるのでしょうか?
すみませんがよろしくです。
432デフォルトの名無しさん:2011/09/13(火) 09:23:42.78
>>430
ありがとうございます。
早速読ませていただきます!
433デフォルトの名無しさん:2011/09/13(火) 09:31:48.05
サイズが6のchar型配列のアドレス
434デフォルトの名無しさん:2011/09/13(火) 09:44:58.91
>>428
printf("%p", array)はarray配列のアドレスを出力
printf("%p", &array)はarray配列のアドレスを得てそれを出力

・・・同じ事だろ
435デフォルトの名無しさん:2011/09/13(火) 09:48:55.42
>>434
別人だけど
結局の所、そうゆう仕様だよって覚えるしか無いんですよね
436デフォルトの名無しさん:2011/09/13(火) 09:49:53.86
>>434
仕様でもなんでもなくて、単に同じ事をしてるだけじゃん
437デフォルトの名無しさん:2011/09/13(火) 09:50:17.58
>>434
違います
438デフォルトの名無しさん:2011/09/13(火) 10:15:54.67
printf("%p", array + 1);
printf("%p", &array + 1);

をしてみればわかるかも
439デフォルトの名無しさん:2011/09/13(火) 10:31:21.66
ついでに
printf("%p¥n",*array+1);もね
それとそれぞれの+1を取った場合も出力してみるといいかもって
さっき紹介したページの受け売りだけどさ

多少理解出来たけど
何でそうなるのとか、この後どう使えばいいのかってのが全然浮かばない
440デフォルトの名無しさん:2011/09/13(火) 11:00:49.05
C自体がメモリの扱い方にルールを決めた手法だから
charは何を指し、printfは何を指すのか
説明書を見比べた方が早い
441デフォルトの名無しさん:2011/09/13(火) 11:33:04.57
ここ教える側も初心者なんだなみんな無茶苦茶
442デフォルトの名無しさん:2011/09/13(火) 11:40:28.79
だね。
443デフォルトの名無しさん:2011/09/13(火) 11:41:11.07
飛び交う会話が間違ってると思い込もおうと努力する初心者
444デフォルトの名無しさん:2011/09/13(火) 11:44:40.67
日本語でOK
445デフォルトの名無しさん:2011/09/13(火) 11:46:42.24
常用漢字すら読めないとかVIPにお帰りください
446428:2011/09/13(火) 12:00:33.39
>>433-440
レス本当に感謝です!
色々調べてみた結果、自分が何で悩んでいたのかが分かった気がします。

自分の混乱の原因を説明すると
「配列とは変数(小さな箱)を格納する大きな箱で、変数とは別個に実体を持つ」
という風に考えていた点だと思います。
「別個に実体を持つ」と考えたのは、ポインタと同一視していた為だと思います。
〜次〜
447428:2011/09/13(火) 12:01:49.14
そして、"array"と"&array"に関して持ったイメージとしては、
「部屋に小さな箱が敷き詰めてあり、その一番先頭にある箱をAした場合、
 この"箱群"の一番先頭にある箱のアドレス(array)は箱Aのアドレスであり、
 この"部屋"の一番先頭にある箱のアドレス(&array)も箱Aのアドレスである。」
といった感じです。意味不かもしれません^^;

でも謎が少し解けました。皆さんご助言感謝です!
448デフォルトの名無しさん:2011/09/13(火) 12:23:43.09
"箱群"と"部屋"の違いってなんですか?
449428:2011/09/13(火) 12:42:24.64
>>448
箱群(array)
箱A == array
箱B == (array+1)
箱C == (array+2)
部屋(&array)
 部屋Aの箱A == *(&array)
部屋Bの箱A == *(&array+1)
部屋Cの箱B == (*(&array+2)+1)

という風に理解しました。
未だしっかり理解できてるか分からないのに、意味不な例えをして
すみません^^;
450デフォルトの名無しさん:2011/09/13(火) 12:48:24.62
ここで構造体を持ち出したらどれだけ混乱するだろうか…
451デフォルトの名無しさん:2011/09/13(火) 13:06:06.06
// char aaa[4]

struct ___A {
    char a0;
    char a1;
    char a2;
    char a3;
};

struct ___A A;
printf("%p\n", &(A.a0) );    // printf("%p\n", aaa);
printf("%p\n", &A   );    // printf("%p\n", &aaa);

こんなイメージであってますか
452デフォルトの名無しさん:2011/09/13(火) 13:21:21.04
>>396 の云うコマンドプロンプトでコンパイルって
実はコンソールアプリケーションでDOSプロンプト画面にhollow worldって表示することだよな
453デフォルトの名無しさん:2011/09/13(火) 14:08:44.14
>>449
難しく考えすぎ
454デフォルトの名無しさん:2011/09/13(火) 14:34:30.75
コマンドプロンプトからVSのビルドをする方法を知りたいんだろう
455デフォルトの名無しさん:2011/09/13(火) 15:41:13.31
>>447
ああ、うん、ぴっちりつまってるから、最初の箱のアドレスは部屋のアドレスと同じ。

ちなみに、 arrayは配列の要素の型に対するポインタを生むけれど、&array は配列型のポインタを生む。
それを実感することはしばらくないかもしれないけれど、
&array という記述は、それが必要になるまでしないほうがいいと思う。
456デフォルトの名無しさん:2011/09/13(火) 16:33:05.54
arrayの型は (char *)
&arrayの型は (char (*)[6])

いずれにしろ生成されるバイナリは一緒。
457デフォルトの名無しさん:2011/09/13(火) 18:35:09.62
なんだかなぁ
458デフォルトの名無しさん:2011/09/13(火) 18:36:04.09
>>452
基本的な事しか答えられないからって、スレ違いの質問に一生懸命答える必要は無い。
459デフォルトの名無しさん:2011/09/13(火) 18:38:02.26
教える側も教えられる側もポインタの理解が今一つな事が混乱に拍車をかけてる感じがするな。
460デフォルトの名無しさん:2011/09/13(火) 18:41:07.38
int型の掛け算を1億回するのと、float型の掛け算を1億回するのとでは、速度に差はありますか。どっちが速いですか
461デフォルトの名無しさん:2011/09/13(火) 18:58:49.44
ポインタで悩むくらいなら
こんにちはマイコンとシャープのポケコンと情報処理試験のテキスト買って勉強した方が早いよ
462デフォルトの名無しさん:2011/09/13(火) 18:58:51.82
CPUの設計しだい。
463デフォルトの名無しさん:2011/09/13(火) 19:04:14.53
>>428

配列のポインタ変換についてのルールは3つ。
@式中の配列名は配列の最初の要素へのポインタとして扱われる
A添え字は常にポインタへのオフセットと同じ
B関数の引数宣言中の配列名は配列の最初の要素へのポインタとして扱われる
464デフォルトの名無しさん:2011/09/13(火) 19:05:29.39
>460
ためせばいいやん。
その程度のプログラム書けないなら考えない方がいい。
465デフォルトの名無しさん:2011/09/13(火) 19:17:16.21
>>463
arrayで渡されるのは配列の最初の要素へのポインタ
&arrayで得られるのも配列の最初の要素へのポインタ

printfから見ればどちらも同じという事?
466デフォルトの名無しさん:2011/09/13(火) 19:45:11.93
>>465
>>463
>arrayで渡されるのは配列の最初の要素へのポインタ
Yes.
>&arrayで得られるのも配列の最初の要素へのポインタ
No.

>printfから見ればどちらも同じという事?
Yes.
467デフォルトの名無しさん:2011/09/13(火) 19:52:24.18
sizeof の値はどうなる? と地雷を置いてみる
468デフォルトの名無しさん:2011/09/13(火) 20:25:36.40
どちらもポインタだからsizeofをとっても同じじゃないの。
規格ではそういう想定をしてないとは思うけど
469460:2011/09/13(火) 20:26:08.22
http://codepad.org/HAoFYvBq

こんな結果だった gcc -O0

tasizan [2231050796]clock 1 4 9
kakezan [1190589036]clock 25.000000 36.000000 49.000000

掛け算の方が所要クロックが少なくて速かった。
掛け算のほうが2倍くらい速かった。
470デフォルトの名無しさん:2011/09/13(火) 20:34:20.66
>>468
array は配列だよ (>>428)
471デフォルトの名無しさん:2011/09/13(火) 20:45:51.53
#include <stdio.h>
int main()
{
char array[6] = "Apple";
printf("sizeof(array)=%d\n", sizeof(array));
printf("sizeof(&array)=%d\n", sizeof(&array));
printf("sizeof(*&array)=%d\n", sizeof(*&array));
printf("sizeof(&array[0])=%d\n", sizeof(&array[0]));
printf("sizeof(*&array[0])=%d\n", sizeof(*&array[0]));
return 0;
}
472デフォルトの名無しさん:2011/09/13(火) 20:50:52.44
>>468
例外(>>428)を除き、宣言時の型になる。
&arrayはそのままだったらポインタのサイズ
逆参照したら配列のサイズ
473460:2011/09/13(火) 20:55:47.74
http://codepad.org/MRYeahvW

足し算かとおもったら掛け算してた。なおした。

tasizan [1520466571]clock 2 4 6
kakezan [1150270199]clock 25.000000 36.000000 49.000000

やっぱり掛け算の方が速い。
足し算おせえーーーーーーーーーーwwwwwwwwwwwwwww
474460:2011/09/13(火) 21:10:23.99
なんで足し算なんてしてるんだ。意味がわからない。

話はかわって、乱数で、1か−1の乱数で、全部足していくと、できた波形がブラウンノイズになりますか。
とおもってやったら、なったけど、これは変だとおもった。
乱数があるていど周期的ってことだから乱数じゃないよ。っておもった。もし乱数だったら、すごく大きな風になったり、おおきなところで揺れ続けたりすることもあるはずだとおもったから。
そこで、すく乱数な乱数でも波がちゃんと範囲内に収まるように補正することが必要だとおもった。どうやればいいですか。
475463:2011/09/13(火) 21:33:01.87
なんか途中で送信してて、大事な部分が抜けてたorz

配列のポインタ変換についてのルールは3つ。
@式中の配列名は配列の最初の要素へのポインタとして扱われる
A添え字は常にポインタへのオフセットと同じ
B関数の引数宣言中の配列名は配列の最初の要素へのポインタとして扱われる

@にも例外が3つある。後は全て配列の先頭要素へのポインタになる。
a. sizeofの対象になる  (配列全体が対象)
b. &演算子の対象となる (配列全体が対象)
c. 初期化文字列     (char *)
476デフォルトの名無しさん:2011/09/13(火) 21:36:40.12
>>474
すく乱数ってなんですか?
477デフォルトの名無しさん:2011/09/13(火) 21:40:24.21
"array"   ・・・ @→配列の先頭へのポインタ (char)
"array[0]" ・・・ @→配列の先頭へのポインタ (char)
"&array"  ・・・ a→配列そのものへのポインタ (char[6])
478460:2011/09/13(火) 21:54:11.18
>>476
スペルミスしてました
☓すく乱数
○すごく乱数です
479デフォルトの名無しさん:2011/09/13(火) 21:54:45.36
Linuxのデバイスファイルの扱い方を解説してる
サイトや参考書で良いのあったら教えてください
480デフォルトの名無しさん:2011/09/13(火) 22:01:16.03
>>478
凄くスレ違いです。
481デフォルトの名無しさん:2011/09/13(火) 22:03:12.71
流れぶった切ってごめんなさい。
独学でVBA(Excel)使って書いたプログラムをCに書き直したいのだが、
なにかいい、本とかサイトとかあれば教えてほしい。
Cに関しては「C言語プログラミング能力認定試験」2級程度には理解した。
今引っかかってるのは、Formの作成。ボタンやらコンボボックスやらを配置したアレ。
よろしくおながいします。
482デフォルトの名無しさん:2011/09/13(火) 22:05:30.93
CはうんこだからGUI操作でボタン貼り付けたりできないよ
C#かJavaがいいんじゃね
483460:2011/09/13(火) 22:10:17.34
>>479
ここは英語だったです
https://github.com/torvalds/linux/tree/master/Documentation/input

>>480
乱数はC言語じゃないのか…むずかしい(・_;ノシ
484デフォルトの名無しさん:2011/09/13(火) 22:22:50.56
>>482
フリーソフトをダウンロードすると、操作フォームが必ずあるけど
(コマンドプロンプト入力ではユーザーの大半が使えないと思う)
あれはC言語以外で書いてるのかな?
485デフォルトの名無しさん:2011/09/13(火) 22:26:04.54
>>481
Cの標準ライブラリにはGUIがないので
なんらかの外部ライブラリが必要です
486デフォルトの名無しさん:2011/09/13(火) 22:30:46.60
>>483
* Cソース mt19937ar.c ,
* その出力 mt19937ar.out ,
* および readme-file readme-mt.txt です。
使い方は、上記readme-mt.txtファイル(英語)を読んで下さい。
日本語による説明 readme-mt-jp.html

Mersenne Twister
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/mt19937ar.html
487デフォルトの名無しさん:2011/09/13(火) 23:28:20.41
>>484
Windowsの話なら、APIを使えばCでも書けるけど割りと面倒。

>>483
例えばあんたは、不思議の国のアリスの言葉遊びについて英語の初心者板で質問するのか?
つまり、そういうことだ。
488460:2011/09/14(水) 00:57:21.16
gladeっていうウインドウをデザインするやつを使うと、CUIぷろgるあみんぐしたのを元にして簡単にGUTにもできて簡単でおすすめえですー(^_^/
gtkだからC言語だからprontfもつかえるしスタジオ.hも動くからQtとかよりCっぽくてGTKいいとおもいます。おすすめ。


さっきの一億回のやつをGUIにしたみました GTK+3ってのをリンクするようになってるます
a.c
http://codepad.org/5KZOP3LW

a.glade
http://codepad.org/gYy1IuPZ

Makefile
http://codepad.org/54Ujrt6i

3こを同じとこにいれてmakeってやれば作れるた
489460:2011/09/14(水) 00:58:26.70
>>486
ありがとうございました今度やってみます

>>487
不思議の国のアリス読んだこと無いです。ありがとうございます。こんど読んでみます。
ねま0す
490デフォルトの名無しさん:2011/09/14(水) 03:50:04.86
うぜえ
491デフォルトの名無しさん:2011/09/14(水) 03:57:18.31
うぜえついでにいうと、GTK+使うってことは逆アセされても文句言えないよ
492デフォルトの名無しさん:2011/09/14(水) 04:55:04.51
初心者の作るプログラムを解析するほどみんな暇じゃないから心配しなくて良いw
493デフォルトの名無しさん:2011/09/14(水) 08:03:41.67
初心者のほうが解析されることを嫌がるからじゃないかな
494デフォルトの名無しさん:2011/09/14(水) 08:18:12.00
何で嫌がるんだろう
理解できん
495デフォルトの名無しさん:2011/09/14(水) 09:02:55.02
解析されて困るのは暗号、プロテクトぐらいだろ。

解析する技能持ってる人なら見た目の動作なら簡単に再現できるんじゃね?
496428:2011/09/14(水) 09:07:37.29
>>456,463,471,477さん等々
レス付け足して頂いた方々ありがとうございますです!
コード上での配列名の取り扱いに関してたくさん誤解してる部分が
あったと認識できました。後"&"なども何も考えず使ってました・・・(;;
もっとデータ型とかポインタ、演算子の働き等をしっかり意識して勉強していこうと思います!
497デフォルトの名無しさん:2011/09/14(水) 09:16:45.82
>>471
Borlandとgccでsizeof(&array)の値が異なるけど何故でしょうか?
コンパイラオプション?

[Borland C++ 5.5.1 for Win32]

sizeof(array)=6
sizeof(&array)=6
sizeof(*&array)=6
sizeof(&array[0])=4
sizeof(*&array[0])=1

Target: i686-w64-mingw32
Thread model: win32
gcc version 4.4.3 (GCC)

sizeof(array)=6
sizeof(&array)=4
sizeof(*&array)=6
sizeof(&array[0])=4
sizeof(*&array[0])=1
498デフォルトの名無しさん:2011/09/14(水) 09:39:22.29
Borland の 2番目、アドレスのサイズが6バイトって、、、、、バグじゃん。
499デフォルトの名無しさん:2011/09/14(水) 09:54:16.76
明らかにバグだね。
試しにint[5]の配列作ってsizeofしたら20になってた。
__int64とかは4だったから、配列の時にだけ指してる先のサイズが返るみたい。
500デフォルトの名無しさん:2011/09/14(水) 10:20:48.22
Borlandはちょこちょこ変なとこあるよな
501デフォルトの名無しさん:2011/09/14(水) 10:24:19.57
VS2010, TinyC, DMCの3つのコンパイラで試した結果は全て
sizeof(&array)=4
だった。

旧Borlandだけ違う挙動をするのかな?
502デフォルトの名無しさん:2011/09/14(水) 11:23:52.03
Win32用ならありえんな。
DOS 16Bit用でそういうメモリーモデルあるのかな?
503デフォルトの名無しさん:2011/09/14(水) 11:35:22.04
D:\work>wcl386 bug.c
Watcom C/C++32 Compile and Link Utility Version 11.0
Copyright by Sybase, Inc., and its subsidiaries, 1988, 1997.
All rights reserved. Watcom is a trademark of Sybase, Inc.
wcc386 bug.c
Watcom C32 Optimizing Compiler Version 11.0
Copyright by Sybase, Inc., and its subsidiaries, 1984, 1997.
All rights reserved. Watcom is a trademark of Sybase, Inc.
bug.c: 6 lines, included 476, 0 warnings, 0 errors
コードサイズ: 34

WATCOM Linker Version 11.0
Copyright by Sybase, Inc., and its subsidiaries, 1985, 1997.
All rights reserved. Watcom is a trademark of Sybase, Inc.
オブジェクトファイルを読込み中
ライブラリを検索中
a Windows NT character-mode 実行可能 を作成中

D:\work>bug
sizeof(&array)=4

D:\work>
504デフォルトの名無しさん:2011/09/14(水) 12:07:43.74
C++Builder6とRAD Studio XE1では6になる。
やはりボーランド系実装特有の挙動か
505デフォルトの名無しさん:2011/09/14(水) 12:14:22.73
Microsoftの昔のコマンドラインコンパイラーでしたら6がかえってきた。

sizeof(&array)=6

C:\>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]
506デフォルトの名無しさん:2011/09/14(水) 12:17:31.74
Cじゃなくなっちゃうけどtype_info.name() とったらどうなんだろ
507デフォルトの名無しさん:2011/09/14(水) 12:27:16.42
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

sizeof(&array)=4

この辺りで変わった?
508デフォルトの名無しさん:2011/09/14(水) 12:33:02.39
なんか面白いな
LSI C-86 Ver.3.30だと2になるw


D:\LSIC86\BIN>lcc test.c
lld @link.i

D:\LSIC86\BIN>test.exe
sizeof(array)=6
sizeof(&array)=2
sizeof(*&array)=6
sizeof(&array[0])=2
sizeof(*&array[0])=1
509デフォルトの名無しさん:2011/09/14(水) 12:50:19.86
Comeau C/C++ 4.3.10.1(Backend: Borland C++ 5.5.1)
sizeof(array)=6
sizeof(&array)=4
sizeof(*&array)=6
sizeof(&array[0])=4
sizeof(*&array[0])=1
510デフォルトの名無しさん:2011/09/14(水) 13:04:31.73
Microsoft(R) C/C++, Version 7.0
(C) Copyright Microsoft Corporation, 1992

C:\C700\BIN>
sizeof(array)=6
sizeof(&array)=6
sizeof(*&array)=6
sizeof(&array[0])=2
sizeof(*&array[0])=1

Borland Turbo C++ Version 4.0
sizeof(array)=6
sizeof(&array)=6
sizeof(*&array)=6
sizeof(&array[0])=2
sizeof(*&array[0])=1
511デフォルトの名無しさん:2011/09/14(水) 13:10:35.46
16ビットから32ビットへの移行期に挙動が変わってる感じだね。
Borlandのコンパイラの内部処理は10年以上同じで変わってないという話を聞いた事がある。

Cの仕様書ではどうなってんの?
これだけバラバラだと実装依存かな。
512デフォルトの名無しさん:2011/09/14(水) 14:03:28.19
そういう問題じゃない
513デフォルトの名無しさん:2011/09/14(水) 14:20:15.35
アドレス幅20bitだもんな。
514デフォルトの名無しさん:2011/09/14(水) 16:01:16.07
今Borland C++ Builder 6で試してみた。

__int64 i = 0;
printf("%d\n", sizeof(&i));

としたら返ってきたのは4だった。
参照先のサイズが返るのは配列名の時だけみたい。

Borland系のコンパイラだけsizeof(&配列名)した時にsizeof(*(&配列名))になってしまうという事か?
515デフォルトの名無しさん:2011/09/14(水) 16:19:00.83
メモリ空間が4G
516デフォルトの名無しさん:2011/09/14(水) 16:53:35.64
Visual C++ 1.52 (1993)
sizeof(array)=6
sizeof(&array)=6
sizeof(*&array)=6
sizeof(&array[0])=2
sizeof(*&array[0])=1
sizeof(&c)=2

Borland Turbo C++ 4.0 (1995)
sizeof(array)=6
sizeof(&array)=6
sizeof(*&array)=6
sizeof(&array[0])=2
sizeof(*&array[0])=1
sizeof(&c)=2

Borland C++ Compiler
sizeof(array)=6
sizeof(&array)=6
sizeof(*&array)=6
sizeof(&array[0])=4
sizeof(*&array[0])=1
sizeof(&c)=4

MinGW+GCC 4.5.2
sizeof(array)=6
sizeof(&array)=4
sizeof(*&array)=6
sizeof(&array[0])=4
sizeof(*&array[0])=1
sizeof(&c)=4
517デフォルトの名無しさん:2011/09/14(水) 16:54:53.19
Borland C++ Compilerだけ明らかにおかしい。
518デフォルトの名無しさん:2011/09/14(水) 17:14:52.10
妙な結果
519デフォルトの名無しさん:2011/09/14(水) 17:16:38.73
つまり配列のアドレスは取らないほうがいいって結論でおk?
520デフォルトの名無しさん:2011/09/14(水) 17:18:50.30
>>517
なんでそんな結論になるんだ?
一致するコンパイラがないってことは実装依存ってことだから、
BCCだけおかしいというよりsizeofの結果に期待したコードは書かない方がいいってことじゃね
521デフォルトの名無しさん:2011/09/14(水) 17:22:39.57
>>520
BCCだけ一貫してないから。

他のコンパイラはアドレッシングしてる先のサイズか、ポインタのサイズを返してるが
BCCだけは配列だけ違う挙動をしてる。
522デフォルトの名無しさん:2011/09/14(水) 17:30:28.09
仕様読んだらBCCの方が正しい実装って気もしてきた
ちょっと自信ないからエロイ人の解説待ち
523デフォルトの名無しさん:2011/09/14(水) 17:31:12.40
=6
って、おかしくねえか
524デフォルトの名無しさん:2011/09/14(水) 17:33:43.47
>>522
仕様書のsizeofの部分だけ書いてよ。
持ってないから見てみたい。
それとも何処かで見られるのかな?

仕様書ってどのCの仕様書?
525デフォルトの名無しさん:2011/09/14(水) 17:34:08.26
char (*p)[6], array[6];
p = &array;
で、右辺と左辺のサイズが違うとかw
526デフォルトの名無しさん:2011/09/14(水) 17:34:23.62
Borland C++ 5.5.1
sizeof(&array)=6
sizeof(&array+1)=4
527デフォルトの名無しさん:2011/09/14(水) 17:38:37.21
そもそもarray==&array[0]だよね?
&arrayって何を指してるの?
528デフォルトの名無しさん:2011/09/14(水) 17:43:28.44
529デフォルトの名無しさん:2011/09/14(水) 17:45:08.29
arrayはarrayの先頭アドレス。&arrayは(array+0)のアドレス。
530デフォルトの名無しさん:2011/09/14(水) 17:46:54.69
それは規格的には正しくないと思う
531デフォルトの名無しさん:2011/09/14(水) 18:40:35.30
char array[6] だとして &array なんて書き方する?
普通は *array++ = とかだろ。 arrayだろ。
&arrayなんてコンパイル通さないでワーニングにしてくれた方がありがたいわ。
532デフォルトの名無しさん:2011/09/14(水) 19:21:08.23
VC++だと

char array[6];
char *p=&array;
error C2440: '初期化中' : 'char (*)[6]' から 'char *' に変換できません。

ってなるな。
エラーレベルいじるか、キャストすれば通るんだろうけど。
533デフォルトの名無しさん:2011/09/14(水) 19:26:18.23
>>532
型を一致させないと
534デフォルトの名無しさん:2011/09/14(水) 19:27:59.95
>>532
当たり前だ。
もう一回ポインタ勉強し直してこい。

char (*p)[6];
char array[6];

p = &array;
535デフォルトの名無しさん:2011/09/14(水) 20:57:10.28
仕様書 チン☆⌒ 凵\(\・∀・) まだぁ?
536デフォルトの名無しさん:2011/09/14(水) 21:02:41.16
俺が仕様だ
537デフォルトの名無しさん:2011/09/14(水) 21:15:40.14
俺は仕様書にはなれない
538デフォルトの名無しさん:2011/09/14(水) 23:44:48.94
C言語では変数のスコープはローカルとグローバルだけ?
539デフォルトの名無しさん:2011/09/14(水) 23:50:47.64
>>538
グローバル、ファイル、関数、ブロック
540デフォルトの名無しさん:2011/09/14(水) 23:56:10.46
JISのPDFって、どっか落ちてない?落とせないんだけど
541デフォルトの名無しさん:2011/09/14(水) 23:57:07.89
Main.c - Main.h - Rib.c - Rib.h - Cit.c といった具合にヘッダで参照していっているcとhのファイル群があるとします。
Main.cからRib.hをincludeし、Cit.cで定義されているグローバル変数を呼び出したいのですが、
undefined reference to〜コンパイル時にエラーを吐きます。
どうすればコンパイルすることができるのでしょうか?
542デフォルトの名無しさん:2011/09/15(木) 00:02:28.12
>>540
OperaTorで落とせたよ
543デフォルトの名無しさん:2011/09/15(木) 00:22:31.87
extern
544デフォルトの名無しさん:2011/09/15(木) 00:23:20.68
>534
昔は警告で、エラーじゃなかったんだがな。
545 忍法帖【Lv=40,xxxPT】 :2011/09/15(木) 00:33:32.01
>>541
>543
546デフォルトの名無しさん:2011/09/15(木) 00:47:12.39
532 > 531
Cだとワーニングも出ないけど、
C++だとエラーになるってことだろ。
547デフォルトの名無しさん:2011/09/15(木) 00:47:34.66
#include <stdio.h>
main()
{
struct S {char s[9999];};
void f(struct S* a) {printf("%s\n", a->s);}


struct S a = {"hello world"};
int i;
for(i=0; i < 5; i++) {
f(&a);
}
}

関数の中で関数定義すると、ソースファイル中でさらに細かくスコープを限定できて便利だと
思うんだけど、これってGCCの方言かもしれないって最近気づいた。
もしかして構造体の方も方言ですか?(自信ない)
548デフォルトの名無しさん:2011/09/15(木) 00:51:41.01
>>546
C++だとエラーになるの?
549デフォルトの名無しさん:2011/09/15(木) 00:54:52.93
gcc (Ubuntu/Linaro 4.6.1-9ubuntu2) 4.6.1
sizeof(array) = 6
sizeof(&array) = 4
sizeof(*&array) = 6
sizeof(&array[0]) = 4
sizeof(*&array[0]) = 1

ポインタ4byteでした。
OSが64bit版だとやっぱり8とかになるんですかね?
550デフォルトの名無しさん:2011/09/15(木) 01:02:35.36
>548
試した。
http://codepad.org/zw8jSGUC

int main(void)
{
char array[6];
char *p=&array;

return 0;
}

Line 4: error: cannot convert 'char (*)[6]' to 'char*' in initialization

コンパイラのエラーレベル設定でなんとでもなりそうだけど。
551デフォルトの名無しさん:2011/09/15(木) 01:18:38.13
552デフォルトの名無しさん:2011/09/15(木) 01:22:16.03
VCだと、エラーじゃなく警告がでる。

warning C4047: '初期化中' : 間接参照のレベルが 'char *' と 'char (*)[6]' で異なっています。

どっちにしろ、型宣言を正しくすれば、出ない。
553デフォルトの名無しさん:2011/09/15(木) 06:30:03.87
お前らは今まで出したセグメンテーション違反の数を覚えてるかっちゅうことや
554デフォルトの名無しさん:2011/09/15(木) 06:56:34.76
数年ぶりにCの勉強を再開しようと部屋を探したら
↓を持ってたので使おうと考えてるのですが問題無いですか?
もっといい本が出てたりしてますか?
http://www.amazon.co.jp/dp/4320026926
555デフォルトの名無しさん:2011/09/15(木) 07:19:30.46
まったくの初心者には向かない本です
556デフォルトの名無しさん:2011/09/15(木) 07:49:03.72
>>552
だから、Cなら警告、C++ならエラーだろ。
557デフォルトの名無しさん:2011/09/15(木) 08:04:52.08
>>544
どっちみち型が合ってない事に変わりはない。
558デフォルトの名無しさん:2011/09/15(木) 08:18:03.57
そういうことじゃないんだけどねぇ。
559デフォルトの名無しさん:2011/09/15(木) 08:50:15.08
>char (*p)[6];
こういう配列の要素数固定のポインタ定義って使う場面ある?

自分はchar *でなんとかしちゃうけど。
560デフォルトの名無しさん:2011/09/15(木) 08:53:42.71
スケジューラで幅24固定とか、幅7固定なんてのは容易に想像できるね。
561デフォルトの名無しさん:2011/09/15(木) 09:41:57.12
>>558
どういう事か説明しろw
562デフォルトの名無しさん:2011/09/15(木) 11:03:32.24
>>559
固定フォーマットのテーブルを渡す時の引数とかに使うかな。
別に無くても書けるし、趣味の範囲じゃね?
563デフォルトの名無しさん:2011/09/15(木) 12:17:02.35
f(size_t x){ // 引数1個でガラッと過程を変えたいときなんかに使うね、何も考えずに書き上げるとif文乱打になる
static char s[10][6]={{…;
char (:*p)[6]=&s[x];
564デフォルトの名無しさん:2011/09/15(木) 15:47:16.37
C言語の勉強をひと通り終えたとこなんだけど、問題がさっぱり解けない・・・

問題が解けるようになるには、どうしたらいい??
565デフォルトの名無しさん:2011/09/15(木) 15:52:03.72
>>564
勉強終わってないからやり直せ
566デフォルトの名無しさん:2011/09/15(木) 16:40:59.96
>564
他人のソースを読む。
そのソースを自分流に書き換えてみる。
567デフォルトの名無しさん:2011/09/15(木) 17:18:12.39
勉強ってどんな勉強なのか、問題ってどんな問題なのか、
なにも示さずに質問できる神経を直せ。
568デフォルトの名無しさん:2011/09/15(木) 18:14:39.06
やっぱ猫のやつが一番初心者にはお勧めなのか?
569デフォルトの名無しさん:2011/09/15(木) 18:32:48.86
プログラミングの動機としては、
たとえば、WindowsのSORTコマンドは、フィールドではなく、文字番号でソートできる(/+n)
やっぱり、フィールドでソートしたい場合がよくあるから不満だ。
そんな不満があったら、自作するしかないだろ
570デフォルトの名無しさん:2011/09/15(木) 19:45:03.48
enumを文字列に変換するための文字列の配列ってよく作りますよね?
あれってどこに定義してます? ヘッダかソースかいつも悩む
571デフォルトの名無しさん:2011/09/15(木) 19:48:53.99
>>569
awk使えば2分でできるよ。
572デフォルトの名無しさん:2011/09/15(木) 19:50:25.47
複数のソースから参照する必要があるならヘッダ、じゃなきゃソースでしょ、普通。
573デフォルトの名無しさん:2011/09/15(木) 20:20:41.58
うん
574デフォルトの名無しさん:2011/09/15(木) 20:25:12.40
宣言はヘッダに 定義はソースに だ
575デフォルトの名無しさん:2011/09/15(木) 21:59:01.12
できるだけスコープは狭く。
特定の関数の中でしか使わないなら定義はその中でも。
576デフォルトの名無しさん:2011/09/15(木) 23:08:05.45
>>575
>できるだけスコープは狭く。
これ言わんとするところはわかるんだけどさ、
究極に突き詰めると、即値になるよね。
577デフォルトの名無しさん:2011/09/16(金) 01:14:40.84
>>575
その通りだけどさ、なら、なんでC++逝かないの?
578デフォルトの名無しさん:2011/09/16(金) 01:14:46.32
>>576
そのリテラルがそこでしか利用されないなら即値で良いんじゃないの?
579デフォルトの名無しさん:2011/09/16(金) 01:22:51.19
究極に突き詰めて考えちゃうひとって近寄りがたいわー
580デフォルトの名無しさん:2011/09/16(金) 01:44:56.10
スコープは自然に書ける範囲でできるだけ狭く。ってことでしょ。

C++みたいなネーム空間が無いので、Cだとプリフィックスでそれと同じことをするから、
Cではなるべく、ソースの外にまでスコープを広げるのは節約した方がいいと思うわ。

ソース内でのスコープは、構造体の定義なら、むしろソース内でならグローバル定義した方が便利なんじゃね?
関数内でローカルに定義するよりも。
581デフォルトの名無しさん:2011/09/16(金) 09:05:57.94
enumにしてもdefineにしても名前を付けることに意味があるのに即値でいいって…
582デフォルトの名無しさん:2011/09/16(金) 09:49:24.95
つまり、名前に意味がないなら即値でいいってことだな。
583デフォルトの名無しさん:2011/09/16(金) 10:51:07.82
質問です10億回ほどループを回すプログラムを更に高速化したいと考えています。

for(int i = 0; i < N; i++){
for( int j = i+1; j < N; j++){
r = sqrt((x[i]-x[j])*(x[i]-x[j]) +
(y[i]-y[j])*(y[i]-y[j]) +
(z[i]-z[j])*(z[i]-z[j]))+0.5;
XY[r] += b[i]*b[j];
}
}

ボトルネックはここなのですが、ここを高速化する書き方はないでしょうか?
x,y,zはdouble, bはintです。
584デフォルトの名無しさん:2011/09/16(金) 10:57:50.53
>>583
rは実数?
585デフォルトの名無しさん:2011/09/16(金) 11:10:57.09
>>584
ごめんなさい、書き忘れました
rはインデックスなのでintです
586デフォルトの名無しさん:2011/09/16(金) 12:08:30.52
>>583
7% 程度高速化
for(i=0;i<N;i++)
{
double bi, xi, yi, zi, xij, yij, zij;
bi=b[i];
xi=x[i];
yi=y[i];
zi=z[i];
for(j=i+1;j<N;j++)
{
xij=xi-x[j];
yij=yi-y[j];
zij=zi-z[j];
r = sqrt(xij*xij+yij*yij+zij*zij)+0.5;
XY[r] += bi*b[j];
}
}
587デフォルトの名無しさん:2011/09/16(金) 12:11:13.99
ミスった
>>586 の bi は整数型に直しておいてね
588デフォルトの名無しさん:2011/09/16(金) 12:30:38.15
>>583
x[i]-x[j]が
・x[n]-x[m] (i=n, j=m)のときと、
・x[m]-x[n] (i=m, j=n)のときは、
符号が逆になるだけ。
589デフォルトの名無しさん:2011/09/16(金) 12:32:04.53
インデックス参照を減らすだけで、そんなに高速化するんですか?
590デフォルトの名無しさん:2011/09/16(金) 12:38:11.20
>>589
キャッシュのミスヒットが減るから
591デフォルトの名無しさん:2011/09/16(金) 13:11:32.54
iとj入れ替えてもrとbが同じだから
半分くらいは計算しなくていいってことじゃないのか
592デフォルトの名無しさん:2011/09/16(金) 13:12:46.79
あ、ループ条件見てなかったわすまん忘れてくれ
593デフォルトの名無しさん:2011/09/16(金) 13:15:18.53
rの取り得る範囲がさほど大きくないなら、sqrtを後回しにできるかもね
594デフォルトの名無しさん:2011/09/16(金) 13:38:18.26
マルチスレッドで計算するほうが速くなるほどには遅くないんだよね?
595デフォルトの名無しさん:2011/09/16(金) 16:12:49.97
>>583
回数がある程度分かっているんならアンロールすると効果的だぞ
条件分岐でキャッシュをフラッシュしてしまうバカCPUがまだ多い
分岐予測と投機実行は実際にベンチマークを取ってみればいいが
本当に遅いぞ
596デフォルトの名無しさん:2011/09/16(金) 16:21:15.10
ターゲットCPUとコンパイラとコンパイルオプションで変わってくる話だな
597デフォルトの名無しさん:2011/09/16(金) 17:00:08.82
ループを展開して10億回ほどベタ書きすれば高速になると思う
598デフォルトの名無しさん:2011/09/16(金) 18:01:04.95
そういうライブラリとかないの?OpenCLとか使ったことないけど
599デフォルトの名無しさん:2011/09/16(金) 18:02:49.94
ここはインラインアセンブラで
600デフォルトの名無しさん:2011/09/16(金) 18:11:37.71
クイックソートをするプログラムって2通りしかない気がするんですが
どうでしょうか?
非再帰、再帰でしょ。自分流のクイックソートとか可能なの
601デフォルトの名無しさん:2011/09/16(金) 20:34:01.26
コンパイルの最適化オプションだけで早くなるよ
602デフォルトの名無しさん:2011/09/16(金) 20:47:48.18
コンパイラのフロー解析はマジ神だと思う事があるな
あんなの人手で最適化してたらどれだけ時間がかかるかわからん
603デフォルトの名無しさん:2011/09/16(金) 20:54:35.37
inline関数て同じファイルに置かないといけないんですか?
別ファイルのinline関数を使うことはできますか?
604デフォルトの名無しさん:2011/09/16(金) 21:09:58.43
inlineってインライン展開してねって感じじゃなくてインライン展開してもいいよって感じだっけ
605デフォルトの名無しさん:2011/09/16(金) 21:13:46.51
>>603
コピペですむうちは、ベタ書きしてればいいんじゃねの
量が多くなってきたら、その時考えればいいような
606デフォルトの名無しさん:2011/09/16(金) 22:05:50.07
>>601
最適化オプションってなんですか?それってコードと関係ありますか?
Cygwin gcc ですが・・最適化ってどうやってやるんですか?
C言語を勉強してC言語マスター、C言語文法整理の達人と言われてますが
コンパイラとかよくわからないんですが・・・文法書にのってない・・・
>>602
フローチャートとかのフローですか?解析って何の解析ですか?
607デフォルトの名無しさん:2011/09/16(金) 22:12:39.17
最適化ってのはCPUへの命令の最適化だろ?
よーするに機械語とか、言語のアセンブリじゃん
どんな言語でも結局CPUへの命令列作ってるだけだから、
無駄なく無理なく機械語吐けるのが最適化された言語解釈器、つまりはコンパイラだよ
608デフォルトの名無しさん:2011/09/16(金) 22:14:04.15
いまはJITじゃなくてAOTのおはなししてるんです
609デフォルトの名無しさん:2011/09/16(金) 22:14:20.28
-O1とか-O2って分かるだろ

gcc オプション でぐぐればいくらでも出てくる

テキストも英文だけど付いてたはずだけどなあ

フロー解析とはプログラムの実行過程をシミュレートしてCPUに都合の良いように
命令を並べ替えてしまう事

元のプログラムのフレーバーがすっかり消えてしまう場合もしばしば
610デフォルトの名無しさん:2011/09/16(金) 22:16:25.40
C言語文法整理てC言語策定してる中の人でしたか・・
611デフォルトの名無しさん:2011/09/16(金) 22:24:08.07
>>608
んじゃあAOTのおはなし聞かせてくれよ
612デフォルトの名無しさん:2011/09/16(金) 22:24:22.33
>>610
いやforやらwhileやらprintfやら関数は何でもしってるって意味です・・・

コンパイラとか解析とかよくわからないです。自分はメモ帳で言語書いてる
だけなんで。

質問なんですが、機械語に法則性のある動きをしたものを、言語にまとめたのが
プログラミング言語ですよね?言語作るときは機械語を理解してないとだめなん
ですか?機械語はどんなCPUでも一緒ですよね?
613デフォルトの名無しさん:2011/09/16(金) 22:28:41.43
機械語がどんなCPUでも一緒だったらどんなにラクなことか!!!!
614デフォルトの名無しさん:2011/09/16(金) 22:28:50.73
・・・・

機械語がどんなCPUでも同じわけないだろ

x86は上位互換性はあるけどな(完全ではないけど)

機械語を知らなくても高速に実行できて開発期間も短縮出来、
バグも取りやすいようにしたのがプログラミング言語

もちろん機械語を知っていた方がクリティカルな部分を直接機械を
叩いて実行させなければならない場合もある(ドライバとか特にね)
615デフォルトの名無しさん:2011/09/16(金) 22:31:59.70
あ、あと大事な事を忘れていた

「移植性の高さ」な

C言語はその低レベルさにも関わらず移植性が高い
だからLinuxがこれだけいろんなハードウェアで広まった
616デフォルトの名無しさん:2011/09/16(金) 22:32:10.85
>>614
でもどんなパソコンにもC言語使えますよね?マザーボールの種類は
多様ですが機械語の法則性の共通の上でC言語って作られたってこと
でOKですか?
617デフォルトの名無しさん:2011/09/16(金) 22:36:15.82
マザーボール?
618デフォルトの名無しさん:2011/09/16(金) 22:36:29.02
察してやれよ
619デフォルトの名無しさん:2011/09/16(金) 22:41:41.82
わざと言っているとしか思えないここまで来ると
620デフォルトの名無しさん:2011/09/16(金) 22:54:54.25
機械語ってのはマザーボール上の半導体の配置方法のことでしょ?
それをオブジェクトパッケージにしたのがマザーボールというパソ
コンの部品になると思ってるんだが間違いですか?

だからパソコンのブレインであるCPUの機械語はCPUによって違うと
思うんですが、マザーボールの開発ってのはどうやってするんですか?
621デフォルトの名無しさん:2011/09/16(金) 22:56:07.96
プログラムの大先生(笑
622デフォルトの名無しさん:2011/09/16(金) 23:08:21.38
マザーボールって自作できるの?それが聞きたい。
機械語を理解してないとマザーボールは作れないんですか?
623デフォルトの名無しさん:2011/09/16(金) 23:16:39.70
マザーボールが分からんのでググってみた
http://www.google.co.jp/search?q=%E3%83%9E%E3%82%B6%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%AB&tbm=isch
がんばれば作れないことはないと思った
機械語の知識は不要ですね
624デフォルトの名無しさん:2011/09/16(金) 23:20:29.56
あすいません、マザーボールじゃなくてマザーボードでした。
マザーボード自作するにはどんな知識いりますか?
625デフォルトの名無しさん:2011/09/16(金) 23:27:18.44
とりあえず半田ごてが必要だな
626デフォルトの名無しさん:2011/09/16(金) 23:29:14.59
プリント基板の設計と製造方法、あと半田付け
627デフォルトの名無しさん:2011/09/16(金) 23:29:57.10
>>626
で機械語の知識いるでしょ?
628デフォルトの名無しさん:2011/09/16(金) 23:31:25.53
原始的なコンピュータ、ポケコンあたりのマザーボードを想定するなら
電気工学一般の知識が必要。
一人で自作できるのはおそらくポケコンのマザボあたりまでで、
それ以上のものとなれば高周波回路とか高度な電磁気学とかも必要になる。
はっきり言えば、今のレベルのマザボを一人で自作するのは無理。
629デフォルトの名無しさん:2011/09/16(金) 23:36:21.81
>>628
やっぱりか・・・

所詮C言語なんてツールなんだよな・・・

俺は根源的なものがつくりたい・・
630デフォルトの名無しさん:2011/09/16(金) 23:42:02.95
>>612
forもwhileも関数じゃないだろ。
631デフォルトの名無しさん:2011/09/16(金) 23:46:23.37
自動車免許持ってても、車は作れないよね
632デフォルトの名無しさん:2011/09/16(金) 23:48:55.03
原子でもいじってろ。>629
633デフォルトの名無しさん:2011/09/17(土) 00:47:43.67
根源的、というなら形而上、形而下の話。
論理回路を形而上、実装を形而下というなら根源的なモノは論理回路の理論、すなわち数学のブール代数あたり。
とあるアルゴリズムと形而上、そのC言語での実装を形而下とするならやはり根源的なモノは数学になる。
理論と実装、その二つの形而上と形而下の組み合わさったモノである形も、
やはり現実世界においては根源というしかない。
だからこそ、根源を生成できるような人間は一握りの、数十年に一度の天才に限られている。
コンピュータの出来る以前にその限界を示したチューリングのように。
634デフォルトの名無しさん:2011/09/17(土) 00:54:53.91
>>586
返答ありがとうございました
結論から言うと自分のPCとコンパイラでは逆に7%ほど遅くなりました

XY[r]を仮にXY[100]などに変えたところ速度が飛躍的に上がることは確認していたのでインデックスの参照に何か遅くする要因があるとは思っていましたが、おかげで理由がわかりました

参照を減らして、sqrt内の計算量も減らしても遅くなっているのでこれはコンパイラの設定の問題かと思います
ちなみにdouble bi~zij;の部分はループの外で行いました

>>595
回数はデータによって異なるので、一番回すのがこのくらいです。


MMXは後々インテルコンパイラでコンパイルするときに勝手にやってくれそうなので
いまはやるつもりはないです。
635デフォルトの名無しさん:2011/09/17(土) 02:08:27.53
>>634
入門の域を超えているから仕切り直すなら最適化スレがお勧め。
rの値の範囲がどの辺りか判らんけど、誰かが書いていた通りsqrt()は省略できる可能性が高いね。
あと、メモリ空間との相談になるけどb[i]*b[j]を予め計算しておくとか。
636デフォルトの名無しさん:2011/09/17(土) 03:41:53.52
>>635
ありがとうございます、そっちでも質問してみます
rの値は最大で200000くらいです、計算量が10億回なのに対して、
rの最大値がその程度なのでここで計算数を減らしています

r^2でかなりの大きさになるので、sqrtをテーブル化するような方法も厳しいかと思います。
またsqrtの精度を下げて四則演算だけで行う方法も考えてみましたが、これも余計に時間がかかってしまいそうです。
637デフォルトの名無しさん:2011/09/17(土) 11:35:27.43
>>624
知識よりも常識とコミュ力とコネだな
しゅうかつがんばってください
638デフォルトの名無しさん:2011/09/17(土) 12:22:50.70
ところでこれ何の計算なんだ?
統計に見えるけど。
639デフォルトの名無しさん:2011/09/17(土) 12:35:08.81
機械語はナウマン式コンピューターだと全部一緒。
ソロバンや指を折って数えるやり方も同じ。
高級言語って い+ろ をAと、は+に をBと置きかえて
さらにA+Bを Δと置き換えてって繰り返してるだけだし
置き換え方式や細かいルールが違うからソースを変えないと動かないけど、やってることは一緒
640デフォルトの名無しさん:2011/09/17(土) 12:38:01.51
かっこつけてopaque型なんか使うんじゃねーよ紛らわしい!
641デフォルトの名無しさん:2011/09/17(土) 12:38:51.52
機械語はほぼアセンブラをひとづづつ置き換えただけじゃん
どう考えてもどれもが一緒なわけがない
642デフォルトの名無しさん:2011/09/17(土) 12:40:52.18
> ナウマン式コンピューター
だれか突っ込んでやれよ
デカくて巨大で手に負えないelephantな実装かよ
643デフォルトの名無しさん:2011/09/17(土) 12:50:17.97
爆釣だな
644デフォルトの名無しさん:2011/09/17(土) 12:56:51.87
Naumann
Neumann

最初の標本は明治時代初期に横須賀で発見され、ドイツのお雇い外国人ハインリッヒ・エドムント・ナウマン
(Heinrich Edmund Naumann: 1854年-1927年)によって研究、報告された[2]
ナウマンゾウ - Wikipedia

ノイマン型の名は、最初にこれを広めたEDVACに関する報告書 First Draft of a Report on the EDVAC
の著者がジョン・フォン・ノイマン(ひとり)になっていることに由来
ノイマン型(-がた、von Neumann architecture)
ノイマン型 - Wikipedia
645デフォルトの名無しさん:2011/09/17(土) 13:01:09.52
>>638
原子配置です、これを複数のデータついて比較することで内部構造がわかります
646デフォルトの名無しさん:2011/09/17(土) 16:13:24.30
> rの値は最大で200000くらい
ってただの配列のインデックスなんだよね?

そもそも XY[] を XY[(x[i]-x[j])][(y[i]-y[j])][(z[i]-z[j])] の三次元配列にすれば委員で内科医?
647デフォルトの名無しさん:2011/09/17(土) 16:51:57.75
>>597
いまだにこういうアホがいるんだね
648デフォルトの名無しさん:2011/09/17(土) 16:58:09.05
>>647
おまえ稀に道に転がってる虫を見るような目で見られないか?
649デフォルトの名無しさん:2011/09/17(土) 16:59:11.82
>>646
メモリ使用量の概算出してみてよ
650デフォルトの名無しさん:2011/09/17(土) 17:01:47.65
x,y,zって実数じゃなかったか
651デフォルトの名無しさん:2011/09/17(土) 17:03:22.97
const staticな文字列の配列ならヘッダに書いてもいい?
もはや実体じゃなくて定義扱いってことで
652デフォルトの名無しさん:2011/09/17(土) 17:05:19.97
複数でインクルードしたとき、実体はどこにあることになる?
653デフォルトの名無しさん:2011/09/17(土) 17:08:14.95
static なら各ソースに同じものの複製が散らばることになるんじゃね?

おりこうさんなコンパイラなら纏めてくれるかもしれんけど
654デフォルトの名無しさん:2011/09/17(土) 21:57:53.13
>>651
いいよ、おれは
655デフォルトの名無しさん:2011/09/17(土) 23:48:34.82
CでDBMSのカーソルを利用できる環境って
なにがある?
656デフォルトの名無しさん:2011/09/17(土) 23:50:22.03
DBMS次第じゃないかな?
657デフォルトの名無しさん:2011/09/17(土) 23:57:43.02
今、win32apiを勉強してるんですが
linuxだとデバイスファイルというのでwin32apiよりは
簡潔にディスプレイへの描画等できるとききました。
例えば指定ピクセルの色を○○に変更とかも
簡素に実現可能なんでしょうか?
658 忍法帖【Lv=40,xxxPT】 :2011/09/17(土) 23:58:43.34
>>656
ライブラリ次第だろ。
659デフォルトの名無しさん:2011/09/17(土) 23:59:53.69
>>657
簡単だよ。端から塗り潰す位は。
660デフォルトの名無しさん:2011/09/18(日) 00:03:37.62
階乗を求める方法で再帰以外を探しています
目的は並列計算で円周率の計算をする課題があるのですが
再帰では並列化ができそうにないからです
再帰で並列化できる方法でも構いません
何かいいものはありませんか?
661デフォルトの名無しさん:2011/09/18(日) 00:04:30.93
>>659
もしよかったら何と言うデバイスファイルを利用するかだけでも
ヒントを頂きたいです
662普通は、1からその数までの積と言う:2011/09/18(日) 00:12:09.93
>>660
階乗を他人に説明することを考えて、
その通り実装すればいいよ。
663デフォルトの名無しさん:2011/09/18(日) 00:16:09.83
>>661
/dev/fb*
664デフォルトの名無しさん:2011/09/18(日) 00:17:16.13
>>663
ありがとうございます
さっそくトライしてみようと思います
665デフォルトの名無しさん:2011/09/18(日) 00:19:09.48
>>662
n*(n-1)*(n-2)*(n-3)・・・*(n-(n-1))
という感じでやって
a = n*(n-1)
b = (n-2)*(n-3)
c = a*b
みたいに実装するということですかね?
666デフォルトの名無しさん:2011/09/18(日) 00:42:28.96
>660

計算する階乗ってどれくらい? n=100位?として long ans[100+1]={0}; を利用。
long calc(int n){
if(ans[n]>0) return ans[n];
if(n==0) return ans[n]=1;
return ans[n]=n*calc(n-1);
}
なんてのはどうかな?
ans[]を更新する時に排他制御とか必要になると思うけど。
667デフォルトの名無しさん:2011/09/18(日) 00:52:00.02
>>666
nは10000以上になりますね
すいませんまだはじめったばっかなので再帰とどう違うかわかりません
668666:2011/09/18(日) 00:58:08.23
> 再帰とどう違うかわかりません
いや再帰だよw
669デフォルトの名無しさん:2011/09/18(日) 00:59:58.63
>>668
ですよねw
これは並列化が可能なんでしょうか?
670デフォルトの名無しさん:2011/09/18(日) 01:03:17.58
違うn!を計算する処理を並列で動かしたとき、配列のアクセスだけで済むようになるかな?って考えますた
671デフォルトの名無しさん:2011/09/18(日) 01:05:19.91
>>670
なるほどやっと理解しましたわ
ありがとうございます
672デフォルトの名無しさん:2011/09/18(日) 01:07:48.69
末尾再帰を除去した階乗の計算はメモ化するのが速いよな
並列化できるのか・・・?
673デフォルトの名無しさん:2011/09/18(日) 01:11:39.60
>>660
1)1から10000までの数字が入った、大きさ10000の配列を作る
2)その配列をシャッフルする
3)その配列をたとえば4等分して、小配列を四つ作る
4)小配列の数値をそれぞれ掛け算する(ここら辺が並列化)
5)求めた小配列の掛け算の値を、さらにまとめて掛け算する
674デフォルトの名無しさん:2011/09/18(日) 01:13:24.53
>>673
なるほど、そしたら負荷も分散してよさそうですね
ありがとうございます
675デフォルトの名無しさん:2011/09/18(日) 01:13:42.12
n!の計算には(n-1)!の値が必要で,これはn=1から手続き的に求めることができる
乗算の計算量がO(1)とするとn!はO(n)で求まる

並列化して速くできるとすればO(log(n))とかO(n^1/k)とかにしなければならないんだけど
無理にスレッドなりMPIなり使って並列化しちゃうと,同期ポイントで時間食うか,
「N個の部分問題に分割してN個を統合する」みたいな無駄なことしそう
676デフォルトの名無しさん:2011/09/18(日) 01:14:24.03
n!が一つだけ欲しいのなら二分法で最大n/2-1並列、log2(n)回で求められるけど。
まぁ、並列にするのはそこじゃないだろ。
677デフォルトの名無しさん:2011/09/18(日) 01:57:41.56
計算機向けの変形
ガンマ関数の(関数電卓などの)計算機向けの近似として次の式がある。
http://upload.wikimedia.org/math/e/2/f/e2f4c4d72dfdb83a6c86fe6a85d9ac58.png
これは、次と同等である。
http://upload.wikimedia.org/math/9/9/3/99368b5db572d18cdf46127879c0fd69.png
これらはスターリングの公式を組み替えて、その結果生じる冪級数と双曲線正弦関数のテイラー展開の間の合致を観察することで得られる。
この近似は z の実数部が 8 以上のとき、小数点以下 8 桁を超える精度を持つ。
2002年、Robert H. Windschitl がリソースの制限された計算機(電卓など)でのそれなりの正確性を持った近似としてこれを示した(参考文献の 'Toth' 参照)。

スターリングの近似 - Wikipedia
678デフォルトの名無しさん:2011/09/18(日) 02:00:17.12


スターリングの公式は以下の級数(スターリング級数)の近似(初項で打ち切ったもの)である。
http://upload.wikimedia.org/math/b/6/c/b6cfe52ef1c859645d3ce349d67b11bc.png
としたとき、省かれた級数はその最初の項とそれ以降が相殺するように漸近していく。これは漸近展開の一例である。
以下のような階乗の対数の漸近展開も「スターリング級数」と呼ぶ。
http://upload.wikimedia.org/math/c/c/d/ccd0853b73b07db5881c2c1ea0618f65.png
この場合、誤差は打ち切った級数の初項と同じ符号で同程度の大きさであることが知られている。

スターリングの近似 - Wikipedia

679デフォルトの名無しさん:2011/09/18(日) 02:03:18.87
スターリングの近似で、小数点以下 8 桁を超える精度らしい。
階乗計算するのに十分だろ。これならループも再帰をいらないよ。
680デフォルトの名無しさん:2011/09/18(日) 03:48:18.27
>>679
目的は円周率を求めることなのに8桁精度でいいの?
681デフォルトの名無しさん:2011/09/18(日) 04:02:39.56
うん
682デフォルトの名無しさん:2011/09/18(日) 05:04:38.31
じゃ、暗唱の方が精度高いわwww
683デフォルトの名無しさん:2011/09/18(日) 06:23:16.05
math.hにかいてある
684デフォルトの名無しさん:2011/09/18(日) 09:46:52.17
>>680
階乗を、自然数から複素数に拡張したときの精度が、小数点以下8桁以上。整数部分は一致するだろう。
685デフォルトの名無しさん:2011/09/18(日) 13:06:22.71
>>652
一箇所になればいいんだろ?
686デフォルトの名無しさん:2011/09/18(日) 13:07:32.09
>>680
そのくらいの精度があればどこまでも求められるよ
687デフォルトの名無しさん:2011/09/18(日) 13:09:19.47
>>686
しかし log の精度が足りなかった!
688デフォルトの名無しさん:2011/09/18(日) 13:10:29.00
>>685
書き換えない同一データがいくつもあるのは無駄だよね?
689デフォルトの名無しさん:2011/09/18(日) 13:45:49.17
extern つけとけ。
690デフォルトの名無しさん:2011/09/18(日) 18:31:44.33
>>688
だから一箇所になればいいんだろ?
691デフォルトの名無しさん:2011/09/18(日) 19:21:02.68
>>690
結論言うとそうなんだけど、
ヘッダをインクルードする方法に違いがない状態で、
コンパイラが生成したオブジェクトファイルの
どれに実体が入るか、指定する方法があるの?
もしかして、リンカでするの?あるなら、教えて
692 ◆QZaw55cn4c :2011/09/18(日) 23:13:58.00
>>691
extern は正直いって使わない。本当に必要なんですか?
>コンパイラが生成したオブジェクトファイルのどれに実体が入るか
条件つきだが、リンカにお任せで大丈夫な場合もあります。

つ前スレ:http://pc12.2ch.net/test/read.cgi/tech/1201153965/139
つ「仮定義(tentative definition)」
693デフォルトの名無しさん:2011/09/18(日) 23:19:51.40
>>692
>const staticな文字列の配列ならヘッダに書いてもいい?

これから始まってる話なので、初期化が伴います。
694デフォルトの名無しさん:2011/09/18(日) 23:38:49.38
>extern は正直いって使わない。本当に必要なんですか?
初心者は使う必要ない。初心者は。
695 ◆QZaw55cn4c :2011/09/18(日) 23:42:58.93
>>693
失礼。ご指摘感謝。
696 ◆QZaw55cn4c :2011/09/18(日) 23:53:10.66
>>694
extern を使うメリットは?そんなものあるのですかね?
697デフォルトの名無しさん:2011/09/18(日) 23:55:46.48
外部で使ってることの目印になる
698デフォルトの名無しさん:2011/09/18(日) 23:58:51.52
>>696
使う必要がない人は、使わなくてもいい。
複数ソースに分割しているときに、
共通設定をグローバル変数においているときは、
多分使いたいと思うだろう。
699 ◆QZaw55cn4c :2011/09/19(月) 00:03:44.77
>>698
そういう時も、共通なグローバル変数の宣言だけをヘッダに書いて、
そのグローバル変数を使うモジュールだけがそのヘッダを読み込むようにすれば、特に extern はいらないのでは?
グローバル変数の初期化はちゃんとコードとして表現しなければならないのだけれども、むしろその方が好ましいと思います。

>>697
変数名に約束事をつけたほうが、まし。読みやすいし。
700デフォルトの名無しさん:2011/09/19(月) 00:08:17.08
コラくちごたえするな!
701デフォルトの名無しさん:2011/09/19(月) 00:16:33.90
>>699
非staticという意味で明示的にやってるだけ。
省略できる状況なのに
this->や::でアクセスするのと同じだよ。
プリプロセスで
extern
__declspec(dllexport)
__declspec(dllimport)
を切り替えるのなんてよくあることでしょ。
702デフォルトの名無しさん:2011/09/19(月) 00:20:24.86
>>700
やーだお
703デフォルトの名無しさん:2011/09/19(月) 00:22:23.27
>>699
変数の*宣言だけ*するためには extern が必要だよ
704デフォルトの名無しさん:2011/09/19(月) 00:30:18.78
変数名に約束事をつけるのは、
コーディングしている人間のためであって、言語仕様ではない。

一人で趣味として作るならともかく、チームでするときは
個人的な好き嫌いでプログラムは書いてはいけない。
705デフォルトの名無しさん:2011/09/19(月) 00:44:12.49
それならチームでプログラムやるのがそもそも間違ってる
706デフォルトの名無しさん:2011/09/19(月) 00:46:17.32
もはや子供のダダ。厨二でさえ無い。
707デフォルトの名無しさん:2011/09/19(月) 00:49:10.44
main()
{
}

で動くのに

int main(void)
708デフォルトの名無しさん:2011/09/19(月) 00:51:18.40
誤送信

main()
{
...
}

で動くのに

int main(void)
{
...
return 0:
}
と書く必要あるんですかー(棒)。
709 ◆QZaw55cn4c :2011/09/19(月) 01:35:33.35
>>703
いや、初期化しなければ省略できる。仮定義は宣言ではない、というのであれば話は別ですが、それは字面の話。
実際の作業はリンカがする点ではなんらかわりない。

>>704
それはそのとおりだと思います。しかし、チームで作成するとき(経験はありませんが)を仮定しても、わざわざ extern を使う利点が想像しがたいのですが。
というか、extern を陽に記述することと、チームで作成することとになんらの相関を見出せないのですが。

extern を使うと、そのグローバル変数の帰属を決めなくてはなりませんが、たくさんモジュール分割すると、その作業で混乱しませんか?
710デフォルトの名無しさん:2011/09/19(月) 03:51:51.18
ギャグってのは一度噛んだら終わりなんだよ
711デフォルトの名無しさん:2011/09/19(月) 07:47:48.85
>>709
さすが無職の趣味プログラマが言う事は一味違いますなあ(笑)
712デフォルトの名無しさん:2011/09/19(月) 08:00:47.37
他言語で作ったオブジェクトファイルをリンクする場合もexternいらないの?
713デフォルトの名無しさん:2011/09/19(月) 08:02:35.36
extern = public
static = private
714 ◆QZaw55cn4c :2011/09/19(月) 08:21:35.03
>>711
具体的に論拠を示せないのですね。がんばってください。

>>712
どうなんでしょう?
コンパイルの生成物であるオブジェクトファイルにはグローバル変数のアドレスだけ載ってきますから、変数のサイズで両者に矛盾がなければ、extern つけなくても OK だという気がします。
masm には EXTERNDEF というディレクティブがありました。
715デフォルトの名無しさん:2011/09/19(月) 08:38:51.32
C/C++両方使う立場の人として言うと
extern無しの仮定義とかC++と互換性のない機能を使うのって面倒だからいや
C++のサブセットの範囲内の機能しか使いたくない。
716デフォルトの名無しさん:2011/09/19(月) 09:01:45.51
気にしたことは無いが errorno はどうなってるんだろ

元の
不変定数だけどそれが文字列の配列で(enum とペアで)一か所で定義運用したいという意図とは外れるだろうが
717デフォルトの名無しさん:2011/09/19(月) 11:04:03.92
ソース上の関数名/変数名とコンパイル後(オブジェクトファイル内)の関数名/変数名(ラベル名?)って違うんだよね。
その名前の付け方の統一の為にexternが必要なんだよね。
718デフォルトの名無しさん:2011/09/19(月) 11:08:33.54
externに親でも殺されたのか?
719デフォルトの名無しさん:2011/09/19(月) 13:06:54.43
1つのソースに10万行とか書きたくないです
720デフォルトの名無しさん:2011/09/19(月) 13:13:51.49
>>714
お前の書き込み時間見てりゃ馬鹿でも分かるって
平日の昼間から平気であれだけ多量の書き込みが会社から出来るわけねー
721デフォルトの名無しさん:2011/09/19(月) 13:29:17.49
このスレの限りでは平日の昼間には来てないな
722デフォルトの名無しさん:2011/09/19(月) 13:35:36.41
書いてる奴の仕事が何かは、ワリとどーでもいい
723デフォルトの名無しさん:2011/09/19(月) 13:36:38.21
>>721
宿題スレ見てみ
724デフォルトの名無しさん:2011/09/19(月) 13:42:55.60
専ブラで残ってるキャッシュだけでQZの書き込み時間を調べたけど真夏は
夜中3時とか早朝4時、昼間の書き込みが多いな

最近は日曜日の書き込みが多く、平日は早朝か夜7時過ぎか夜中だ
もしかして最近就職したのか?
725デフォルトの名無しさん:2011/09/19(月) 14:21:39.74
この俺を差し置いて就職とな
726デフォルトの名無しさん:2011/09/19(月) 14:25:55.14
一応祭日だよな?
727デフォルトの名無しさん:2011/09/19(月) 14:43:41.28
今日の話をしてんじゃねーよ
728デフォルトの名無しさん:2011/09/19(月) 14:44:52.77
>>719
10万行のソース書くのは御免こうむりたい。
どうしてもなら、プログラム書いて自動生成。
729デフォルトの名無しさん:2011/09/19(月) 15:18:48.41
規格的には仮定義は1つの翻訳内だけで複数翻訳間に関しての動作は未定義ではないの?
730デフォルトの名無しさん:2011/09/19(月) 15:46:01.87
しかしまだ無職なのに書きこむ時間を自己抑制してるとしたらさぞかし辛い
事でしょうなあ〜
731デフォルトの名無しさん:2011/09/19(月) 15:56:12.96
夏は夜勤だったのかも知れないだろ
732デフォルトの名無しさん:2011/09/19(月) 15:58:21.52
いや書き込み時間帯は見事にバラバラ
3交代かねえw
で、QZは自分のPCのCPU-Zのスクリーンショット晒しはまだ?
733デフォルトの名無しさん:2011/09/19(月) 16:39:48.86
荒れてるな
734デフォルトの名無しさん:2011/09/19(月) 17:33:00.66
肌荒れにはマルチビタミンだろ
735デフォルトの名無しさん:2011/09/19(月) 17:47:53.10
肌研の化粧水まじやばい
736デフォルトの名無しさん:2011/09/19(月) 17:53:00.58
>>714
おまえ、すこしは緩急のバランス考えて、たまには引くことも考えろよ…
延々と押しばっかりだから、正誤関係なく嫌われるんだっつーの…
もっと人に物言う時の上手いやりかたとか、人との関わり方とか心とか、C言語以前にそういうこと学んだ方が…
737デフォルトの名無しさん:2011/09/19(月) 18:07:31.50
>>736
言っても無駄でしょう
こいつは重度の人格障害で中年ニートですから
738デフォルトの名無しさん:2011/09/19(月) 18:18:22.24
キチガイに何言っても無駄だろ
739デフォルトの名無しさん:2011/09/19(月) 19:50:37.57
おしり拭く姿ってマヌケだよな
740デフォルトの名無しさん:2011/09/19(月) 19:52:55.87
ここもID表示にすればいい
741デフォルトの名無しさん:2011/09/20(火) 01:19:38.33
マイコンからある信号を送り出しPCのUSBからその信号を受け取るんですが、
PC側でその信号が来た時にいろいろ処理がしたいと思っています

USBを監視するにあたってどういう風な記述が必要かよくわかりません
お願いします
742デフォルトの名無しさん:2011/09/20(火) 01:31:53.61
743デフォルトの名無しさん:2011/09/20(火) 01:52:41.86
少なくとも入門編じゃあねーな
USB操るとかは上級者レヴェルだ
ちなみにUSBのチップはなんなんだよ
744デフォルトの名無しさん:2011/09/20(火) 01:55:08.50
WinUSB みたいな汎用ドライバを挟んだほうが楽そう
745 ◆QZaw55cn4c :2011/09/20(火) 01:58:37.20
>>736
>おまえ、すこしは緩急のバランス考えて、たまには引くことも考えろよ…
たしかに。
でも、匿名掲示板にぐらいなら過激側にふって書いたほうが、いろいろと面白いでしょう?

>延々と押しばっかりだから、正誤関係なく嫌われるんだっつーの…
そっかなあ?素直に誤りを認めるときには認めているつもりなんですが。先日のバッファーオーバーランのときとか。

>もっと人に物言う時の上手いやりかたとか、人との関わり方とか心とか、C言語以前にそういうこと学んだ方が…
そうしたほうがいいみたいですね。今マイブームの吉村昭とかじゃだめですか?
746デフォルトの名無しさん:2011/09/20(火) 02:32:53.16
いい年して、まともに日本語も理解できないアホにかまうなよ
747デフォルトの名無しさん:2011/09/20(火) 10:27:40.11
>>729
0という初期化子でファイルスコープ宣言したかのように振る舞うと書いてあるので、翻訳単位
で実体が作られるとも取れるね。

A declaration of an identifier for an object that has file scope without an initializer, and
without a storage-class specifier or with the storage-class specifier static, constitutes a
tentative definition. If a translation unit contains one or more tentative definitions for an
identifier, and the translation unit contains no external definition for that identifier, then
the behavior is exactly as if the translation unit contains a file scope declaration of that
identifier, with the composite type as of the end of the translation unit, with an initializer
equal to 0.

複数の翻訳単位にまたがっている場合の明確な定義が書かれていないように思うので、自分も
未定義だと思う。

[C99] 第2回 オブジェクトの宣言 | 株式会社きじねこ
http://www.kijineko.co.jp/tech/cpp2c/c99/part2
748デフォルトの名無しさん:2011/09/21(水) 18:25:53.28
749デフォルトの名無しさん:2011/09/21(水) 18:29:43.17
VCのCの規格って何?
750 ◆QZaw55cn4c :2011/09/21(水) 19:08:50.91
>>747
判じ物の様相を呈してきていますが、
ISO/IEC 9899:1999 6.2.2.2
In the set of translation units and libraries that constitutes an entire program, each
declaration of a particular identifier with external linkage denotes the same object or
function. (後略)
とある以上、external linkage に属する識別子(それがISO/IEC 9899:1999 6.9.2.2 >>747 の tentative
definition で宣言されようとも)は一つのアドレスに結び付けられている、と思います。
751デフォルトの名無しさん:2011/09/21(水) 20:16:32.82
enumの名前が大域を汚しまくって困るのですが、名前空間的なハックはないものでしょうか。
752デフォルトの名無しさん:2011/09/21(水) 20:38:35.28
これでいいだろ

typedef enum Hoge {
 Hoge_hoge,
 Hoge_foo,
 Hoge_bar
} Hoge;
753デフォルトの名無しさん:2011/09/22(木) 00:01:13.52
ふぎゃーふぎゃー
754デフォルトの名無しさん:2011/09/22(木) 00:58:08.61
ホゲーホゲー
755デフォルトの名無しさん:2011/09/22(木) 01:33:31.63
>>752
どうしてワンツーさんしーなんだよ
756デフォルトの名無しさん:2011/09/22(木) 09:10:53.81
CってまだK&Rがバイブルとか呼ばれてんの?
757デフォルトの名無しさん:2011/09/22(木) 09:39:05.35
少なくとも俺はそう思ってる

「過去を知らずして未来を語ることは出来ない」 by σ(゚∀゚ )オレ
758デフォルトの名無しさん:2011/09/22(木) 10:00:35.16
リレー回路でもいじってな
759デフォルトの名無しさん:2011/09/22(木) 10:04:40.43
>>750
それは(定義でなく)宣言についてでしょ?
definitionもしくはtentative definitionが複数翻訳にまたがって1つにまとめられるかの文がないと
やはり未定義だと思う。
760デフォルトの名無しさん:2011/09/22(木) 14:24:40.52
>>756
旧約だけどな
761デフォルトの名無しさん:2011/09/22(木) 16:36:45.80
sscanfで数値を読み出すときに文字数を動的に制限したいんだけど
どうしたらいいかな

sscanf("5678","%3d",&val); // val=567
           ↑この3を可変にしたい
762デフォルトの名無しさん:2011/09/22(木) 17:27:57.31
if (val>9) {
  sscanf("5678","%1d",&val);
}
else if (val>99) {
  sscanf("5678","%2d",&val);
}
else if (val>999) {
  sscanf("5678","%3d",&val);
}
……
763デフォルトの名無しさん:2011/09/22(木) 17:30:56.74
始めから6dくらいにしといてそれに統一しとけよ
764デフォルトの名無しさん:2011/09/22(木) 17:39:12.31
>>762
えっ?
765デフォルトの名無しさん:2011/09/22(木) 17:41:37.69
>>762
1点目
valが10以上のときは常に最初にヒットしてしまう
2点目
なんでval使うん?
766デフォルトの名無しさん:2011/09/22(木) 17:42:36.80
>>759だけど、自分なりに調べてみた。
まず、CFAQに

C FAQ 1
http://www.kouno.jp/home/c_faq/c1.html#7

>Unixのコンパイラやリンカーは「共通モデル (common model)」を使う、
>これは2回以上初期化されないかぎり複数の定義を許すものである。
>この動作は「共通の拡張(common extension)」としてANSI C規格に出てくる。

共通の拡張(common extension)とは、

J.5 Common extensions

The following extensions are widely used in many systems, but are not portable to all
implementations. The inclusion of any extension that may cause a strictly conforming
program to become invalid renders an implementation nonconforming. Examples of such
extensions are new keywords, extra library functions declared in standard headers, or
predefined macros with names that do not begin with an underscore.

J.5.11 Multiple external definitions

There may be more than one external definition for the identifier of an object, with or
without the explicit use of the keyword extern; if the definitions disagree, or more than
one is initialized, the behavior is undefined (6.9.2).

仮定義をどう解釈するかは置いといて、複数定義に関しては、Unixでは許されており、
C規格においても、common extensionとして多くのシステムが採用しているとされている。
767デフォルトの名無しさん:2011/09/22(木) 17:52:07.97
>>761
その文字列をsprintfで作るとかしないと無理じゃないかなぁ。
768デフォルトの名無しさん:2011/09/22(木) 18:35:47.84
>>761>>767
// フォーマット文字列じゃなくて変換対称文字列を加工してしまう手はどう?
int foo(const char * str, int len) {
char buf[len + 1];
sprintf(buf, "%.*s", len, str);
sscanf(buf, "%d", & val);
return val;
}
769デフォルトの名無しさん:2011/09/22(木) 19:52:20.93
>>768
char buf[len + 1];
Cだから、ここは変えないとというのはさておき、発想的には、それで>>761の要求を満たせるのかどうかかと
うしろ切っていいのっていう
770デフォルトの名無しさん:2011/09/22(木) 20:20:35.99
どういうことだ?
761の例でうしろ切ってるジャン
771デフォルトの名無しさん:2011/09/22(木) 20:24:05.34
>>770
printfみたいに、引数で文字数を渡したいんじゃない?
772デフォルトの名無しさん:2011/09/22(木) 20:43:37.92
if (lseek (STDIN_FILENO, 0, SEEK_CUR) >= 0
    && fflush (stdin) == 0)
{
  fseeko (stdin, 0, SEEK_CUR);
}

これ一体何やってんの?
同じ事2回やってる気が…
773デフォルトの名無しさん:2011/09/22(木) 20:50:34.41
>>770
%3dは例で、実のところは%3d%sかもしれない
ありえるのがこのスレ。
774デフォルトの名無しさん:2011/09/22(木) 20:55:05.53
>>762
指定した数だけgetch()したら良いんじゃね?後は必要な文字が来るまでで読み飛ばす
775デフォルトの名無しさん:2011/09/22(木) 20:59:19.35
非同期入力だったらどうするんだ
後から後から文字が付け足されて入ってくるぞ
776デフォルトの名無しさん:2011/09/22(木) 21:00:10.54
>>772
移植を含めたつぎはぎだらけのコードなんじゃないのかなぁ。
「何がしたいのか」がコメントに書かれて無いとそういう疑問を後世に残すハメに。

ちなみにそのfflushは未定義
777デフォルトの名無しさん:2011/09/22(木) 21:08:44.27
stdinを引数にしたfflushの動作は未定義 な
778デフォルトの名無しさん:2011/09/22(木) 21:14:31.91
VCだけ独自拡張で使えるんだよな
これを言うと知らなかった奴が結構多くて驚く
779デフォルトの名無しさん:2011/09/22(木) 21:18:15.45
GNU Cでも使えなかったっけ?
780デフォルトの名無しさん:2011/09/22(木) 21:32:12.12
gccもアカンよー
781デフォルトの名無しさん:2011/09/22(木) 21:45:09.37
それできるのglibcだっけ?
782デフォルトの名無しさん:2011/09/22(木) 21:54:40.79
>>778
未定義なものを独自に定義されていた、それだけのことなのに驚くなんてどうかしてるよね
783デフォルトの名無しさん:2011/09/22(木) 21:59:18.53
>>782
学校の先生も知らずに教えてたりするよ
どうなってるのかと思う
784デフォルトの名無しさん:2011/09/22(木) 22:00:39.03
うん
785デフォルトの名無しさん:2011/09/22(木) 22:35:57.87
fflush(stdin);

問題なくコンパイル通ったけど?
gcc version 4.5.2 (GCC)
786デフォルトの名無しさん:2011/09/22(木) 22:44:38.26
へえ
787デフォルトの名無しさん:2011/09/22(木) 22:47:31.86
コンパイルは通るさ
実行結果が未定義なだけで
788デフォルトの名無しさん:2011/09/22(木) 22:49:03.42
鼻から悪魔がでる
789デフォルトの名無しさん:2011/09/22(木) 22:50:34.49
未定義なら警告でないの?
790デフォルトの名無しさん:2011/09/22(木) 23:07:33.04
未定義=何が起きても不思議ではない

HDDをフォーマットされても文句は言えない
791デフォルトの名無しさん:2011/09/22(木) 23:22:00.91
>761

sprintf(fmt, "%%%dd", len);
sscanf("5678", fmt, &val);
792デフォルトの名無しさん:2011/09/22(木) 23:58:02.38
fflush(stdin)が定義されてる処理系のときって
fflush(NULL)ってするとstdinも一緒にflushされるのか?
793デフォルトの名無しさん:2011/09/23(金) 00:06:07.81
>>792
意味が分かんない
794デフォルトの名無しさん:2011/09/23(金) 00:13:41.15
http://msdn.microsoft.com/ja-jp/library/9yky46tz(v=vs.80).aspx

閉じられるのは出力ストリームだけのようだが
795デフォルトの名無しさん:2011/09/23(金) 00:22:44.02
flushでは閉じられないだろ。あくまでflushするだけで。
フラッシュボタンを押しただけで便座が閉まっちまったら挟まっちまうじゃないか。
796デフォルトの名無しさん:2011/09/23(金) 03:23:48.64
i=i++;
を定義しようという運動はありますか?
797デフォルトの名無しさん:2011/09/23(金) 07:06:58.79
>>796
むしろコンパイルエラーにして欲しいけど。

それとも「エラーとする」と定義して欲しいってこと?
Cコンパイラを実装しやすくしようという方針に反するからやらないだろうけど。
798デフォルトの名無しさん:2011/09/23(金) 08:17:07.42
fflush(stdin)ってPOSIX 1988のころは標準化しようとしてたんじゃなかったかな。
90年代に入ってまた下火になり、2000年代にまた再燃してる。
799デフォルトの名無しさん:2011/09/23(金) 09:56:43.20
>>793
JISのCでfflushのとこをみると
>streamが空ポインタのとき、fflush関数は、この箇条で動作が定義されているすべてのストリームに対して、
>その定義されている動作を行う。
って書いてあるから、stdinに対しての動作が定義されてるってことはそれもやっちゃうのかと思ったんだ

ちゃんと出力だけって定義に変えてあるのね
800デフォルトの名無しさん:2011/09/23(金) 15:14:43.62
>>796
あなたのHDDをフォーマットするようにする事は出来ますよ
801デフォルトの名無しさん:2011/09/23(金) 15:46:55.38
構造体ってstaticにできる?
802デフォルトの名無しさん:2011/09/23(金) 15:51:34.28
>>797
エラーでも可。
とにかく、言語レベルであいまいさが残されてるのはいやじゃね?
実際のところ、i=i++はコンパイルでwarningになるんだし。
803デフォルトの名無しさん:2011/09/23(金) 15:57:11.60
p=&i;
*p=i++;
みたいなのはどうすんの?
804デフォルトの名無しさん:2011/09/23(金) 17:12:07.62
>>801
できる。なぜできないと思った?
805デフォルトの名無しさん:2011/09/23(金) 17:33:32.32
>>804
ごめん、勘違いしてた。

static struct {
int a;
} data;
こんな感じのを別の関数の中に定義してmain関数から data.a でアクセスできると思ってた
806デフォルトの名無しさん:2011/09/23(金) 17:44:41.81
>>803
それを定義しろって言ってんだよ
807デフォルトの名無しさん:2011/09/23(金) 18:53:49.22
>>806
翻訳単位は左から右へ進み
参照直後に加算することを保障する (現状では 参照直後 から 副作用完了点の間)
ってことか?
808807:2011/09/23(金) 18:57:27.32
1行目のは 代入演算での 右辺、左辺の取り扱いでの話
809デフォルトの名無しさん:2011/09/23(金) 18:59:29.69
無駄なものを定義されるとコンパイラの最適化が利かなくなるから
C言語以外の言語でやってほしい
810デフォルトの名無しさん:2011/09/23(金) 19:13:49.16
>>809
でも、これで最適化が効かなくなる状況ってほとんどないよ
811デフォルトの名無しさん:2011/09/23(金) 19:57:29.23
>>806
void func(&a, &b) {
a = ++b;
}

func(i, i);

みたいのは?
812デフォルトの名無しさん:2011/09/23(金) 20:00:43.03
>>805
イミフ。

>こんな感じのを別の関数の中に定義して
関数の中で定義するのだから、ローカル変数になっているよね。


>main関数から data.a でアクセスできると思ってた
ローカル変数だからその変数はmainでは見えない。

staticが付けば静的変数にはなるけど、mainから見える見えないは関係ないよ。
813デフォルトの名無しさん:2011/09/23(金) 20:04:11.39
>>803>>806>>811
そういうのをコンパイラがチェックするのは、Cのポリシーに合わないと思う。

そういうことはしないでね、と決めてコンパイラの実装を軽くするのが、Cっぽいのでは?
814デフォルトの名無しさん:2011/09/23(金) 20:16:26.13
>>812
なにもしないとmainから見えてしまうと勘違いしていた
(上記勘違いを前提にして)staticをつければ見えなくできるのかどうか聞いた
ってことだろ 会話を読め
815デフォルトの名無しさん:2011/09/23(金) 20:19:35.54
const変数をポインタを通して間接的に変更出来たりするしな

結局C/C++はプログラマの「うっかりミス」からバグの生成を出来るだけ
排除しようとするけども、プログラマが「故意に」バグらせようとしたら無力

#define private public

これでカプセル化など簡単に破れる
816デフォルトの名無しさん:2011/09/23(金) 20:21:23.00
>>814
それだと関数内の組み込み型なローカル変数も main で見えるハズ という理解からのスタートにならない?

構造体って static にできる? と聞く動機に欠けるような。。。
817812:2011/09/23(金) 20:33:54.53
staticをつけることでグローバル変数と同じように扱えると思ったんです。
皆さんごめんなさい><
818デフォルトの名無しさん:2011/09/23(金) 21:29:47.48
>>817
>staticをつけることでグローバル変数と同じように扱えると思ったんです。
staticはグローバル変数にがつく時とローカル変数につく時で意味が変わる。
グローバル変数につくと、内部結合になるので、俗にファイルスコープになって、
グローバルよりスコープは狭くなる。

>>814
いやー、そうは読めないでしょ。ま、本人が出てきているので、水掛け論は止めましょ。
819デフォルトの名無しさん:2011/09/24(土) 00:57:46.36
書式指定での%xと%pの違いってなあに?
820デフォルトの名無しさん:2011/09/24(土) 01:01:12.73
そんくらい調べろks
821デフォルトの名無しさん:2011/09/24(土) 01:04:33.50
>>820
分からないなら無理しなくていいですよ^^;
822デフォルトの名無しさん:2011/09/24(土) 01:07:09.58
ンなこと言う魔があったらおしえてやよれks
823デフォルトの名無しさん:2011/09/24(土) 02:22:57.35
大した違いはないんじゃないかなー
表示の仕方が微妙に違うくらい?
824デフォルトの名無しさん:2011/09/24(土) 02:25:35.51
しょうがねえ、マジレスしてやる。

ポインタのサイズ≠intのサイズ
だ。
825デフォルトの名無しさん:2011/09/24(土) 02:26:59.52
>>824
マジで?
826デフォルトの名無しさん:2011/09/24(土) 02:32:48.63
正確じゃない
827デフォルトの名無しさん:2011/09/24(土) 02:34:46.37
win7 32bit : int = 32bit , pointer = 32bit
win7 64bit : int = 32bit , pointer = 64bit
828デフォルトの名無しさん:2011/09/24(土) 02:44:21.90
そりゃWindowsはLLP64モデルを採用しているからそういう結果になるだろうね
829デフォルトの名無しさん:2011/09/24(土) 02:54:04.59
LP64でも同じだよ。
むしろIP64な環境の方がめったに無いから。

っていうか、「Windowsだから」じゃねーし。
処理系とOSの区別もつかないバカ。
830デフォルトの名無しさん:2011/09/24(土) 02:57:16.04
longのサイズにも気おつけませう
831デフォルトの名無しさん:2011/09/24(土) 08:13:20.03
char , short , int ,long ,long long,__int64
832デフォルトの名無しさん:2011/09/24(土) 12:34:36.79
>>829
「Windowsだから」じゃなくて「WindowsはLLP64」ってあるだろ
何を当たり前のことを得意気に「処理系とOSの区別もつかないバカ(キリッ」だ
馬鹿かw
833デフォルトの名無しさん:2011/09/24(土) 15:02:04.20
int a(int[][2]);
int main(void){
int tajigen[2][2];
a(tajigen);
return 0;
}
int a(int tazigen[][2]){

多次元配列を引数にする場合、二個目の要素数を[][2]みたいに書くけど

int a(int[][?]);
int main(void){
int hairetuA[2][2],hairetuA[3][3],hairetuC[4][4]
a(hairetuA);
a(hairetuB);
a(hairetuC);
return 0;
}
int a(int hairetuX[][?]){

こういう場合、?に何を入れたらいいの
834デフォルトの名無しさん:2011/09/24(土) 15:09:04.17
>>833
それ無理
配列の一番最初の列は固定
835デフォルトの名無しさん:2011/09/24(土) 15:14:55.16
>>833
どうしょうもない。
代わりに↓とか。
間違えてたらスマン。

int a(int *hairetuX[], int elemNum)
{
// hairetuX[a][b]
*(hairetuX + a*elemNum + b);
}
836デフォルトの名無しさん:2011/09/24(土) 15:51:06.78
>>834-835
ありがとうございます
837デフォルトの名無しさん:2011/09/24(土) 17:59:20.83
833〜835はargvをどう捉えてどう処理してるのか興味あるわ
838デフォルトの名無しさん:2011/09/24(土) 18:20:02.58
特に>835は*(pointer + integer)がpointer[integer]の糖衣構文だと認識しているかどうか知りたいね。
839デフォルトの名無しさん:2011/09/24(土) 18:41:11.22
835だけど、argvはNULL終端文字列へのポインタの配列と捉えてる。

>>838
言われてみれば型おかしいね。
すんまへん。
あと俺は「が」と「の」が逆の認識。
840デフォルトの名無しさん:2011/09/24(土) 18:45:21.01
>>838
つまりどういうことかといいますと
841デフォルトの名無しさん:2011/09/24(土) 19:02:29.88
>>838
糖衣構文なの? 完全に等価だと思ってたんだけど
842デフォルトの名無しさん:2011/09/24(土) 19:04:10.99
>>841
どういうことだ!?
843第三者:2011/09/24(土) 19:11:13.31
int a(void *hairetuX, int elemNum)
{
// hairetuX[a][b]
*(((int *)hairetuX)+ a*elemNum + b)= ... ;
}
こんな感じか?
844デフォルトの名無しさん:2011/09/24(土) 20:26:19.59
hoge.cを作ったらhoge.hも必ず書く人 に質問したいんだけど

hoge.cの中で使ってる標準関数のincludeって
hoge.hに書く派? それとも、hoge.cに書く派?
845デフォルトの名無しさん:2011/09/24(土) 20:29:10.84
hoge.hに書くに一票。
846デフォルトの名無しさん:2011/09/24(土) 20:35:05.57
ついでにその思想も書いてもらえると勉強になる
847デフォルトの名無しさん:2011/09/24(土) 20:40:04.01
hoge.hに#include <stdio.h>とか書くの?
それはないでしょ。
848デフォルトの名無しさん:2011/09/24(土) 20:50:40.45
stdio.hが要らない別のファイルでhoge.hをインクルードしたら無駄にstdio.hが展開されるだろ
849デフォルトの名無しさん:2011/09/24(土) 21:13:00.99
>>842
規格でidenticalと書かれているからじゃないのかな?

The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
850デフォルトの名無しさん:2011/09/24(土) 21:16:19.51
マクロとかをhoge.h内で使用してるなら。

製作者ならhoge.cに

#include <stdio.h>
#include "hoge.h"

と書いても、他人は

#include "hoge.h"
#include <stdio.h>

と書くかもしれんし。

重複展開もどうせキャッシュに載るだろうし、そんなにコンパイルに時間かからんと思うし。
851デフォルトの名無しさん:2011/09/24(土) 21:19:19.36
#ifdef で回避しても展開されるの?
852デフォルトの名無しさん:2011/09/24(土) 21:25:17.37
最近のVCはStdAfx.hに記述するらしいな。
// stdafx.h : 標準のシステム インクルード ファイル、
// または参照回数が多く、かつあまり変更されない
// プロジェクト専用のインクルード ファイルを記述します。
853デフォルトの名無しさん:2011/09/24(土) 21:55:31.05
ヘッダファイルでヘッダファイルをインクルードしだすと
階層構造がぐちゃぐちゃになるきがするから
俺は最小限にしてるわ
システムインクルードをヘッダファイルでやるのは俺ルール(笑)だとありえないな

適切な順番でインクルードするのは使いたいCファイル側の責任だと思ってる
854デフォルトの名無しさん:2011/09/24(土) 21:55:42.33
>>850
そりゃ、h内でstdio.h使ってたら、hの中でincludeしないとだめでしょ。
855デフォルトの名無しさん:2011/09/24(土) 21:57:39.77
>>844
hoge.hが標準関数のヘッダに依存するならhoge.hに書くべき。

つまりhoge.hに先立ってstdio.hをインクルードすることが必要ならhoge.hに書いてしまう。

例えばhoge.hに
void hoge(FILE *);
という宣言がある場合は、hoge.hの中でstdio.hをインクルードしてしまう。

こんな感じ

#ifdef HOGE_H__
#define HOGE_H__

#include <stdio.h>

void hoge(FILE *);

#endif
856デフォルトの名無しさん:2011/09/24(土) 22:01:21.16
>>846
hoge.hをインクルードする際に
どのライブラリに依存しているか把握する必要がなくなる。
<...>でインクルードするようなライブラリは
基本的に修正する事はないので
無駄なビルドが発生するというデメリットもない。

まぁ、pchを使ったらいいよ。
857 ◆QZaw55cn4c :2011/09/24(土) 22:02:52.96
>>853 と同意見。
c ファイルの方に #include <windows.h> と記述し、ユーザー側 .h ではシステムファイルのインクルードは行っていません。
そうしておけば、windows.h に依存する記述をユーザーヘッダに含ませても無問題。
インクルードガードは必要に応じて行いますが。
858デフォルトの名無しさん:2011/09/24(土) 22:51:33.20
俺は >>855 と同じ方針だな
そのヘッダ内の宣言記述で確定してないと困るものは include に含ませるようにしてる
859デフォルトの名無しさん:2011/09/24(土) 23:08:39.02
コンパイル時間を減らしたいから

FILE* のみ存在するヘッダ ← 前方宣言で処理
FILE の実体が存在するヘッダ ← ヘッダ内でインクルード

かな。
後者のパターンで、インクルードしないメリットって何かあるの?個人的な好み以外で
860デフォルトの名無しさん:2011/09/24(土) 23:20:09.39
FILE*の前方宣言てどうやるのクラスの前方宣言はやったことあるけど
861デフォルトの名無しさん:2011/09/24(土) 23:23:52.19
>>860
FILEはtypedefで処理系によりタグがマチマチだから
#ifdef A
struct a;
typedef struct a FILE;
#elif B
struct b;
typedef struct b FILE;
#elif C
struct c;
typedef struct c FILE;
....
#endif
とかだね
まぁヤル馬鹿はいない
862デフォルトの名無しさん:2011/09/24(土) 23:28:30.18
VCでincludeする順番によっては誤作動するライブラリがあったような気がする。
順番間違わないように定番自作関数のヘッダファイルにinclude書いた記憶がある。
863デフォルトの名無しさん:2011/09/24(土) 23:36:59.59
>855
#ifndefだろ
864デフォルトの名無しさん:2011/09/24(土) 23:51:09.73
やばい
#if defined(A)
#elif defined(B)
だろとか言われそう
865デフォルトの名無しさん:2011/09/25(日) 00:19:01.23
>>863
ごめん、単純ミスです。

#ifndefが正しい。

>>853
>ヘッダファイルでヘッダファイルをインクルードしだすと
>階層構造がぐちゃぐちゃになるきがするから

自分にとっては
「XXXヘッダを使うに先立って、YYYヘッダをインクルードしておくこと」
などという約束事が必要なのがぐちゃぐちゃになっていると思う。

XXXヘッダにYYYヘッダをインクルードしておけば、ソースがその依存関係を語ってくれる。
866デフォルトの名無しさん:2011/09/25(日) 00:23:25.94
>>859

もしかしてstdio.hをインクルードしないですむように、勝手に
FILEを宣言しようとしている?
カプセル化を破ろうとする行為だよ。

ヘッダをインクルードするのは、公開して何を隠すかを
ソースで表すためにしている。

FILEが使いたいならstdio.hをインクルードすべき。
ユーザプログラムでFILE構造体の中身が気になることは無いはず。
867デフォルトの名無しさん:2011/09/25(日) 00:25:25.02
>>866
stdio.hをインクルードすると分単位でコンパイル時間が延びるような貧弱な環境かもしれないだろ
868デフォルトの名無しさん:2011/09/25(日) 01:47:30.71
循環の対策としてifndefの外側にincludeを書くという方法もあるよ
自分は基本的にifndefの内側にはincludeを書かないルールにしてる


#include "bbb.h" // 外に書く

#ifndef __AAA_H__
#define __AAA_H__

// #include "bbb.h" //中ではなく

#endif // __AAA_H__


あまり一般的ではないかもしれないが。
自分のケースだとこれで循環や宣言順などの面倒な問題の多くがクリアーできる。
869デフォルトの名無しさん:2011/09/25(日) 05:49:49.18
>>832
longのサイズを決定するのはOSじゃないよ。
まだわかってないんだね。

最近知った言葉を使ってみたかっただけなんだろうけど
無理しないほうが恥かかないで済むよ。
870デフォルトの名無しさん:2011/09/25(日) 06:52:26.71
こういう話のかみ合わない人ってどこにでもいるよね
871デフォルトの名無しさん:2011/09/25(日) 07:14:52.41
キモいヤツ
872デフォルトの名無しさん:2011/09/25(日) 07:32:01.19
Cで効率化って
Pen4は窓から投げてコア2拾って来いよ
たぶんそこらへんに落ちてるw
873デフォルトの名無しさん:2011/09/25(日) 07:35:28.34
>>872
誤爆でしょうか
いいえ、誰でも
874デフォルトの名無しさん:2011/09/25(日) 09:39:16.70
typedef struct{int a,b,c;} _tag;
int main(void){
_tag tag[4][4];
for(int i=0;i<=3;i++){
for(int j=0;j<=3;j++){
tag[i][j] = {1,1,1}; //6行目
}
}
return 0;
}

なんか6行目に「構文エラー : ';' が '{' の前にありません。構文エラー : ';' が '}' の前にありません。」
ってなるんだけど…
for文使って 「構造体[i][j]={ , , , };」 ってできないの?
875デフォルトの名無しさん:2011/09/25(日) 09:48:15.23
時代は変わるwww
876デフォルトの名無しさん:2011/09/25(日) 09:52:31.54
int i,j;
877デフォルトの名無しさん:2011/09/25(日) 09:53:17.60
>>874
二重の配列に二重のループなんだから、入れるのは値一つで充分だろ。
878デフォルトの名無しさん:2011/09/25(日) 10:20:12.98
初期化ではなく代入や引数等で構造体のメンバを一括して与えるのは…



C90からできるんだっけ?
879デフォルトの名無しさん:2011/09/25(日) 10:22:18.67
fgetsで標準入力から読み込んでるんだけどこれより速いのない?
一行の長さがバラバラだからfreadが使えないし
880デフォルトの名無しさん:2011/09/25(日) 10:52:39.41
そうじゃないけど、そんなことより、GCC でどうやって明示的にC90を指定するんだ?

typedef struct _tag {int a, b, c;} _tag;
static _tag init(int ta, int tb, int tc)
{
  static _tag t;
  t.a = ta, t.b = tb, t.c = tc;
  return t;
}
#define N 4
int main(){
  _tag tag[N][N];
  int i, j;
  for(i=0; i<N; i++){
    for(j=0; j<N; j++){
      tag[i][j] = init(1,1,1);
    }
  }
}
881デフォルトの名無しさん:2011/09/25(日) 11:05:04.99
tag[i][j] = (_tag){1,1,1};
882880:2011/09/25(日) 11:14:53.37
>>874 はコンパイラ/バージョン/コンパイルオプションに何使ってる?
883デフォルトの名無しさん:2011/09/25(日) 12:20:27.71
いやいや
どんなバージョンでも初期化には中括弧を使えるから
素人は死んでてください
884デフォルトの名無しさん:2011/09/25(日) 12:36:12.46
>>883
どうぞあなたの番です
885デフォルトの名無しさん:2011/09/25(日) 13:14:08.75
>>880
-ansi -pedantic
886デフォルトの名無しさん:2011/09/25(日) 13:38:28.13
gcc の -pedantic って、何故 "pedantic" なんだろう?

あまり「名が体を表していない」ような気がする。

誰かその由来を教えてください。
887デフォルトの名無しさん:2011/09/25(日) 14:47:39.77
そんなこと気にする奴は衒学的なヤツだけだ
888880:2011/09/25(日) 15:47:32.72
>> ゲンガクテキ
gcc の -c89 って、何故 "89" なんだろう? その由来を教えてください。

-std=
 c89
 iso9899:1990
  ISO C90 (same as -ansi).

 gnu89
  Default, ISO C90 plus GNU extensions (including some C99 features).
889デフォルトの名無しさん:2011/09/25(日) 15:48:08.43
>>861
FILE*でポインタだからそんなことする必要ないだろ。
890デフォルトの名無しさん:2011/09/25(日) 16:10:26.45
891デフォルトの名無しさん:2011/09/25(日) 16:37:34.65
FILE*でポインタかぁ
いみわからない
892デフォルトの名無しさん:2011/09/25(日) 16:40:59.09
FILEの前方参照の書き方賭けよ
893デフォルトの名無しさん:2011/09/25(日) 18:38:14.42
>>888
ANSIで制定されたのが1989年。ISOで制定されたのが1990年。
894デフォルトの名無しさん:2011/09/25(日) 19:54:57.95
>>886
当時訳分からん単語だと思って調べて、すんなり理解できた俺とはまるで逆なんだな
名か体のどっちかを勘違いしてんのか?
895デフォルトの名無しさん:2011/09/25(日) 19:59:50.85
規格の細かい記述を持ち出してきて延々難癖つけたり、
泥沼の議論をしたりするところをみてないとわからないんじゃないかな。
それこそ昔のfj.lang.cあたりを見てたら一発でわかると思うw
896デフォルトの名無しさん:2011/09/25(日) 20:09:40.58
>>894
いや、>>887 的な意味だろうとは思うのだが、
ちょっと皮肉が過ぎるかな、と。

実際、このオプションを必要としているのは
規格厨だけじゃないからね。
897844:2011/09/25(日) 20:54:04.46
やっぱいろいろな思想があんだな。 勉強になったわ。
898 ◆QZaw55cn4c :2011/09/25(日) 21:32:06.91
>>895
それは今でもよくみられることです、ええ。
899デフォルトの名無しさん:2011/09/25(日) 21:57:56.81
>>898
アホはすっこんでろ
900 ◆QZaw55cn4c :2011/09/25(日) 22:00:08.48
>>899
あばばばばぁ
901デフォルトの名無しさん:2011/09/25(日) 22:28:00.91
>>879
getchar()とかでどうよ

getchar()が速いかは知らんけど
902デフォルトの名無しさん:2011/09/25(日) 23:43:05.15
>>901
遅いよ。

>>879
1行当たり文字数が少ないなら、fread()で一括で読んでから自前でばらした方が速くなる可能性はある。
でも、cygwinみたいなシミュレーション環境でもない限りfgets()より大幅に速くするのは難しいと思う。
903デフォルトの名無しさん:2011/09/25(日) 23:51:22.69
>>896
pedanticスイッチをつけなければならない理由は?
904デフォルトの名無しさん:2011/09/26(月) 00:04:41.32
>>901
getchar() の速度は、マルチスレッドか否かで大幅に変わるだろ。
まずは >>879 の環境を聞かないと。

>>879
とりあえず setvbuf() で、バッファサイズを大きくしておけ。
905デフォルトの名無しさん:2011/09/26(月) 00:09:22.59
>>879
あと、Windows 環境ならば、fopen() の時に
バイナリモードにするのもよいかも。
906デフォルトの名無しさん:2011/09/26(月) 00:42:26.50
>>904
それはマルチスレッドだと遅くなるという解釈でいいんだよな
907デフォルトの名無しさん:2011/09/26(月) 18:25:52.33
>>903
別人だけど移植性
908デフォルトの名無しさん:2011/09/26(月) 18:39:19.09
規格厨だけじゃないけど規格を重視しなければならない場面で使うよっていうのなら、
それこそ>>896に対する皮肉だよな
909デフォルトの名無しさん:2011/09/26(月) 20:07:47.69
Windowsの環境でS-JISのテキストファイルをUTF-8にして保存するにはどうすればいいでしょ?
910デフォルトの名無しさん:2011/09/26(月) 20:13:16.38
>>909
秀丸で保存する
911デフォルトの名無しさん:2011/09/26(月) 20:15:26.38
iconv -f Shift_JIS -t UTF-8 sjis.txt > utf-8.txt
912デフォルトの名無しさん:2011/09/26(月) 20:16:44.39
やることは簡単だ。
S-JISを2byteずつ読みこんでいって、それをUTFの該当のコードに照らし合わせりゃいい。
ただし、その簡単な変換表を作る作業はまぎれもなくクソ。
がんばってね。
913デフォルトの名無しさん:2011/09/26(月) 20:22:40.13
"汚れ仕事はPCにやらせる"が鉄則
914デフォルトの名無しさん:2011/09/26(月) 20:28:02.66
>>913
じゃあそのヨゴレ仕事の内実を是非とも今ここで教えてくれ
できればソーース付きで
915デフォルトの名無しさん:2011/09/26(月) 20:37:47.70
山ほどあるだろ汚れ仕事
ソースをコピペしてかさ増しするとか
916デフォルトの名無しさん:2011/09/26(月) 20:54:18.26
ソースの笠間市は難読化でやるなぁ
無駄部分をそれとなーく紛れ込ませたり
無意味な判定を紛れ込ませたり
何もしない大掛かりなループ挿入したり
917デフォルトの名無しさん:2011/09/26(月) 23:04:22.94
てめーのソースなんて誰も解読しねーよ
918デフォルトの名無しさん:2011/09/26(月) 23:46:04.31
そんなのカバレッジテストで一発で一掃されるだろ、普通。
919デフォルトの名無しさん:2011/09/27(火) 00:13:25.76
カバレッジテストツールほしい
920デフォルトの名無しさん:2011/09/27(火) 02:54:17.42
C99はどうして一向に流行らないの?いらない子なの?
921デフォルトの名無しさん:2011/09/27(火) 03:28:25.81
いらない子だよ
922デフォルトの名無しさん:2011/09/27(火) 15:09:02.10
>>920
毎日使ってるよ
923デフォルトの名無しさん:2011/09/27(火) 15:57:08.74
20年ぐらい遅れてる人が一杯いるから
924デフォルトの名無しさん:2011/09/27(火) 18:29:24.56
C99使うくらいならC++に行くだろ
925デフォルトの名無しさん:2011/09/27(火) 21:39:31.81
C2011はいつ出るの?
926デフォルトの名無しさん:2011/09/27(火) 22:47:06.38
すみません、scanf()とEOFに関する質問なのですが、
以下のような、2種類の入力を処理する安直なテストプログラムを書いてみたのですが、
二個目のwhileループが一個目のwhileループを抜けた直後にすぐ抜けてしまいます。

while (scanf(fmt1, ...) != EOF) { func1(...); }
while (scanf(fmt2, ...) != EOF) { func2(...); }

どうやら二個目のwhileにはscanfがEOFの状態を保持したまま入っているようです。
こういう場合はどうするのが一般的でしょうか。

とりあえずstdioの関数を眺めるとEOFをクリアする作用のある関数がいくつかあるので、
どれかを二個目のループの前で呼べばいいでしょうか? その場合はどの関数でしょうか?

ちなみにMac OS X 10.6.8の上でやっています。
927デフォルトの名無しさん:2011/09/27(火) 23:52:34.01
>>926
fgetsしてsscanf
928デフォルトの名無しさん:2011/09/28(水) 00:15:24.62
組み込み系C言語で
関数の引数や戻り値、ローカル変数はすべてスタック領域に格納ですか?
それともコンパイラによっては汎用レジスタとかに格納とかもありますか?
929デフォルトの名無しさん:2011/09/28(水) 00:19:15.18
registerって使ったことねえな
930デフォルトの名無しさん:2011/09/28(水) 00:27:12.05
コンパイラによる
registerで明示的にレジスタ使う変数定義できたり
最適化すればコンパイラの判断でよく使う値や変数をレジスタに入れたままで使ったり

てかローカル変数も引数も何もしなくてもいくつかまではレジスタに入るものじゃなかったっけ
931928:2011/09/28(水) 00:43:25.44
ありがとうございました。それを受けて追加で質問があります。
グローバル変数は品質や安全面を考慮するとあまり使わないほうがいいとよく聞きます。
でも、レジスタかスタックかわからないローカル変数よりも
グローバル変数を静的メモリ配置(できればアドレスも決めて)したほうが
コンパイラ依存も無く、どこのメモリに格納されているか把握できるので、
そっちのほうが安全かなと思ったんですがいかがでしょ?
932デフォルトの名無しさん:2011/09/28(水) 00:45:42.99
>>931
どうしてもその区別が必要なら volatile で修飾するといい
933 ◆QZaw55cn4c :2011/09/28(水) 00:49:40.26
>>928
組み込みのことはわかりませんが、いにしえの lsi-c の時点で、すでにデフォでレジスタだったりしてました。
RISC 系はレジスタが馬鹿みたいに多かったので、これまたデフォでレジスタだったりしてました。
gcc も -O2 さてどうなっているのか。
#include <stdio.h>
int f(int c) {
return c + 1;
}

int main() {
int a = 1, b = 2;
return f(a + b);
}
/* end */
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
call ___main
ここからプログラム本文
addl $4, %esp
movl $4, %eax あれま、f(a + b) = 4 であることをこの時点で計算してしまっている。f() の呼び出しのかけらもない。
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
934デフォルトの名無しさん:2011/09/28(水) 00:51:37.09
RISCを触ってみた経験もない癖に見栄張るなやカス
935 ◆QZaw55cn4c :2011/09/28(水) 00:57:55.60
>>934
学生実験で SPARC/Sun OS 4.1.1 を触っていたんですけどねえ。これって RISC じゃなかったんでしたっけ。
936デフォルトの名無しさん:2011/09/28(水) 00:59:44.62
学生時代・・・
937デフォルトの名無しさん:2011/09/28(水) 02:12:25.27
>>933
「デフォでレジスタだった」ら、どうなの。
すべてregister修飾すればいいと言ってるつもりはないんだろうけど、そう読める書き方はどうかとおもう。

てか、QZっていつぞやにどっかのサイトから丸パクリしたregister修飾されてるコード貼ってたろ。
register修飾が無意味のような思想を持っているなら、おかしいよな。
938デフォルトの名無しさん:2011/09/28(水) 02:19:38.14
アセンブラの知識がにわかくさいんだが
939デフォルトの名無しさん:2011/09/28(水) 02:48:51.35
>>928
皆さん最適化の話しかしてないけど関数の呼び出し規約(ABI)の問題もある。
関数の引数や戻り値に関しては勝手にレジスタを使ったりはできない場合もある。
940デフォルトの名無しさん:2011/09/28(水) 03:06:09.51
>>927
おお確かに。ありがとうございます。

ところで、どうやらこれはscanfの「処理できない入力がバッファに残る問題」が関連して
いるようなんですが、これってEOFに関してはどうなんですかね。

というのは今、ふとUbuntuの上で試したら元のコードでも問題なかったので...
Mac OS Xの方はある意味EOFが処理できずにバッファに残っている状態のような...

まあ「そもそもscanfの挙動に頼るんじゃねーよ」と言われればそれまでなんですがw
でも、例えば他人のバグを指摘するときに自信を持ってバグの指摘をしたい場合もありw
941デフォルトの名無しさん:2011/09/28(水) 07:35:45.74
>>940
実際に違う挙動を起こしたと言うコードを見ていないからなんともいえないが、何か勘違いしていると思う。
入力が本当に終了して最初のループを抜けているのなら、
二番目のループでも当然入力が終了したままだからそのまま抜けて当然。
942デフォルトの名無しさん:2011/09/28(水) 07:38:52.49
>>940
確かに戻り値はレジスタ経由の実装が多いね。
APIのように、OSなどシステム側から提供される場合はABIで引き数がスタック経由である場合が多い。
これも、前から積むか、後ろから積むか、などの違いがあることもあるが。
一方、コンパイラ側から提供されるライブラリならコンパイラ側の自由が利くから、
それこそLSI-Cのようにレジスタ経由で引き数を渡すのが前提になっている場合もある。
943デフォルトの名無しさん:2011/09/28(水) 07:47:50.14
>>941
うーむ、それってscanf()特有の事情は関係ない、純粋にstdinの扱いということですか?
とすると>>927さんのアドバイスも無効ということになり...

念のためですが、入力はターミナルから対話的に行っていて、EOFというのは
ターミナルからctrl-Dを入力するという事です。
944 ◆QZaw55cn4c :2011/09/28(水) 07:56:43.38
945デフォルトの名無しさん:2011/09/28(水) 07:58:06.21
ターミナルの終端通達コードが違う ってことはないの?
946デフォルトの名無しさん:2011/09/28(水) 07:59:36.38
>943
OSXで動けばいいってだけなら、間にrewind(stdin);をかませる。
947デフォルトの名無しさん:2011/09/28(水) 08:10:32.43
rewind(stdin) より clearerr(stdin) のほうがいい?
948デフォルトの名無しさん:2011/09/28(水) 08:20:18.71
stdinの仕様よく知らないけど
普通のファイルだと考えた場合
一度EOFが帰ってきたらもう後はいくら読み込もうとしてもEOFじゃないの?
949デフォルトの名無しさん:2011/09/28(水) 09:43:02.65
>>948
Exactly!
950デフォルトの名無しさん:2011/09/28(水) 12:01:27.06
>>948
EOFと改行を混同してるっぽいよ
951 ◆QZaw55cn4c :2011/09/28(水) 12:26:36.72
>>948
普通のファイルと端末=stdin とはまた違うようです。
952デフォルトの名無しさん:2011/09/28(水) 12:47:54.43
パイプでリダイレクトされる(≒ 普通のファイル)ことを考えると
scanf() の戻り EOF(ストリームの終端、ASCIIコードEOFに非ず) を入力のセパレータに使うべきではないような感じ
953デフォルトの名無しさん:2011/09/28(水) 12:51:32.72
区切りは空行で十分じゃねーの。
954デフォルトの名無しさん:2011/09/28(水) 13:02:31.44
QZは嘘を付いてでも自分を大きく見せようとするからな
さすが自己愛性人格障害
955デフォルトの名無しさん:2011/09/28(水) 13:50:23.88
stdinも普通のファイルも大差ないだろ
シークできないって程度じゃね?
956デフォルトの名無しさん:2011/09/28(水) 15:15:06.44
アルゴリズムが得意な人これお願いします
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1272246182
957デフォルトの名無しさん:2011/09/28(水) 15:33:27.26
経験値がいくつのときにレベルアップするかのテーブルがあれば可能じゃね
958デフォルトの名無しさん:2011/09/28(水) 15:35:43.27
つまらん・・・
予測も何も、%表示は線形と定義して、順次平均を出していくだけ。
初期パラメータに、切り捨て、四捨五入、切り上げ の3つを選べばより正確さがますだけ。
悩むようなアルゴリズムじゃない。
959デフォルトの名無しさん:2011/09/28(水) 16:05:33.40
10匹分の合計で計算すりゃマシな値でるんじゃね?
960デフォルトの名無しさん:2011/09/28(水) 16:20:33.64
まず考えるのは最小二乗法だが、
%表示の誤差を単純に処理していいのかは
悩む所だろうなあ
961デフォルトの名無しさん:2011/09/28(水) 17:05:54.55
質問者は正確なLvUPの経験値が知りたいのかな?
一匹づつの結果より累計の結果の方が精度高いと思う。
962デフォルトの名無しさん:2011/09/28(水) 17:17:04.41
>例えば現在の獲得総経験値が「48%」と表示されていて
>敵を倒し、1230の経験値を得て「50%」になったとします、そして
>1.1230→「52%」
>2..1230→「54%」
>3...1230→「57%」

(1230*4)/(57-48)≒1%分の経験値
963デフォルトの名無しさん:2011/09/28(水) 17:40:48.58
何の話か知らんが10%時間は6分だ
964デフォルトの名無しさん:2011/09/28(水) 18:12:16.41
この手の問題はまずは数学板に持ち込んだ方が速いかもな

分からない問題はここに書いてね360
http://kamome.2ch.net/test/read.cgi/math/1316096657/
965デフォルトの名無しさん:2011/09/28(水) 18:15:51.69
Exp. = 10 * Lv. * (Lv. - 1) (゚σ ゚)ホジホジ
966デフォルトの名無しさん:2011/09/28(水) 18:16:13.40
>>962 の方法が一番正確だと思う
967デフォルトの名無しさん:2011/09/28(水) 18:23:04.35
数学板いくほどのもんなのか?
968デフォルトの名無しさん:2011/09/28(水) 23:31:43.51
これから、webアプリが流行してくると、C言語の役割が変わってくるような感じが
しています。アプリ関係は他言語で、OSや組み込みレベルはCでっていうふうに
分かれていくような気がしてきませんか?
969デフォルトの名無しさん:2011/09/28(水) 23:36:40.38
もともと言語は目的があって作られております
970デフォルトの名無しさん:2011/09/28(水) 23:37:08.51
しない
971デフォルトの名無しさん:2011/09/28(水) 23:37:24.16
どうでもいいがな
それよりHTML5勉強しろよ
972デフォルトの名無しさん:2011/09/28(水) 23:41:50.29
今でもアプリをC言語でなんか書かないだろ
973デフォルトの名無しさん:2011/09/28(水) 23:43:13.76
“C”“C++”で書かれたコードを実行可能になった「Google Chrome」v14の安定版

高度なオーディオエフェクトをJavaScriptで実現できるAPI“Web Audio”に対応

http://www.forest.impress.co.jp/docs/news/20110920_478758.html

こんなのもあるんだからWebアプリはまだまだ未知数だよ
974デフォルトの名無しさん:2011/09/28(水) 23:44:30.71
クロームだけが頑張ってもな・・・
975デフォルトの名無しさん:2011/09/28(水) 23:45:26.93
いや他のブラウザも追従するだろ
特にFirefoxやOpera当たり
976デフォルトの名無しさん:2011/09/29(木) 01:48:47.87
>>975
operaはどうだろ・・・
あいつら「自分こそが正しい」の一点張りで、見れないサイトあっても
ガン無視決め込むからな・・・
977デフォルトの名無しさん:2011/09/29(木) 03:20:46.88
指定桁数で四捨五入する以下の関数の実行速度を上げたいの。
(valueは正、digitsは0〜5が保証される)
これ以上速くできる?

double NormalizeDouble(double value, int digits) {
  static double t0[] = { 1, 10, 100, 1000, 10000, 100000 };
  static double t1[] = { 1, 0.1, 0.01, 0.001, 0.0001, 0.00001 };
  return (int)(value * t0[digits] + 0.5) * t1[digits];
}
978デフォルトの名無しさん:2011/09/29(木) 03:53:21.48
double NormalizeDouble(double value, int digits) {
static int t0[] = { 1, 10, 100, 1000, 10000, 100000 };
int t;
t=t0[digits];
return (int)(value * t + 0.5) / t;
}
979デフォルトの名無しさん:2011/09/29(木) 03:53:54.64
>>977
やってみたけど無理だった
980デフォルトの名無しさん:2011/09/29(木) 03:54:47.63
>>978
おいw
981デフォルトの名無しさん:2011/09/29(木) 07:22:56.66
>>980
なに?
982デフォルトの名無しさん:2011/09/29(木) 07:24:00.82
return (int)(value * t + 0.5) / (double)t;
983デフォルトの名無しさん:2011/09/29(木) 07:30:03.99
次スレ立てます
984デフォルトの名無しさん:2011/09/29(木) 07:31:13.42
次スレ立てました
C言語なら俺に聞け(入門編)Part 90
http://hibari.2ch.net/test/read.cgi/tech/1317249060/
985デフォルトの名無しさん:2011/09/29(木) 08:10:48.95
>>977

double NormalizeDouble(double value, int digits) {
  static double t0[] = { 1.5, 10.5, 100.5, 1000.5, 10000.5, 100000.5 };
  static double t1[] = { 1, 0.1, 0.01, 0.001, 0.0001, 0.00001 };
  return (int)(value * t0[digits]) * t1[digits];
}
986デフォルトの名無しさん:2011/09/29(木) 09:52:30.87
整数どうしの積に0.5加えた、元の方が早いよ
987デフォルトの名無しさん:2011/09/29(木) 10:31:50.34
どうも、>>926 ですが
>>948
私もそう思ったんですが... どうなんでしょうかね。標準入力に関して。

ちなみに stdio でなく read() で同じコードを書いてみると、一旦EOF(ctrl-D)を
入力したあとに後に再び read() を呼ぶことで、引き続き標準入力を読めました。
これは Ubuntu も Mac OS X も同じ。

ということは scanf() も同じ挙動をした方がいいのかな、と思ったり...
988デフォルトの名無しさん:2011/09/29(木) 10:37:24.28
入力を閉じている(CtrlD)のに再度入力できるのが不自然だと思う。
標準入力をリダイレクトしてファイルから読んでいたら、そんな振る舞いはしないと思う。
989デフォルトの名無しさん:2011/09/29(木) 10:57:40.79
read() は、単に読み込んだバイト数を返すだけで
read()の戻り値が0の時にEOFと判断するのはstdioがやってること。
(cookedモードの)端末I/Oは行の先頭で^Dが入力されたときに0バイトが読み込まれたと返すだけで、
次にread()が呼び出されたら、入力に応じた値を返す。

現象から推測してreadが0を返したときに、
Linux(glibc?)はEOFフラグをたてないけど、OS XはEOFフラグを立てておき
EOFフラグが立っている状態でさらにscanf等を呼び出すとreadせずに
そのまま-1を返しているんじゃないのかな。
990デフォルトの名無しさん:2011/09/29(木) 11:21:39.70
すごく素朴な疑問なんだけど
ポインタ変数の宣言をする時なんで皆「void *i」なの?
「void* i」の方がポインタ変数って分かりやすくね?
991デフォルトの名無しさん:2011/09/29(木) 11:37:10.10
>>990
void* i, j;
みたいに間違うから。
C++だとvoid*形式のが好まれてるけどね。
992デフォルトの名無しさん:2011/09/29(木) 11:46:34.69
次からは「void *i」って書く事にします。
993デフォルトの名無しさん:2011/09/29(木) 14:22:43.19
>>991
意味分かりません
994デフォルトの名無しさん:2011/09/29(木) 14:24:55.50
995デフォルトの名無しさん:2011/09/29(木) 15:03:50.20
>>993
void* i,j; だと void*という型に見えちゃうけど実際には
void *i,j; だということを認識しろという話だろボケ
996デフォルトの名無しさん:2011/09/29(木) 15:18:51.27
>C++だとvoid*形式のが好まれてるけどね。
こっちの話じゃね?
997デフォルトの名無しさん:2011/09/29(木) 15:24:50.07
もうね、書き方は宗教に近いからどうでもいいと思うよ。
俺は中間を取って void * p;
と真ん中に書く、どちらからも文句言わせんw
998デフォルトの名無しさん:2011/09/29(木) 15:26:57.35
>>997
どうでもいいと思うならわざわざ出てくるなよ。
999デフォルトの名無しさん:2011/09/29(木) 15:39:48.74
どうでもいいから中間にしたと言っているだろうが、文盲か
1000デフォルトの名無しさん:2011/09/29(木) 15:41:15.73
1000ならプログラミング技術がチョットだけ向上
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。