トップページ⇒tech
1001コメント269KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2011/08/31(水) 18:45:07.04
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/
0002デフォルトの名無しさん2011/08/31(水) 20:08:18.31
よく、「C/C++」って表記見ますけど、区別ないんですか?
0003デフォルトの名無しさん2011/08/31(水) 20:15:06.53
>>2
表記されてる本を読んでみるとわかると思うが、前半はC、後半はC++と、明確に別れてる
0004デフォルトの名無しさん2011/08/31(水) 21:11:17.20
前スレでまともな答が来なかったからもう一度

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

例えば、繰り返し文の処理内や、関数呼出し毎に関数内で
malloc->freeみたいな
0010デフォルトの名無しさん2011/08/31(水) 22:17:59.36
いいけど?
0011デフォルトの名無しさん2011/09/01(木) 01:38:18.56
初歩的な質問で申し訳ありません。
C言語は「シー言語」と読むのが正しいのでしょうか?
それとも「スィー言語」でしょうか?
0012デフォルトの名無しさん2011/09/01(木) 02:15:16.40
シー言語としか聞いたことが無いです
0013デフォルトの名無しさん2011/09/01(木) 02:21:00.67
英語の発音記号では、Sea[siː]、She[ʃ iː]となります。[s]と[ʃ]の区別はとても重要です。日本人には難しい音ですが、英語ネイティブははっきりと音を区別しています。
日本人が発音すると、Sea[siː]と言っているつもりでも大体はShe[ʃ iː]と聞こえてしまいます。またアルファベットの“C”の発音はSea[siː]と同じですが、これも多くの日本人がShe[ʃ iː]と発音してしまっています。
0014デフォルトの名無しさん2011/09/01(木) 02:28:14.82
どうちがうんだ?
0015デフォルトの名無しさん2011/09/01(木) 02:35:05.61
ttp://hatsuon.msize.net/sub7.html
0016デフォルトの名無しさん2011/09/01(木) 02:47:43.87
当たり前ですがネイティブ・スピーカーは「スィー」と言っていますね
http://www.youtube.com/watch?v=KlPC3O1DVcg
0017デフォルトの名無しさん2011/09/01(木) 02:48:29.02
ABCも読めんのか
あーべせー
0018デフォルトの名無しさん2011/09/01(木) 03:05:13.18
シーって言ってる奴が多いっていうしょうもないネタだろそのくらいも分からないのか>>17
0019デフォルトの名無しさん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、〜
0020デフォルトの名無しさん2011/09/01(木) 06:01:48.41
int F(int n)
{
n %= 8;
return n ? n - 1 : n;
}
0021デフォルトの名無しさん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;
}
0022デフォルトの名無しさん2011/09/01(木) 11:18:52.99
うわーやっぱりC++の入出力の書き方ってきもいわ

int F(int n){
return (n+7)%8%7;
}
0023デフォルトの名無しさん2011/09/01(木) 11:21:48.46
C++でもprintf使用。
0024デフォルトの名無しさん2011/09/01(木) 11:26:53.84
整数を入力といっているが負数の場合は何を返せばいいんだろうか
0025デフォルトの名無しさん2011/09/01(木) 11:30:56.40
C++ならcout使わないともったいない(とあるCMのパクパク)
0026デフォルトの名無しさん2011/09/01(木) 13:06:19.20
他のプログラムが使ってるメモリの中の変数参照したいんだけど、無理?
0027デフォルトの名無しさん2011/09/01(木) 13:45:18.39
スィー言語なんて、言いにくいよ
0028デフォルトの名無しさん2011/09/01(木) 13:56:11.82
test
0029デフォルトの名無しさん2011/09/01(木) 14:12:03.97
>>26
デバッガでアタッチ汁
0030デフォルトの名無しさんNGNG?2BP(10)
セィー言語
0031デフォルトの名無しさん2011/09/01(木) 18:51:36.73
c++ならconstだろう 21は何を意図してstaticなんだろう?
0032デフォルトの名無しさん2011/09/01(木) 18:55:38.18
「c++なら」っていうのが意味不明
0033デフォルトの名無しさん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'の前まで出力していたように見えます。
0034デフォルトの名無しさん2011/09/01(木) 21:16:26.13
勝手にそうするコンパイラもあるかも知れないけど、何が入るかは不定
0035デフォルトの名無しさん2011/09/01(木) 21:28:11.54
c言語が一番強いの?
0036デフォルトの名無しさん2011/09/01(木) 21:51:14.78
>>35
アセンブラほどじゃないにしても、GUI作るとかは、「成せばなる。千里の道も一歩から」って感じ

何でも(理論上)作れるけど、今や開発する規模が大きすぎて、高速化したい所だけCを使うとかが多い
0037デフォルトの名無しさん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'なんか突っ込んだらまずいっしょ。ナル文字なくなっちゃうんだから。
0038!jinjya2011/09/01(木) 22:01:41.73
> s[11] は最低でも'\0'じゃなくちゃいけない。
char s[11];なら
s[10] は最低でも'\0'じゃなくちゃいけない。
0039372011/09/01(木) 22:19:08.09
>>38
指摘どもです。定義としてはchar s[12];だね。
だからs[11]は最低でも'\0'じゃなくちゃいけない。
0040デフォルトの名無しさん2011/09/01(木) 22:28:22.21
>>33の定義だと要素は11個しか用意してないから、
char s[11];
0041デフォルトの名無しさん2011/09/01(木) 22:34:06.50
>>40
その考えが正しいなら、sにはナル文字が入らないことになる。
このパターンはコンパイラでナル文字までの領域を確保するJK。
0042デフォルトの名無しさん2011/09/01(木) 22:39:34.56
末尾に \0 いれた分の領域を確保するのはダブルクォートで括った文字列で初期化したときだけだろ
0043デフォルトの名無しさん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};
これと同じ
0044デフォルトの名無しさん2011/09/01(木) 22:46:49.88
char s[] = {'H','e','l','l','o',',','w','o','r','l','d','\0','\0'};
これならいける
0045デフォルトの名無しさん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";
と同じ。
0046デフォルトの名無しさん2011/09/01(木) 22:57:05.71
>>41
コードをよく見る。sizeof(s)は11を返している。つまり、ナル文字分のサイズじゃない。
0047デフォルトの名無しさん2011/09/01(木) 22:57:50.54
>>45
同じじゃないよ。sのサイズを確認しる。
0048デフォルトの名無しさん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;
}
これを実行してみて
0049452011/09/01(木) 23:11:59.55
>>48
認識違ってた。スマソ、吊ってくるorz
0050デフォルトの名無しさん2011/09/01(木) 23:12:50.24
早くみんな死んでしまえ
0051332011/09/01(木) 23:17:58.00
で、結論でました?
0052デフォルトの名無しさん2011/09/01(木) 23:21:19.29
コンパイラがよしなに取りはからってくれた
それだけ
0053!jinjya2011/09/01(木) 23:26:53.57
>>33
バグだ!
0054デフォルトの名無しさん2011/09/01(木) 23:32:05.76
>>33
>>44のレスは試してみたの?
0055442011/09/01(木) 23:37:18.01
char s[13] = "Hello,world";
これでもいける
0056442011/09/01(木) 23:41:50.09
>>55
>char s[13] = "Hello,world";
>これでもいける

と思ったがローカル変数として初期化している場合どうなんだっけ?
間違えているかもしれん
0057デフォルトの名無しさん2011/09/01(木) 23:44:36.22
>>54
そうすれば正常に動くのはわかってます。質問はそんなことじゃありません。
0058デフォルトの名無しさん2011/09/01(木) 23:52:59.63
>>57
もう答え出てんじゃんw
0059デフォルトの名無しさん2011/09/01(木) 23:57:13.30
実験ではNULL終端されるらしい、ということは分かりますが、
それは言語仕様なのでしょうか?ということです。
0060デフォルトの名無しさん2011/09/02(金) 00:01:37.91
>>59
どこに目ぇつけてんだ
0061デフォルトの名無しさん2011/09/02(金) 00:04:05.26
たまたまNULL終端されたけど、それは、コンパイラの気まぐれじゃないのか?
0062デフォルトの名無しさん2011/09/02(金) 00:30:54.68
ていうか'\0'はNULであって、NULLじゃないし。
0063!jinjya2011/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か?という質問ならいいんじゃない。
0064デフォルトの名無しさん2011/09/02(金) 01:03:27.44
スタック上は(32Bit環境なら)4バイト単位で確保されるんだろうけどな。
0065デフォルトの名無しさん2011/09/02(金) 01:06:25.98
char a[256]={0};
これで0クリアさせてた。
やめた方がいいかな?
0066デフォルトの名無しさん2011/09/02(金) 01:10:25.02
>>65
(特殊な環境で)古いコンパイラを使うような場合にマズイかもしれない
0067デフォルトの名無しさん2011/09/02(金) 01:16:50.66
>>65
規格上は問題ない
0068デフォルトの名無しさん2011/09/02(金) 05:21:53.73
問題ないね
0069デフォルトの名無しさん2011/09/02(金) 05:24:01.58
NULLPO
0070 ◆QZaw55cn4c 2011/09/02(金) 06:31:09.55
>>65
昔は bzero() / memset() でクリアするのがお作法だったが(socket プログラミングね)、なるほどそういう手もあったのか。
0071デフォルトの名無しさん2011/09/02(金) 07:13:12.43
で、>>33 はどうなんだ
4byte 境界のおかげでたまたま '\0' が入ったのなら、
char s[] = {'H','e','l','l','o',',','w','o','r','l','d','!'}
これだと '\0' は入らない?
もちろんコンパイラに寄るのは承知の上で、>>33 のコンパイラだとどうなるのか気になる
0072332011/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 です。
0073デフォルトの名無しさん2011/09/02(金) 07:37:11.16
まだいてくれたか
解決して良かった
0074332011/09/02(金) 07:51:08.57
ttp://www.uproda.net/down/uproda354304.jpg
つまり、この本のこの記述はウソってことですね。
0075 ◆QZaw55cn4c 2011/09/02(金) 08:13:39.14
>>74
完全にまちがえてますなあ。書名・著者名を晒してください。
0076デフォルトの名無しさん2011/09/02(金) 08:16:15.35
それが言いたいがために
ねちねち粘ってたのかw
0077デフォルトの名無しさん2011/09/02(金) 08:44:39.89
そりゃ反例あがったのって >>72 で初だろw
まともな答えも出ずに見当違いのレスばっかり返ってきたらウズウズするだろうよ
0078デフォルトの名無しさん2011/09/02(金) 09:01:11.26
>33
上のソース、C machineで実行したら

[Hello,world゚](11)

となった。
0079デフォルトの名無しさん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

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

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

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

> coca cola 120
> coca cola 150

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

コード:http://codepad.org/zYHhnfJ5
0117デフォルトの名無しさん2011/09/03(土) 04:17:36.20
ttp://codepad.org/K6VP6pV0
0118デフォルトの名無しさん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;
}
誤字脱字が多いと思いますが脳内補正してください

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

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

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

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

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


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

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

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

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

処理
return; ⇒ 省略可
}

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

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

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

  処理

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

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

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

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

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

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

ゲーム用によく使われているスクリプト言語の方が良いんじゃね?
最近だったらPythonやLuaとか。
01611562011/09/04(日) 09:16:42.28
>>160
ありがとうございます。
授業で習ったことがあったのでCが一番楽だと思ったんですが、検討してみます。
0162デフォルトの名無しさん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パケット
0163デフォルトの名無しさん2011/09/04(日) 15:09:40.97
wincap?
0164デフォルトの名無しさん2011/09/04(日) 15:10:04.78
>>162
よく分からんので検索ワードだけ
パケットフィルタリング C言語
0165デフォルトの名無しさん2011/09/04(日) 15:13:52.10
一度、C言語を知ってしまうと、CGIとかを作るときにも、
他の言語を覚えなくても、C言語でやってしまえばいいと
思うんだけど、どうかな?
0166デフォルトの名無しさん2011/09/04(日) 15:18:58.73
全部ハードウェアで実現すればいいよ
0167デフォルトの名無しさん2011/09/04(日) 15:24:28.86
>>162

ttp://www.atmarkit.co.jp/fwin2k/win2ktips/450ipforw/ipforw.html
0168デフォルトの名無しさん2011/09/04(日) 15:46:36.36
>>165
文字解析なんぞは他の言語がうらやましくもある
0169デフォルトの名無しさん2011/09/04(日) 16:42:56.60
winsock2から生IPパケット吐ける様になったからIPだけなら直ぐに作れるんじゃないかな
0170デフォルトの名無しさん2011/09/04(日) 18:08:28.26
ヘリコプターで近所のコンビニにポテチを買いに行くぐらい無駄な行為
0171デフォルトの名無しさん2011/09/04(日) 18:25:09.05
>>170
アメリカだと、ありそうな話
0172デフォルトの名無しさん2011/09/04(日) 18:36:04.31
ねーよ
0173デフォルトの名無しさん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 *"のパラメータと互換性がありません。
01741732011/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 *"のパラメータと互換性がありません。
0175デフォルトの名無しさん2011/09/04(日) 19:23:24.86
ヘッダ内のstruct buttonとmain関数内のstruct buttonは別物なんでは
ヘッダの頭の辺りにstruct buttonの定義を書くといいと思う

よくわからないけど
0176デフォルトの名無しさん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);

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

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

//pbtn = &btn;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

とすると「初期化式が多すぎる」とエラーが出るのは何故なんでしょうか?
0316デフォルトの名無しさん2011/09/08(木) 12:09:32.51
>>315
括弧が足りないから
0317デフォルトの名無しさん2011/09/08(木) 12:09:37.58
Block が二次元配列じゃないからエラー
0318デフォルトの名無しさん2011/09/08(木) 12:14:19.16
おまいら、やさすぃなw
0319デフォルトの名無しさん2011/09/08(木) 12:20:09.06
構文構造を論理的過ぎるほど理解して書き始めたヤツでもないかぎり
誰でも一度は遭遇するミスだからチョット優しくなれるとおもう
0320デフォルトの名無しさん2011/09/08(木) 12:32:04.71
?? なんかカッコとかじゃなくて、おかしくないか?
0321デフォルトの名無しさん2011/09/08(木) 12:42:37.99
>>315
Block x =
{        //Block構造体の初期化
  {      //Block内の配列の初期化
    {1,2},  //Coord配列変数の初期化
    {3,4},
    {5,6}
  }
};
0322デフォルトの名無しさん2011/09/08(木) 12:55:21.80
>>318
まぁ、こういう分かり易いくらいに
馬鹿丸出し初心者のミスは答える方も楽だしw
0323デフォルトの名無しさん2011/09/08(木) 13:22:35.04
じぇんじぇんw
0324デフォルトの名無しさん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になるのも謎なんですけど
仕様と言われちゃうと仕方ないけど寂しいです
お願いします
0325デフォルトの名無しさん2011/09/08(木) 13:56:13.69
>>324
未定義です
鼻から悪魔が出ます
冒険の書が消えます
背が縮んで
彼女と別れて
宝くじをなくします
0326デフォルトの名無しさん2011/09/08(木) 14:02:31.99
>>325

>>324だけど
>未定義です //ソコを知りたい!
>鼻から悪魔が出ます //最近鼻血が止まりません
>冒険の書が消えます //外出してません
>背が縮んで //後2cm欲しい
>彼女と別れて //彼女なんて伝説だろ?
>宝くじをなくします //買ったこと無い
0327デフォルトの名無しさん2011/09/08(木) 14:07:13.41
>>324
http://oshiete1.watch.impress.co.jp/qa5168988.html
0328デフォルトの名無しさん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);
0329デフォルトの名無しさん2011/09/08(木) 14:14:03.59
>>324です
>>325,327さんありがとうございました
0330デフォルトの名無しさん2011/09/08(木) 14:18:21.72
>>328
おぅ
メチャクチャな数字が出てきたぞい
0331 忍法帖【Lv=40,xxxPT】 2011/09/08(木) 14:21:59.99
>>330
そりゃそうだ、パラメータが足りてない。
0332デフォルトの名無しさん2011/09/08(木) 14:22:40.62
数値を数字って言っちゃう男の人って・・・
0333デフォルトの名無しさん2011/09/08(木) 14:35:39.85
>Block x = {{1,2},{3,4},{5,6}};
Block x = {1,2, 3,4, 5,6};
こっちでも通るんだよな。
0334デフォルトの名無しさん2011/09/08(木) 14:36:46.37
>>331
コレが鼻から悪魔っすか?

>>332
すまん男だしオッサンだ
0335デフォルトの名無しさん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*/
0336デフォルトの名無しさん2011/09/08(木) 15:45:37.98
なんか怪しかったから
実際には動作させずに必死にどうなるか解析してしまった
0337デフォルトの名無しさん2011/09/08(木) 15:52:01.48
これ何やってんの?
0338デフォルトの名無しさん2011/09/08(木) 15:55:19.04
gcc -E でマクロを展開して読めば分かるさ
0339デフォルトの名無しさん2011/09/08(木) 16:06:45.42
マクロ展開してもまだすっと分かるレベルじゃないな
大体訳すとこんなことしてる
ttp://codepad.org/XhUt1Gjz
0340デフォルトの名無しさん2011/09/08(木) 16:16:14.49
obfuscated?
0341デフォルトの名無しさん2011/09/08(木) 16:33:50.17
プロジェクト管理してて不明瞭にされたって?
後で突っ込んでいいぞ。

struct {
unsigned char n;// 出力する回数 + 'Y'(0x59) (4 + 0x59 = ']'(0x5d))
char c; // 出力する文字 + ')'(0x29) ('?'(0x3f) + 0x29='h'(0x68))
// '?'文字を指定回数出力したら、次は改行する
];
0342デフォルトの名無しさん2011/09/08(木) 16:42:41.33
突っ込んでいいね
0343デフォルトの名無しさん2011/09/08(木) 16:48:10.41
いいね!
0344デフォルトの名無しさん2011/09/08(木) 19:52:26.05
プログラムで.jpgファイルをバイナリで開いて中身をコピーして
.jpg→.wavで新たなファイルを作り、
.wav→.jpgと再び同じ方法で戻したらファイルを開けなくなりました。
コピー先のメモリの容量も足りていたのにどこが問題なのでしょうか?
0345デフォルトの名無しさん2011/09/08(木) 19:56:19.36
書いたプログラムが間違ってるんだよ
0346デフォルトの名無しさん2011/09/08(木) 19:59:00.52
中の数値を配列に入れてファイルに出力したつもりなんですが
本来ならできるはずということで?
0347デフォルトの名無しさん2011/09/08(木) 19:59:29.44
diff取ってみればいいじゃん
0348デフォルトの名無しさん2011/09/08(木) 20:01:09.43
んるほど
0349デフォルトの名無しさん2011/09/08(木) 20:06:09.30
>>346
できるよ。ファイル読み書きの課題3ぐらいで出てきてもおかしくないレベル。
0350デフォルトの名無しさん2011/09/08(木) 20:39:26.56
>>344
windowsか?
バイナリで開いたのは読む側だけとかそういうことはないよな。
0351デフォルトの名無しさん2011/09/08(木) 20:50:50.88
>>334
コードを貼れ。
ttp://codepad.org
0352デフォルトの名無しさん2011/09/09(金) 02:07:58.94
諦めるな。一度諦めたらそれが習慣となる。
0353デフォルトの名無しさん2011/09/09(金) 23:36:40.93
void hoge(int n, void (*hage)(void)) { }
みたいに関数ポインタを引数に取る関数のプロトタイプは、
void hoge(int, void (*)(void));
みたいにしていいの?
0354デフォルトの名無しさん2011/09/09(金) 23:37:50.62
>>353
それでもいいけど typedef するのを勧める
0355デフォルトの名無しさん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の脚注にあるサイトにも上で引用したことと同じようなことが書いてあります.
そのサイトはソフトウェア開発会社のものなので,そうそう間違ったことは書かれないだろうと思います.
だから,本当に説明が間違っているのか自信が持てません.実行結果は上記の通りなのですが.
0356デフォルトの名無しさん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;
}
0357デフォルトの名無しさん2011/09/10(土) 02:44:22.64
>>355
WinVistaの cmd 上と、cygwin端末上で確認したけど、入力待ちにならなかった。
どんな端末で動かしてるの?
0358デフォルトの名無しさん2011/09/10(土) 03:22:44.32
>>356
はげはげうるせーんだボケ(泣
0359デフォルトの名無しさん2011/09/10(土) 03:27:25.05
>>358
やぁ はげ
0360デフォルトの名無しさん2011/09/10(土) 10:05:06.18
>>355
wikipediaに書いてあるのと違ってるからさっさと見なおしてこい
>>357
>>355のコピペで入力待ちにならなかったってのは改行がwin風だからだろうかね
0361デフォルトの名無しさん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;
}
0362デフォルトの名無しさん2011/09/10(土) 10:39:05.35
http://ideone.com/e4RD8
でちゃよ?
03633612011/09/10(土) 11:12:56.53
>>362
atoll通すとだめなんでしょうか?
0364デフォルトの名無しさん2011/09/10(土) 11:22:08.43
http://ideone.com/NEmzw
いんや特に無い
あとstdlib.h入れてリンクしてる?
0365デフォルトの名無しさん2011/09/10(土) 11:28:11.62
>>361
gcc 361.c -std=c99
03663612011/09/10(土) 12:44:55.77
>>364

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

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

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

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

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

0x46を受け取ったら、0xFにするような感じです。
0382デフォルトの名無しさん2011/09/11(日) 00:25:57.73
atoi()関数はどうだ?
0383デフォルトの名無しさん2011/09/11(日) 00:31:01.75
>>381
strtol() + sprintf()
0384デフォルトの名無しさん2011/09/11(日) 00:31:33.48
atoi()は10進数だったな。
0385デフォルトの名無しさん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;
}
0386デフォルトの名無しさん2011/09/11(日) 01:25:52.07
>>385
バッファオーバーフロー
0387デフォルトの名無しさん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;
}
0388デフォルトの名無しさん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;
}
0389デフォルトの名無しさん2011/09/11(日) 01:55:10.74
なんでポインタじゃないのにpなんだxだろ
0390デフォルトの名無しさん2011/09/11(日) 12:11:30.77
なんでインデント幅が2なんだろ?
0391デフォルトの名無しさん2011/09/11(日) 21:45:40.68
C言語って高校生でもできますか?また、習得したら何に使うのですか?
0392デフォルトの名無しさん2011/09/11(日) 21:50:44.28
受験勉強に時間を費やした方が良い
プログラミングなんかできても就職にも何にも役に立たない
0393デフォルトの名無しさん2011/09/11(日) 22:09:51.62
受験勉強としては語学と微積分と行列に集中することをお勧めします。
0394デフォルトの名無しさん2011/09/11(日) 22:55:18.63
>>391
自分は中学の時に独学で覚えたけど、作りたいものが無かったら、覚えても無意味だよ
0395デフォルトの名無しさん2011/09/11(日) 23:59:31.03
高校でアセンブラ独学で覚えた。
アセンブラよりCの方が簡単…かな?

>また、習得したら何に使うのですか?
「英語は何に使うのですか?」レベルの質問。
やりたい事に使え。
0396デフォルトの名無しさん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;
}
0397デフォルトの名無しさん2011/09/12(月) 01:12:07.40
CLR 以外
0398デフォルトの名無しさん2011/09/12(月) 01:51:39.39
>>396
それはC++じゃなくてC++/CLRという別の言語にさせられてる
なので、>>397のいうとおり、CLRを禁止する
0399デフォルトの名無しさん2011/09/12(月) 05:29:32.16
>>396
C++の話題はスレ違いだろ。
後、基礎的な勉強ならVCよりMinGWやCygwin導入した方が良いな。
0400デフォルトの名無しさん2011/09/12(月) 07:06:00.19
>>396
空のプロジェクトを選択
0401デフォルトの名無しさん2011/09/12(月) 11:30:38.32
なんでcallocで浮動小数点を確保しても0.0e0になるとは限らないんですか?
0402デフォルトの名無しさん2011/09/12(月) 12:55:00.80
>401
だいたい0.0になるから
0403デフォルトの名無しさん2011/09/12(月) 16:47:19.30
俺の環境でさっき試したらmalloocで確保しただけでvar==0.0e0になってた。
逆に気持ち悪い
0404デフォルトの名無しさん2011/09/12(月) 17:11:23.20
他のプロセスが残したデータが読めてしまうとセキュリティ上問題があるので、
OSからもらった直後はゼロでクリアする環境もある。
free/mallocを繰り返せばゼロ以外になるかも。
0405デフォルトの名無しさん2011/09/12(月) 20:53:06.99
オールビット0が浮動小数点数において0.0を示す事は規格で保証されてないよな
0406デフォルトの名無しさん2011/09/12(月) 21:37:40.53
IEEE754なら+0になると思うけど
それ以外の環境ってどんなのがあるの
04073962011/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 << "こんにちは世界";
}
-------------------------------
0408デフォルトの名無しさん2011/09/12(月) 21:46:16.78
Linux+vi+gccからやり直せ
0409デフォルトの名無しさん2011/09/12(月) 21:55:25.88
>>407
下手な事するな

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

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

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

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

テンプレート実装以前のC++しか知らないけど、coutって今でも現役なのか・・・(感涙
0411デフォルトの名無しさん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/
04123962011/09/12(月) 22:34:42.64
>>408
なんか、そのほうがいい気がしてきました・・
>>409
空プロジェクトに新規ソースを作ったのですが・・うまくいかないのです・・
>>410
おっしゃるとおり、iostreamのリンクが指定されていないのかもしれません。
というか、ライブラリのリンク先を指定する必要があるんですね・・
鬱です・・

>>411
ご迷惑おかけしました・・・C++はここではやはりだめでしょうか・・
0413 ◆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.ビルドメニュー⇒ソリューションのビルド
04143962011/09/12(月) 23:14:25.11
>>413
今からやってみます。
あと、ちなみにLinuxでビルドしてみましたら、Linuxではできました
Linuxではg++っていうコンパイラを入れないといけないんですね。
よく知らなかったので驚きました。また報告します
04153962011/09/12(月) 23:27:31.03
>>413
ありがとうございます。
はじめは言われたとおりにやってもだめだったのですが、
何度か行うと、ヘッダファイルが読み込まれて、うまくいくようになりました。
ただ、ビルドしたあとでデバッグを実行すると、一瞬黒いDOS窓が出て、
チラっとHelloWorldと出ただけですぐに消えてしまうのですが、これは仕方ないのでしょうか?
質問ばかりですみません・・・
0416デフォルトの名無しさん2011/09/12(月) 23:29:08.29
何回もやってると段々表示される時間が延びていくよ
04173962011/09/12(月) 23:29:19.90
みなさん、本当にありがとうございます。
また、すれ違いだったようですみません。
統合開発環境って以外と難しいんですね
0418デフォルトの名無しさん2011/09/12(月) 23:37:37.77
>>415

#include <iostream>
using namespace std;

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

こうしたら終わらない
0419 ◆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
0420デフォルトの名無しさん2011/09/13(火) 00:21:41.56
これからC言語を勉強したいので用意するものを教えてください
0421デフォルトの名無しさん2011/09/13(火) 00:26:51.02
>>420
K&R, ubuntu
04223552011/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.

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

char array[6] = "Apple";

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

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

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

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

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

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

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

でも謎が少し解けました。皆さんご助言感謝です!
0448デフォルトの名無しさん2011/09/13(火) 12:23:43.09
"箱群"と"部屋"の違いってなんですか?
04494282011/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)

という風に理解しました。
未だしっかり理解できてるか分からないのに、意味不な例えをして
すみません^^;
0450デフォルトの名無しさん2011/09/13(火) 12:48:24.62
ここで構造体を持ち出したらどれだけ混乱するだろうか…
0451デフォルトの名無しさん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);

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

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

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

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

printfから見ればどちらも同じという事?
0466デフォルトの名無しさん2011/09/13(火) 19:45:11.93
>>465
>>>463
>arrayで渡されるのは配列の最初の要素へのポインタ
Yes.
>&arrayで得られるのも配列の最初の要素へのポインタ
No.
>
>printfから見ればどちらも同じという事?
Yes.
0467デフォルトの名無しさん2011/09/13(火) 19:52:24.18
sizeof の値はどうなる? と地雷を置いてみる
0468デフォルトの名無しさん2011/09/13(火) 20:25:36.40
どちらもポインタだからsizeofをとっても同じじゃないの。
規格ではそういう想定をしてないとは思うけど
04694602011/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倍くらい速かった。
0470デフォルトの名無しさん2011/09/13(火) 20:34:20.66
>>468
array は配列だよ (>>428)
0471デフォルトの名無しさん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;
}
0472デフォルトの名無しさん2011/09/13(火) 20:50:52.44
>>468
例外(>>428)を除き、宣言時の型になる。
&arrayはそのままだったらポインタのサイズ
逆参照したら配列のサイズ
04734602011/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
04744602011/09/13(火) 21:10:23.99
なんで足し算なんてしてるんだ。意味がわからない。

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

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

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

>>480
乱数はC言語じゃないのか…むずかしい(・_;ノシ
0484デフォルトの名無しさん2011/09/13(火) 22:22:50.56
>>482
フリーソフトをダウンロードすると、操作フォームが必ずあるけど
(コマンドプロンプト入力ではユーザーの大半が使えないと思う)
あれはC言語以外で書いてるのかな?
0485デフォルトの名無しさん2011/09/13(火) 22:26:04.54
>>481
Cの標準ライブラリにはGUIがないので
なんらかの外部ライブラリが必要です
0486デフォルトの名無しさん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
0487デフォルトの名無しさん2011/09/13(火) 23:28:20.41
>>484
Windowsの話なら、APIを使えばCでも書けるけど割りと面倒。

>>483
例えばあんたは、不思議の国のアリスの言葉遊びについて英語の初心者板で質問するのか?
つまり、そういうことだ。
04884602011/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ってやれば作れるた
04894602011/09/14(水) 00:58:26.70
>>486
ありがとうございました今度やってみます

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

解析する技能持ってる人なら見た目の動作なら簡単に再現できるんじゃね?
04964282011/09/14(水) 09:07:37.29
>>456,463,471,477さん等々
レス付け足して頂いた方々ありがとうございますです!
コード上での配列名の取り扱いに関してたくさん誤解してる部分が
あったと認識できました。後"&"なども何も考えず使ってました・・・(;;
もっとデータ型とかポインタ、演算子の働き等をしっかり意識して勉強していこうと思います!
0497デフォルトの名無しさん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
0498デフォルトの名無しさん2011/09/14(水) 09:39:22.29
Borland の 2番目、アドレスのサイズが6バイトって、、、、、バグじゃん。
0499デフォルトの名無しさん2011/09/14(水) 09:54:16.76
明らかにバグだね。
試しにint[5]の配列作ってsizeofしたら20になってた。
__int64とかは4だったから、配列の時にだけ指してる先のサイズが返るみたい。
0500デフォルトの名無しさん2011/09/14(水) 10:20:48.22
Borlandはちょこちょこ変なとこあるよな
0501デフォルトの名無しさん2011/09/14(水) 10:24:19.57
VS2010, TinyC, DMCの3つのコンパイラで試した結果は全て
sizeof(&array)=4
だった。

旧Borlandだけ違う挙動をするのかな?
0502デフォルトの名無しさん2011/09/14(水) 11:23:52.03
Win32用ならありえんな。
DOS 16Bit用でそういうメモリーモデルあるのかな?
0503デフォルトの名無しさん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>
0504デフォルトの名無しさん2011/09/14(水) 12:07:43.74
C++Builder6とRAD Studio XE1では6になる。
やはりボーランド系実装特有の挙動か
0505デフォルトの名無しさん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... ]
0506デフォルトの名無しさん2011/09/14(水) 12:17:31.74
Cじゃなくなっちゃうけどtype_info.name() とったらどうなんだろ
0507デフォルトの名無しさん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

この辺りで変わった?
0508デフォルトの名無しさん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
0509デフォルトの名無しさん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
0510デフォルトの名無しさん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
0511デフォルトの名無しさん2011/09/14(水) 13:10:35.46
16ビットから32ビットへの移行期に挙動が変わってる感じだね。
Borlandのコンパイラの内部処理は10年以上同じで変わってないという話を聞いた事がある。

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

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

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

Borland系のコンパイラだけsizeof(&配列名)した時にsizeof(*(&配列名))になってしまうという事か?
0515デフォルトの名無しさん2011/09/14(水) 16:19:00.83
メモリ空間が4G
0516デフォルトの名無しさん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
0517デフォルトの名無しさん2011/09/14(水) 16:54:53.19
Borland C++ Compilerだけ明らかにおかしい。
0518デフォルトの名無しさん2011/09/14(水) 17:14:52.10
妙な結果
0519デフォルトの名無しさん2011/09/14(水) 17:16:38.73
つまり配列のアドレスは取らないほうがいいって結論でおk?
0520デフォルトの名無しさん2011/09/14(水) 17:18:50.30
>>517
なんでそんな結論になるんだ?
一致するコンパイラがないってことは実装依存ってことだから、
BCCだけおかしいというよりsizeofの結果に期待したコードは書かない方がいいってことじゃね
0521デフォルトの名無しさん2011/09/14(水) 17:22:39.57
>>520
BCCだけ一貫してないから。

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

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

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

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

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

p = &array;
0535デフォルトの名無しさん2011/09/14(水) 20:57:10.28
仕様書 チン☆⌒ 凵\(\・∀・) まだぁ?
0536デフォルトの名無しさん2011/09/14(水) 21:02:41.16
俺が仕様だ
0537デフォルトの名無しさん2011/09/14(水) 21:15:40.14
俺は仕様書にはなれない
0538デフォルトの名無しさん2011/09/14(水) 23:44:48.94
C言語では変数のスコープはローカルとグローバルだけ?
0539デフォルトの名無しさん2011/09/14(水) 23:50:47.64
>>538
グローバル、ファイル、関数、ブロック
0540デフォルトの名無しさん2011/09/14(水) 23:56:10.46
JISのPDFって、どっか落ちてない?落とせないんだけど
0541デフォルトの名無しさん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〜コンパイル時にエラーを吐きます。
どうすればコンパイルすることができるのでしょうか?
0542デフォルトの名無しさん2011/09/15(木) 00:02:28.12
>>540
OperaTorで落とせたよ
0543デフォルトの名無しさん2011/09/15(木) 00:22:31.87
extern
0544デフォルトの名無しさん2011/09/15(木) 00:23:20.68
>534
昔は警告で、エラーじゃなかったんだがな。
0545 忍法帖【Lv=40,xxxPT】 2011/09/15(木) 00:33:32.01
>>541
>543
0546デフォルトの名無しさん2011/09/15(木) 00:47:12.39
532 > 531
Cだとワーニングも出ないけど、
C++だとエラーになるってことだろ。
0547デフォルトの名無しさん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の方言かもしれないって最近気づいた。
もしかして構造体の方も方言ですか?(自信ない)
0548デフォルトの名無しさん2011/09/15(木) 00:51:41.01
>>546
C++だとエラーになるの?
0549デフォルトの名無しさん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とかになるんですかね?
0550デフォルトの名無しさん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

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

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

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

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

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

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

ソース内でのスコープは、構造体の定義なら、むしろソース内でならグローバル定義した方が便利なんじゃね?
関数内でローカルに定義するよりも。
0581デフォルトの名無しさん2011/09/16(金) 09:05:57.94
enumにしてもdefineにしても名前を付けることに意味があるのに即値でいいって…
0582デフォルトの名無しさん2011/09/16(金) 09:49:24.95
つまり、名前に意味がないなら即値でいいってことだな。
0583デフォルトの名無しさん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です。
0584デフォルトの名無しさん2011/09/16(金) 10:57:50.53
>>583
rは実数?
0585デフォルトの名無しさん2011/09/16(金) 11:10:57.09
>>584
ごめんなさい、書き忘れました
rはインデックスなのでintです
0586デフォルトの名無しさん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];
}
}
0587デフォルトの名無しさん2011/09/16(金) 12:11:13.99
ミスった
>>586 の bi は整数型に直しておいてね
0588デフォルトの名無しさん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)のときは、
符号が逆になるだけ。
0589デフォルトの名無しさん2011/09/16(金) 12:32:04.53
インデックス参照を減らすだけで、そんなに高速化するんですか?
0590デフォルトの名無しさん2011/09/16(金) 12:38:11.20
>>589
キャッシュのミスヒットが減るから
0591デフォルトの名無しさん2011/09/16(金) 13:11:32.54
iとj入れ替えてもrとbが同じだから
半分くらいは計算しなくていいってことじゃないのか
0592デフォルトの名無しさん2011/09/16(金) 13:12:46.79
あ、ループ条件見てなかったわすまん忘れてくれ
0593デフォルトの名無しさん2011/09/16(金) 13:15:18.53
rの取り得る範囲がさほど大きくないなら、sqrtを後回しにできるかもね
0594デフォルトの名無しさん2011/09/16(金) 13:38:18.26
マルチスレッドで計算するほうが速くなるほどには遅くないんだよね?
0595デフォルトの名無しさん2011/09/16(金) 16:12:49.97
>>583
回数がある程度分かっているんならアンロールすると効果的だぞ
条件分岐でキャッシュをフラッシュしてしまうバカCPUがまだ多い
分岐予測と投機実行は実際にベンチマークを取ってみればいいが
本当に遅いぞ
0596デフォルトの名無しさん2011/09/16(金) 16:21:15.10
ターゲットCPUとコンパイラとコンパイルオプションで変わってくる話だな
0597デフォルトの名無しさん2011/09/16(金) 17:00:08.82
ループを展開して10億回ほどベタ書きすれば高速になると思う
0598デフォルトの名無しさん2011/09/16(金) 18:01:04.95
そういうライブラリとかないの?OpenCLとか使ったことないけど
0599デフォルトの名無しさん2011/09/16(金) 18:02:49.94
ここはインラインアセンブラで
0600デフォルトの名無しさん2011/09/16(金) 18:11:37.71
クイックソートをするプログラムって2通りしかない気がするんですが
どうでしょうか?
非再帰、再帰でしょ。自分流のクイックソートとか可能なの
0601デフォルトの名無しさん2011/09/16(金) 20:34:01.26
コンパイルの最適化オプションだけで早くなるよ
0602デフォルトの名無しさん2011/09/16(金) 20:47:48.18
コンパイラのフロー解析はマジ神だと思う事があるな
あんなの人手で最適化してたらどれだけ時間がかかるかわからん
0603デフォルトの名無しさん2011/09/16(金) 20:54:35.37
inline関数て同じファイルに置かないといけないんですか?
別ファイルのinline関数を使うことはできますか?
0604デフォルトの名無しさん2011/09/16(金) 21:09:58.43
inlineってインライン展開してねって感じじゃなくてインライン展開してもいいよって感じだっけ
0605デフォルトの名無しさん2011/09/16(金) 21:13:46.51
>>603
コピペですむうちは、ベタ書きしてればいいんじゃねの
量が多くなってきたら、その時考えればいいような
0606デフォルトの名無しさん2011/09/16(金) 22:05:50.07
>>601
最適化オプションってなんですか?それってコードと関係ありますか?
Cygwin gcc ですが・・最適化ってどうやってやるんですか?
C言語を勉強してC言語マスター、C言語文法整理の達人と言われてますが
コンパイラとかよくわからないんですが・・・文法書にのってない・・・
>>602
フローチャートとかのフローですか?解析って何の解析ですか?
0607デフォルトの名無しさん2011/09/16(金) 22:12:39.17
最適化ってのはCPUへの命令の最適化だろ?
よーするに機械語とか、言語のアセンブリじゃん
どんな言語でも結局CPUへの命令列作ってるだけだから、
無駄なく無理なく機械語吐けるのが最適化された言語解釈器、つまりはコンパイラだよ
0608デフォルトの名無しさん2011/09/16(金) 22:14:04.15
いまはJITじゃなくてAOTのおはなししてるんです
0609デフォルトの名無しさん2011/09/16(金) 22:14:20.28
-O1とか-O2って分かるだろ

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

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

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

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

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

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

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

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

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

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

「移植性の高さ」な

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

だからパソコンのブレインであるCPUの機械語はCPUによって違うと
思うんですが、マザーボールの開発ってのはどうやってするんですか?
0621デフォルトの名無しさん2011/09/16(金) 22:56:07.96
プログラムの大先生(笑
0622デフォルトの名無しさん2011/09/16(金) 23:08:21.38
マザーボールって自作できるの?それが聞きたい。
機械語を理解してないとマザーボールは作れないんですか?
0623デフォルトの名無しさん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
がんばれば作れないことはないと思った
機械語の知識は不要ですね
0624デフォルトの名無しさん2011/09/16(金) 23:20:29.56
あすいません、マザーボールじゃなくてマザーボードでした。
マザーボード自作するにはどんな知識いりますか?
0625デフォルトの名無しさん2011/09/16(金) 23:27:18.44
とりあえず半田ごてが必要だな
0626デフォルトの名無しさん2011/09/16(金) 23:29:14.59
プリント基板の設計と製造方法、あと半田付け
0627デフォルトの名無しさん2011/09/16(金) 23:29:57.10
>>626
で機械語の知識いるでしょ?
0628デフォルトの名無しさん2011/09/16(金) 23:31:25.53
原始的なコンピュータ、ポケコンあたりのマザーボードを想定するなら
電気工学一般の知識が必要。
一人で自作できるのはおそらくポケコンのマザボあたりまでで、
それ以上のものとなれば高周波回路とか高度な電磁気学とかも必要になる。
はっきり言えば、今のレベルのマザボを一人で自作するのは無理。
0629デフォルトの名無しさん2011/09/16(金) 23:36:21.81
>>628
やっぱりか・・・

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

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

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

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

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


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

r^2でかなりの大きさになるので、sqrtをテーブル化するような方法も厳しいかと思います。
またsqrtの精度を下げて四則演算だけで行う方法も考えてみましたが、これも余計に時間がかかってしまいそうです。
0637デフォルトの名無しさん2011/09/17(土) 11:35:27.43
>>624
知識よりも常識とコミュ力とコネだな
しゅうかつがんばってください
0638デフォルトの名無しさん2011/09/17(土) 12:22:50.70
ところでこれ何の計算なんだ?
統計に見えるけど。
0639デフォルトの名無しさん2011/09/17(土) 12:35:08.81
機械語はナウマン式コンピューターだと全部一緒。
ソロバンや指を折って数えるやり方も同じ。
高級言語って い+ろ をAと、は+に をBと置きかえて
さらにA+Bを Δと置き換えてって繰り返してるだけだし
置き換え方式や細かいルールが違うからソースを変えないと動かないけど、やってることは一緒
0640デフォルトの名無しさん2011/09/17(土) 12:38:01.51
かっこつけてopaque型なんか使うんじゃねーよ紛らわしい!
0641デフォルトの名無しさん2011/09/17(土) 12:38:51.52
機械語はほぼアセンブラをひとづづつ置き換えただけじゃん
どう考えてもどれもが一緒なわけがない
0642デフォルトの名無しさん2011/09/17(土) 12:40:52.18
> ナウマン式コンピューター
だれか突っ込んでやれよ
デカくて巨大で手に負えないelephantな実装かよ
0643デフォルトの名無しさん2011/09/17(土) 12:50:17.97
爆釣だな
0644デフォルトの名無しさん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
0645デフォルトの名無しさん2011/09/17(土) 13:01:09.52
>>638
原子配置です、これを複数のデータついて比較することで内部構造がわかります
0646デフォルトの名無しさん2011/09/17(土) 16:13:24.30
> rの値は最大で200000くらい
ってただの配列のインデックスなんだよね?

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

おりこうさんなコンパイラなら纏めてくれるかもしれんけど
0654デフォルトの名無しさん2011/09/17(土) 21:57:53.13
>>651
いいよ、おれは
0655デフォルトの名無しさん2011/09/17(土) 23:48:34.82
CでDBMSのカーソルを利用できる環境って
なにがある?
0656デフォルトの名無しさん2011/09/17(土) 23:50:22.03
DBMS次第じゃないかな?
0657デフォルトの名無しさん2011/09/17(土) 23:57:43.02
今、win32apiを勉強してるんですが
linuxだとデバイスファイルというのでwin32apiよりは
簡潔にディスプレイへの描画等できるとききました。
例えば指定ピクセルの色を○○に変更とかも
簡素に実現可能なんでしょうか?
0658 忍法帖【Lv=40,xxxPT】 2011/09/17(土) 23:58:43.34
>>656
ライブラリ次第だろ。
0659デフォルトの名無しさん2011/09/17(土) 23:59:53.69
>>657
簡単だよ。端から塗り潰す位は。
0660デフォルトの名無しさん2011/09/18(日) 00:03:37.62
階乗を求める方法で再帰以外を探しています
目的は並列計算で円周率の計算をする課題があるのですが
再帰では並列化ができそうにないからです
再帰で並列化できる方法でも構いません
何かいいものはありませんか?
0661デフォルトの名無しさん2011/09/18(日) 00:04:30.93
>>659
もしよかったら何と言うデバイスファイルを利用するかだけでも
ヒントを頂きたいです
0662普通は、1からその数までの積と言う2011/09/18(日) 00:12:09.93
>>660
階乗を他人に説明することを考えて、
その通り実装すればいいよ。
0663デフォルトの名無しさん2011/09/18(日) 00:16:09.83
>>661
/dev/fb*
0664デフォルトの名無しさん2011/09/18(日) 00:17:16.13
>>663
ありがとうございます
さっそくトライしてみようと思います
0665デフォルトの名無しさん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
みたいに実装するということですかね?
0666デフォルトの名無しさん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[]を更新する時に排他制御とか必要になると思うけど。
0667デフォルトの名無しさん2011/09/18(日) 00:52:00.02
>>666
nは10000以上になりますね
すいませんまだはじめったばっかなので再帰とどう違うかわかりません
06686662011/09/18(日) 00:58:08.23
> 再帰とどう違うかわかりません
いや再帰だよw
0669デフォルトの名無しさん2011/09/18(日) 00:59:58.63
>>668
ですよねw
これは並列化が可能なんでしょうか?
0670デフォルトの名無しさん2011/09/18(日) 01:03:17.58
違うn!を計算する処理を並列で動かしたとき、配列のアクセスだけで済むようになるかな?って考えますた
0671デフォルトの名無しさん2011/09/18(日) 01:05:19.91
>>670
なるほどやっと理解しましたわ
ありがとうございます
0672デフォルトの名無しさん2011/09/18(日) 01:07:48.69
末尾再帰を除去した階乗の計算はメモ化するのが速いよな
並列化できるのか・・・?
0673デフォルトの名無しさん2011/09/18(日) 01:11:39.60
>>660
1)1から10000までの数字が入った、大きさ10000の配列を作る
2)その配列をシャッフルする
3)その配列をたとえば4等分して、小配列を四つ作る
4)小配列の数値をそれぞれ掛け算する(ここら辺が並列化)
5)求めた小配列の掛け算の値を、さらにまとめて掛け算する
0674デフォルトの名無しさん2011/09/18(日) 01:13:24.53
>>673
なるほど、そしたら負荷も分散してよさそうですね
ありがとうございます
0675デフォルトの名無しさん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個を統合する」みたいな無駄なことしそう
0676デフォルトの名無しさん2011/09/18(日) 01:14:24.03
n!が一つだけ欲しいのなら二分法で最大n/2-1並列、log2(n)回で求められるけど。
まぁ、並列にするのはそこじゃないだろ。
0677デフォルトの名無しさん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
0678デフォルトの名無しさん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

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

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

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

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

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

で動くのに

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

main()
{
...
}

で動くのに

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

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

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

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

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

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

USBを監視するにあたってどういう風な記述が必要かよくわかりません
お願いします
0742デフォルトの名無しさん2011/09/20(火) 01:31:53.61
http://msdn.microsoft.com/en-us/windows/hardware/gg487341.aspx
http://msdn.microsoft.com/en-us/library/ff540196.aspx
http://winusb.at.webry.info/200709/article_3.html
USBドライバの作成に関する資料を漁るほかないと思いますけど
0743デフォルトの名無しさん2011/09/20(火) 01:52:41.86
少なくとも入門編じゃあねーな
USB操るとかは上級者レヴェルだ
ちなみにUSBのチップはなんなんだよ
0744デフォルトの名無しさん2011/09/20(火) 01:55:08.50
WinUSB みたいな汎用ドライバを挟んだほうが楽そう
0745 ◆QZaw55cn4c 2011/09/20(火) 01:58:37.20
>>736
>おまえ、すこしは緩急のバランス考えて、たまには引くことも考えろよ…
たしかに。
でも、匿名掲示板にぐらいなら過激側にふって書いたほうが、いろいろと面白いでしょう?

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

>もっと人に物言う時の上手いやりかたとか、人との関わり方とか心とか、C言語以前にそういうこと学んだ方が…
そうしたほうがいいみたいですね。今マイブームの吉村昭とかじゃだめですか?
0746デフォルトの名無しさん2011/09/20(火) 02:32:53.16
いい年して、まともに日本語も理解できないアホにかまうなよ
0747デフォルトの名無しさん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
0748デフォルトの名無しさん2011/09/21(水) 18:25:53.28
–
0749デフォルトの名無しさん2011/09/21(水) 18:29:43.17
VCのCの規格って何?
0750 ◆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 で宣言されようとも)は一つのアドレスに結び付けられている、と思います。
0751デフォルトの名無しさん2011/09/21(水) 20:16:32.82
enumの名前が大域を汚しまくって困るのですが、名前空間的なハックはないものでしょうか。
0752デフォルトの名無しさん2011/09/21(水) 20:38:35.28
これでいいだろ

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

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

sscanf("5678","%3d",&val); // val=567
           ↑この3を可変にしたい
0762デフォルトの名無しさん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);
}
……
0763デフォルトの名無しさん2011/09/22(木) 17:30:56.74
始めから6dくらいにしといてそれに統一しとけよ
0764デフォルトの名無しさん2011/09/22(木) 17:39:12.31
>>762
えっ?
0765デフォルトの名無しさん2011/09/22(木) 17:41:37.69
>>762
1点目
valが10以上のときは常に最初にヒットしてしまう
2点目
なんでval使うん?
0766デフォルトの名無しさん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として多くのシステムが採用しているとされている。
0767デフォルトの名無しさん2011/09/22(木) 17:52:07.97
>>761
その文字列をsprintfで作るとかしないと無理じゃないかなぁ。
0768デフォルトの名無しさん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;
}
0769デフォルトの名無しさん2011/09/22(木) 19:52:20.93
>>768
char buf[len + 1];
Cだから、ここは変えないとというのはさておき、発想的には、それで>>761の要求を満たせるのかどうかかと
うしろ切っていいのっていう
0770デフォルトの名無しさん2011/09/22(木) 20:20:35.99
どういうことだ?
761の例でうしろ切ってるジャン
0771デフォルトの名無しさん2011/09/22(木) 20:24:05.34
>>770
printfみたいに、引数で文字数を渡したいんじゃない?
0772デフォルトの名無しさん2011/09/22(木) 20:43:37.92
if (lseek (STDIN_FILENO, 0, SEEK_CUR) >= 0
    && fflush (stdin) == 0)
{
  fseeko (stdin, 0, SEEK_CUR);
}

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

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

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

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

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

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

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

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

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

func(i, i);

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

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


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

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

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

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

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

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

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

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

っていうか、「Windowsだから」じゃねーし。
処理系とOSの区別もつかないバカ。
0830デフォルトの名無しさん2011/09/24(土) 02:57:16.04
longのサイズにも気おつけませう
0831デフォルトの名無しさん2011/09/24(土) 08:13:20.03
char , short , int ,long ,long long,__int64
0832デフォルトの名無しさん2011/09/24(土) 12:34:36.79
>>829
「Windowsだから」じゃなくて「WindowsはLLP64」ってあるだろ
何を当たり前のことを得意気に「処理系とOSの区別もつかないバカ(キリッ」だ
馬鹿かw
0833デフォルトの名無しさん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[][?]){

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

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

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

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

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

製作者ならhoge.cに

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

と書いても、他人は

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

と書くかもしれんし。

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

適切な順番でインクルードするのは使いたいCファイル側の責任だと思ってる
0854デフォルトの名無しさん2011/09/24(土) 21:55:42.33
>>850
そりゃ、h内でstdio.h使ってたら、hの中でincludeしないとだめでしょ。
0855デフォルトの名無しさん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
0856デフォルトの名無しさん2011/09/24(土) 22:01:21.16
>>846
hoge.hをインクルードする際に
どのライブラリに依存しているか把握する必要がなくなる。
<...>でインクルードするようなライブラリは
基本的に修正する事はないので
無駄なビルドが発生するというデメリットもない。

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

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

かな。
後者のパターンで、インクルードしないメリットって何かあるの?個人的な好み以外で
0860デフォルトの名無しさん2011/09/24(土) 23:20:09.39
FILE*の前方宣言てどうやるのクラスの前方宣言はやったことあるけど
0861デフォルトの名無しさん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
とかだね
まぁヤル馬鹿はいない
0862デフォルトの名無しさん2011/09/24(土) 23:28:30.18
VCでincludeする順番によっては誤作動するライブラリがあったような気がする。
順番間違わないように定番自作関数のヘッダファイルにinclude書いた記憶がある。
0863デフォルトの名無しさん2011/09/24(土) 23:36:59.59
>855
#ifndefだろ
0864デフォルトの名無しさん2011/09/24(土) 23:51:09.73
やばい
#if defined(A)
#elif defined(B)
だろとか言われそう
0865デフォルトの名無しさん2011/09/25(日) 00:19:01.23
>>863
ごめん、単純ミスです。

#ifndefが正しい。

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

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

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

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

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

FILEが使いたいならstdio.hをインクルードすべき。
ユーザプログラムでFILE構造体の中身が気になることは無いはず。
0867デフォルトの名無しさん2011/09/25(日) 00:25:25.02
>>866
stdio.hをインクルードすると分単位でコンパイル時間が延びるような貧弱な環境かもしれないだろ
0868デフォルトの名無しさん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__


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

最近知った言葉を使ってみたかっただけなんだろうけど
無理しないほうが恥かかないで済むよ。
0870デフォルトの名無しさん2011/09/25(日) 06:52:26.71
こういう話のかみ合わない人ってどこにでもいるよね
0871デフォルトの名無しさん2011/09/25(日) 07:14:52.41
キモいヤツ
0872デフォルトの名無しさん2011/09/25(日) 07:32:01.19
Cで効率化って
Pen4は窓から投げてコア2拾って来いよ
たぶんそこらへんに落ちてるw
0873デフォルトの名無しさん2011/09/25(日) 07:35:28.34
>>872
誤爆でしょうか
いいえ、誰でも
0874デフォルトの名無しさん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]={ , , , };」 ってできないの?
0875デフォルトの名無しさん2011/09/25(日) 09:48:15.23
時代は変わるwww
0876デフォルトの名無しさん2011/09/25(日) 09:52:31.54
int i,j;
0877デフォルトの名無しさん2011/09/25(日) 09:53:17.60
>>874
二重の配列に二重のループなんだから、入れるのは値一つで充分だろ。
0878デフォルトの名無しさん2011/09/25(日) 10:20:12.98
初期化ではなく代入や引数等で構造体のメンバを一括して与えるのは…



C90からできるんだっけ?
0879デフォルトの名無しさん2011/09/25(日) 10:22:18.67
fgetsで標準入力から読み込んでるんだけどこれより速いのない?
一行の長さがバラバラだからfreadが使えないし
0880デフォルトの名無しさん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);
    }
  }
}
0881デフォルトの名無しさん2011/09/25(日) 11:05:04.99
tag[i][j] = (_tag){1,1,1};
08828802011/09/25(日) 11:14:53.37
>>874 はコンパイラ/バージョン/コンパイルオプションに何使ってる?
0883デフォルトの名無しさん2011/09/25(日) 12:20:27.71
いやいや
どんなバージョンでも初期化には中括弧を使えるから
素人は死んでてください
0884デフォルトの名無しさん2011/09/25(日) 12:36:12.46
>>883
どうぞあなたの番です
0885デフォルトの名無しさん2011/09/25(日) 13:14:08.75
>>880
-ansi -pedantic
0886デフォルトの名無しさん2011/09/25(日) 13:38:28.13
gcc の -pedantic って、何故 "pedantic" なんだろう?

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

誰かその由来を教えてください。
0887デフォルトの名無しさん2011/09/25(日) 14:47:39.77
そんなこと気にする奴は衒学的なヤツだけだ
08888802011/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).
0889デフォルトの名無しさん2011/09/25(日) 15:48:08.43
>>861
FILE*でポインタだからそんなことする必要ないだろ。
0890デフォルトの名無しさん2011/09/25(日) 16:10:26.45
?
0891デフォルトの名無しさん2011/09/25(日) 16:37:34.65
FILE*でポインタかぁ
いみわからない
0892デフォルトの名無しさん2011/09/25(日) 16:40:59.09
FILEの前方参照の書き方賭けよ
0893デフォルトの名無しさん2011/09/25(日) 18:38:14.42
>>888
ANSIで制定されたのが1989年。ISOで制定されたのが1990年。
0894デフォルトの名無しさん2011/09/25(日) 19:54:57.95
>>886
当時訳分からん単語だと思って調べて、すんなり理解できた俺とはまるで逆なんだな
名か体のどっちかを勘違いしてんのか?
0895デフォルトの名無しさん2011/09/25(日) 19:59:50.85
規格の細かい記述を持ち出してきて延々難癖つけたり、
泥沼の議論をしたりするところをみてないとわからないんじゃないかな。
それこそ昔のfj.lang.cあたりを見てたら一発でわかると思うw
0896デフォルトの名無しさん2011/09/25(日) 20:09:40.58
>>894
いや、>>887 的な意味だろうとは思うのだが、
ちょっと皮肉が過ぎるかな、と。

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

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

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

>>879
とりあえず setvbuf() で、バッファサイズを大きくしておけ。
0905デフォルトの名無しさん2011/09/26(月) 00:09:22.59
>>879
あと、Windows 環境ならば、fopen() の時に
バイナリモードにするのもよいかも。
0906デフォルトの名無しさん2011/09/26(月) 00:42:26.50
>>904
それはマルチスレッドだと遅くなるという解釈でいいんだよな
0907デフォルトの名無しさん2011/09/26(月) 18:25:52.33
>>903
別人だけど移植性
0908デフォルトの名無しさん2011/09/26(月) 18:39:19.09
規格厨だけじゃないけど規格を重視しなければならない場面で使うよっていうのなら、
それこそ>>896に対する皮肉だよな
0909デフォルトの名無しさん2011/09/26(月) 20:07:47.69
Windowsの環境でS-JISのテキストファイルをUTF-8にして保存するにはどうすればいいでしょ?
0910デフォルトの名無しさん2011/09/26(月) 20:13:16.38
>>909
秀丸で保存する
0911デフォルトの名無しさん2011/09/26(月) 20:15:26.38
iconv -f Shift_JIS -t UTF-8 sjis.txt > utf-8.txt
0912デフォルトの名無しさん2011/09/26(月) 20:16:44.39
やることは簡単だ。
S-JISを2byteずつ読みこんでいって、それをUTFの該当のコードに照らし合わせりゃいい。
ただし、その簡単な変換表を作る作業はまぎれもなくクソ。
がんばってね。
0913デフォルトの名無しさん2011/09/26(月) 20:22:40.13
"汚れ仕事はPCにやらせる"が鉄則
0914デフォルトの名無しさん2011/09/26(月) 20:28:02.66
>>913
じゃあそのヨゴレ仕事の内実を是非とも今ここで教えてくれ
できればソーース付きで
0915デフォルトの名無しさん2011/09/26(月) 20:37:47.70
山ほどあるだろ汚れ仕事
ソースをコピペしてかさ増しするとか
0916デフォルトの名無しさん2011/09/26(月) 20:54:18.26
ソースの笠間市は難読化でやるなぁ
無駄部分をそれとなーく紛れ込ませたり
無意味な判定を紛れ込ませたり
何もしない大掛かりなループ挿入したり
0917デフォルトの名無しさん2011/09/26(月) 23:04:22.94
てめーのソースなんて誰も解読しねーよ
0918デフォルトの名無しさん2011/09/26(月) 23:46:04.31
そんなのカバレッジテストで一発で一掃されるだろ、普通。
0919デフォルトの名無しさん2011/09/27(火) 00:13:25.76
カバレッジテストツールほしい
0920デフォルトの名無しさん2011/09/27(火) 02:54:17.42
C99はどうして一向に流行らないの?いらない子なの?
0921デフォルトの名無しさん2011/09/27(火) 03:28:25.81
いらない子だよ
0922デフォルトの名無しさん2011/09/27(火) 15:09:02.10
>>920
毎日使ってるよ
0923デフォルトの名無しさん2011/09/27(火) 15:57:08.74
20年ぐらい遅れてる人が一杯いるから
0924デフォルトの名無しさん2011/09/27(火) 18:29:24.56
C99使うくらいならC++に行くだろ
0925デフォルトの名無しさん2011/09/27(火) 21:39:31.81
C2011はいつ出るの?
0926デフォルトの名無しさん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の上でやっています。
0927デフォルトの名無しさん2011/09/27(火) 23:52:34.01
>>926
fgetsしてsscanf
0928デフォルトの名無しさん2011/09/28(水) 00:15:24.62
組み込み系C言語で
関数の引数や戻り値、ローカル変数はすべてスタック領域に格納ですか?
それともコンパイラによっては汎用レジスタとかに格納とかもありますか?
0929デフォルトの名無しさん2011/09/28(水) 00:19:15.18
registerって使ったことねえな
0930デフォルトの名無しさん2011/09/28(水) 00:27:12.05
コンパイラによる
registerで明示的にレジスタ使う変数定義できたり
最適化すればコンパイラの判断でよく使う値や変数をレジスタに入れたままで使ったり

てかローカル変数も引数も何もしなくてもいくつかまではレジスタに入るものじゃなかったっけ
09319282011/09/28(水) 00:43:25.44
ありがとうございました。それを受けて追加で質問があります。
グローバル変数は品質や安全面を考慮するとあまり使わないほうがいいとよく聞きます。
でも、レジスタかスタックかわからないローカル変数よりも
グローバル変数を静的メモリ配置(できればアドレスも決めて)したほうが
コンパイラ依存も無く、どこのメモリに格納されているか把握できるので、
そっちのほうが安全かなと思ったんですがいかがでしょ?
0932デフォルトの名無しさん2011/09/28(水) 00:45:42.99
>>931
どうしてもその区別が必要なら volatile で修飾するといい
0933 ◆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
0934デフォルトの名無しさん2011/09/28(水) 00:51:37.09
RISCを触ってみた経験もない癖に見栄張るなやカス
0935 ◆QZaw55cn4c 2011/09/28(水) 00:57:55.60
>>934
学生実験で SPARC/Sun OS 4.1.1 を触っていたんですけどねえ。これって RISC じゃなかったんでしたっけ。
0936デフォルトの名無しさん2011/09/28(水) 00:59:44.62
学生時代・・・
0937デフォルトの名無しさん2011/09/28(水) 02:12:25.27
>>933
「デフォでレジスタだった」ら、どうなの。
すべてregister修飾すればいいと言ってるつもりはないんだろうけど、そう読める書き方はどうかとおもう。

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

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

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

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

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

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

分からない問題はここに書いてね360
http://kamome.2ch.net/test/read.cgi/math/1316096657/
0965デフォルトの名無しさん2011/09/28(水) 18:15:51.69
Exp. = 10 * Lv. * (Lv. - 1) (゚σ ゚)ホジホジ
0966デフォルトの名無しさん2011/09/28(水) 18:16:13.40
>>962 の方法が一番正確だと思う
0967デフォルトの名無しさん2011/09/28(水) 18:23:04.35
数学板いくほどのもんなのか?
0968デフォルトの名無しさん2011/09/28(水) 23:31:43.51
これから、webアプリが流行してくると、C言語の役割が変わってくるような感じが
しています。アプリ関係は他言語で、OSや組み込みレベルはCでっていうふうに
分かれていくような気がしてきませんか?
0969デフォルトの名無しさん2011/09/28(水) 23:36:40.38
もともと言語は目的があって作られております
0970デフォルトの名無しさん2011/09/28(水) 23:37:08.51
しない
0971デフォルトの名無しさん2011/09/28(水) 23:37:24.16
どうでもいいがな
それよりHTML5勉強しろよ
0972デフォルトの名無しさん2011/09/28(水) 23:41:50.29
今でもアプリをC言語でなんか書かないだろ
0973デフォルトの名無しさん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アプリはまだまだ未知数だよ
0974デフォルトの名無しさん2011/09/28(水) 23:44:30.71
クロームだけが頑張ってもな・・・
0975デフォルトの名無しさん2011/09/28(水) 23:45:26.93
いや他のブラウザも追従するだろ
特にFirefoxやOpera当たり
0976デフォルトの名無しさん2011/09/29(木) 01:48:47.87
>>975
operaはどうだろ・・・
あいつら「自分こそが正しい」の一点張りで、見れないサイトあっても
ガン無視決め込むからな・・・
0977デフォルトの名無しさん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];
}
0978デフォルトの名無しさん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;
}
0979デフォルトの名無しさん2011/09/29(木) 03:53:54.64
>>977
やってみたけど無理だった
0980デフォルトの名無しさん2011/09/29(木) 03:54:47.63
>>978
おいw
0981デフォルトの名無しさん2011/09/29(木) 07:22:56.66
>>980
なに?
0982デフォルトの名無しさん2011/09/29(木) 07:24:00.82
return (int)(value * t + 0.5) / (double)t;
0983デフォルトの名無しさん2011/09/29(木) 07:30:03.99
次スレ立てます
0984デフォルトの名無しさん2011/09/29(木) 07:31:13.42
次スレ立てました
C言語なら俺に聞け(入門編)Part 90
http://hibari.2ch.net/test/read.cgi/tech/1317249060/
0985デフォルトの名無しさん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];
}
0986デフォルトの名無しさん2011/09/29(木) 09:52:30.87
整数どうしの積に0.5加えた、元の方が早いよ
0987デフォルトの名無しさん2011/09/29(木) 10:31:50.34
どうも、>>926 ですが
>>948
私もそう思ったんですが... どうなんでしょうかね。標準入力に関して。

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

ということは scanf() も同じ挙動をした方がいいのかな、と思ったり...
0988デフォルトの名無しさん2011/09/29(木) 10:37:24.28
入力を閉じている(CtrlD)のに再度入力できるのが不自然だと思う。
標準入力をリダイレクトしてファイルから読んでいたら、そんな振る舞いはしないと思う。
0989デフォルトの名無しさん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を返しているんじゃないのかな。
0990デフォルトの名無しさん2011/09/29(木) 11:21:39.70
すごく素朴な疑問なんだけど
ポインタ変数の宣言をする時なんで皆「void *i」なの?
「void* i」の方がポインタ変数って分かりやすくね?
0991デフォルトの名無しさん2011/09/29(木) 11:37:10.10
>>990
void* i, j;
みたいに間違うから。
C++だとvoid*形式のが好まれてるけどね。
0992デフォルトの名無しさん2011/09/29(木) 11:46:34.69
次からは「void *i」って書く事にします。
0993デフォルトの名無しさん2011/09/29(木) 14:22:43.19
>>991
意味分かりません
0994デフォルトの名無しさん2011/09/29(木) 14:24:55.50
?
0995デフォルトの名無しさん2011/09/29(木) 15:03:50.20
>>993
void* i,j; だと void*という型に見えちゃうけど実際には
void *i,j; だということを認識しろという話だろボケ
0996デフォルトの名無しさん2011/09/29(木) 15:18:51.27
>C++だとvoid*形式のが好まれてるけどね。
こっちの話じゃね?
0997デフォルトの名無しさん2011/09/29(木) 15:24:50.07
もうね、書き方は宗教に近いからどうでもいいと思うよ。
俺は中間を取って void * p;
と真ん中に書く、どちらからも文句言わせんw
0998デフォルトの名無しさん2011/09/29(木) 15:26:57.35
>>997
どうでもいいと思うならわざわざ出てくるなよ。
0999デフォルトの名無しさん2011/09/29(木) 15:39:48.74
どうでもいいから中間にしたと言っているだろうが、文盲か
1000デフォルトの名無しさん2011/09/29(木) 15:41:15.73
1000ならプログラミング技術がチョットだけ向上
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。