よく、「C/C++」って表記見ますけど、区別ないんですか?
>>2 表記されてる本を読んでみるとわかると思うが、前半はC、後半はC++と、明確に別れてる
前スレでまともな答が来なかったからもう一度 脆弱性のある関数など実用的なプログラムで使うべきでない関数とか知りたいんだけど いいサイトない?もしくは本。
>>4 microsoft がセキュア版と称しているものの元になっている関数群
これ覚えれば、絶対みたいなのはないような
よく言われるのが、「gets()は使うな。fgets()を使え。」というもの。 バッファに読み込むサイズをしていできないgets()を使うと、バッファーオーバーランの危険性があると言われる。
mallocやcallocで確保したメモリをfree後は参照してはいけないけど freeした後に再度mallocやcallocでメモリを再確保するのもダメ? 例えば、繰り返し文の処理内や、関数呼出し毎に関数内で malloc->freeみたいな
いいけど?
初歩的な質問で申し訳ありません。 C言語は「シー言語」と読むのが正しいのでしょうか? それとも「スィー言語」でしょうか?
12 :
デフォルトの名無しさん :2011/09/01(木) 02:15:16.40
シー言語としか聞いたことが無いです
英語の発音記号では、Sea[siː]、She[ʃ iː]となります。[s]と[ʃ]の区別はとても重要です。日本人には難しい音ですが、英語ネイティブははっきりと音を区別しています。 日本人が発音すると、Sea[siː]と言っているつもりでも大体はShe[ʃ iː]と聞こえてしまいます。またアルファベットの“C”の発音はSea[siː]と同じですが、これも多くの日本人がShe[ʃ iː]と発音してしまっています。
どうちがうんだ?
ABCも読めんのか あーべせー
シーって言ってる奴が多いっていうしょうもないネタだろそのくらいも分からないのか
>>17
整数入力に対し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、〜
int F(int n) { n %= 8; return n ? n - 1 : n; }
#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; }
うわーやっぱりC++の入出力の書き方ってきもいわ int F(int n){ return (n+7)%8%7; }
C++でもprintf使用。
整数を入力といっているが負数の場合は何を返せばいいんだろうか
C++ならcout使わないともったいない(とあるCMのパクパク)
他のプログラムが使ってるメモリの中の変数参照したいんだけど、無理?
27 :
デフォルトの名無しさん :2011/09/01(木) 13:45:18.39
スィー言語なんて、言いにくいよ
test
セィー言語
c++ならconstだろう 21は何を意図してstaticなんだろう?
「c++なら」っていうのが意味不明
つかぬことを伺いますが、下のように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'の前まで出力していたように見えます。
勝手にそうするコンパイラもあるかも知れないけど、何が入るかは不定
c言語が一番強いの?
>>35 アセンブラほどじゃないにしても、GUI作るとかは、「成せばなる。千里の道も一歩から」って感じ
何でも(理論上)作れるけど、今や開発する規模が大きすぎて、高速化したい所だけCを使うとかが多い
>>33 領域破壊起こしてるじゃん。
char s[] = {'H','e','l','l','o',',','w','o','r','l','d'};
これはchar s[11];であることを定義してるから、s[11] は最低でも'\0'じゃなくちゃいけない。
なのにs[11]に'A'なんか突っ込んだらまずいっしょ。ナル文字なくなっちゃうんだから。
> s[11] は最低でも'\0'じゃなくちゃいけない。 char s[11];なら s[10] は最低でも'\0'じゃなくちゃいけない。
39 :
37 :2011/09/01(木) 22:19:08.09
>>38 指摘どもです。定義としてはchar s[12];だね。
だからs[11]は最低でも'\0'じゃなくちゃいけない。
>>33 の定義だと要素は11個しか用意してないから、
char s[11];
>>40 その考えが正しいなら、sにはナル文字が入らないことになる。
このパターンはコンパイラでナル文字までの領域を確保するJK。
末尾に \0 いれた分の領域を確保するのはダブルクォートで括った文字列で初期化したときだけだろ
>>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};
これと同じ
char s[] = {'H','e','l','l','o',',','w','o','r','l','d','\0','\0'}; これならいける
>>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";
と同じ。
>>41 コードをよく見る。sizeof(s)は11を返している。つまり、ナル文字分のサイズじゃない。
>>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;
}
これを実行してみて
49 :
45 :2011/09/01(木) 23:11:59.55
50 :
デフォルトの名無しさん :2011/09/01(木) 23:12:50.24
早くみんな死んでしまえ
51 :
33 :2011/09/01(木) 23:17:58.00
で、結論でました?
コンパイラがよしなに取りはからってくれた それだけ
55 :
44 :2011/09/01(木) 23:37:18.01
char s[13] = "Hello,world"; これでもいける
56 :
44 :2011/09/01(木) 23:41:50.09
>>55 >char s[13] = "Hello,world";
>これでもいける
と思ったがローカル変数として初期化している場合どうなんだっけ?
間違えているかもしれん
>>54 そうすれば正常に動くのはわかってます。質問はそんなことじゃありません。
実験ではNULL終端されるらしい、ということは分かりますが、 それは言語仕様なのでしょうか?ということです。
たまたまNULL終端されたけど、それは、コンパイラの気まぐれじゃないのか?
ていうか'\0'はNULであって、NULLじゃないし。
> char s[13] = "Hello,world"; 72 101 108 108 111 44 119 111 114 108 100 0 0 この最後の0は必ず0か?という質問ならいいんじゃない。
スタック上は(32Bit環境なら)4バイト単位で確保されるんだろうけどな。
char a[256]={0}; これで0クリアさせてた。 やめた方がいいかな?
>>65 (特殊な環境で)古いコンパイラを使うような場合にマズイかもしれない
68 :
デフォルトの名無しさん :2011/09/02(金) 05:21:53.73
問題ないね
NULLPO
>>65 昔は bzero() / memset() でクリアするのがお作法だったが(socket プログラミングね)、なるほどそういう手もあったのか。
で、
>>33 はどうなんだ
4byte 境界のおかげでたまたま '\0' が入ったのなら、
char s[] = {'H','e','l','l','o',',','w','o','r','l','d','!'}
これだと '\0' は入らない?
もちろんコンパイラに寄るのは承知の上で、
>>33 のコンパイラだとどうなるのか気になる
72 :
33 :2011/09/02(金) 07:25:03.23
#include <stdio.h> int main(void) { char s[] = {'H','e','l','l','o',',','w','o','r','l','d','!'}; printf("[%s](%d)\n", s, sizeof(s) ); return 0; } $ ./a.exe [Hello,world!?C$aD$a](12) '\0' 入らないみたいですね!ということは、「たまたま」と考えた方がいいということですね。 コンパイラは gcc 3.4.4 です。
まだいてくれたか 解決して良かった
74 :
33 :2011/09/02(金) 07:51:08.57
>>74 完全にまちがえてますなあ。書名・著者名を晒してください。
それが言いたいがために ねちねち粘ってたのかw
そりゃ反例あがったのって
>>72 で初だろw
まともな答えも出ずに見当違いのレスばっかり返ってきたらウズウズするだろうよ
>33 上のソース、C machineで実行したら [Hello,world゚](11) となった。
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
スタックが汚れていない
困った。QZが正しいことを言っている。
jpgの写真撮るのがそんなに手間か
変数への代入として += とか -= はよくみかけるんですが、ある書籍で |= というのがありました。パイプラインはターミナルでは使いますが、それとは別物のようで、調べても分かりません。どなたかヒントもらえますか?
AND OR の ビットor
a += b が a = a + b なのと同様に a |= b は a = a | b
入門書の一冊も持って無いのか
すいませんネットオンリーな情弱なので
ネットでいいと判断したなら自分で調べるようにしろよ C言語 演算子 とかで出てくるだろうよ
そんなに強く言わないで 別人なんだから
コンピュータ関連の書籍って、日本人の書いたものでまともなものってある? なんか、まともな本は全部アメリカ人の本の様な希ガス・・・
まともとまともじゃない基準を明確にせよ。 つか「コンピュータ関連の書籍って」範囲広すぎ。
(洋書読んでる俺カッケー)
日本語がまともに読めてないからそう感じるんじゃないの
同じ処理をさせるならWin32APIとかで作るGUIより普通にCUIの方がメモリも少なく動作も速い・・・ですよね?
C言語解説書もラ製もDOS/Vパワーレポートも「Android携帯に必須のアプリ紹介」って本もコンピュータ関連の書籍だわな。
Win32API使ったCUIもあるぞ。 GUIはウィンドウ関連のAPIを使ってるだけだし。
CでGUIソフト作る場合Win32API使うのがメジャーですか? 今時はやりのGUIライブラリとかないですか?
OpenGL
Qt
まてまて、ラ製ってまだ出てるのか?
なんでC言語のGUI開発でマウス操作で部品貼り付けられるのないんだよなめてるだろ
MFC+ダイアログベース HTML+CGIでもGUIじゃね?
MFCはC++
Cのお仕事って、メモリを意識しなきゃならない組み込み系か、 バッチ処理メインのバックオフィス系が主?他にある?
Win32API+C(非C++)の環境ってあるの? 関数のオーバーロードでエラー出そうだけど。
GUIって基本的にオブジェクト指向じゃないと書けないんじゃないの?
>>108 作法に則るならイベント駆動型で書きさえすればいい
作法無視(ゲーム等)ならポーリングすればいい
オブジェクト指向である必要は無いよ
111 :
デフォルトの名無しさん :2011/09/03(土) 01:18:18.21
構造体の値渡しをする際、どうやったら反映された結果を返すことができるのでしょうか…。 ポインタ使えば楽にできるのに、値渡しだと上手くいきません。
オブジェクト指向と親和性は高いけどね>GUI
まあSmalltalkが証明しているようなものか
GUIぺたぺたプログラミングで引数の自動生成を綺麗にまとめれば むしろオブジェクト言語は邪魔というかマ様への負担にしかならんと思う
116 :
デフォルトの名無しさん :2011/09/03(土) 04:03:46.00
118 :
デフォルトの名無しさん :2011/09/03(土) 13:40:01.33
ttp://www.nicovideo.jp/watch/nm6415611 この動画を見たのですが
プロトタイプ宣言のところでどうして
main関数のa,bにtasizan関数のx,yが代入されるのかわかりません・・
int main(void){
int a,b,add;
acanf("%d%d",&a,&b);
add=tasizan(a,b);
printf("add=%d\n",add);
return 0;
}
int tasizan(int x,int y){
int answer;
answer=x+y;
return answer;
}
誤字脱字が多いと思いますが脳内補正してください
動画見てないけど、a、bがx、yに代入されるけどその逆にはなってないぞ。
120 :
デフォルトの名無しさん :2011/09/03(土) 13:57:13.34
すみません間違いました main関数に書いてるadd=tasizan(a,b);でどうして addにanswerの値が代入されるのでしょうか
main関数とtasizan関数は別々だ。 add=tasizan(a,b); ここでtasizan関数を呼び出している。 tasizan関数はanswerを返す よってaddにanswerが代入される
>int tasizan(int x,int y){ 最初のところに int ってあるだろ、これは関数tasizanがint型の数値を返すという事を示している。 関数tasizan 内に return answer; ってあるだろ。これが返す値だ。
>121 >122 return answerでanswerという変数?をtasizan関数に代入するという意味でいいでしょうか? そしてどこかでtasizan関数を呼び出した?時にanswerを表示するでいいですか? あともうひとつだけmain関数は変数abの値をどこでtasizan関数に渡しているんでしょうか
>124 ありがとうございます 早速みてみます
>124 なるほど理解できました! >121 >122 みなさんありがとうございました
>>124 そこ、丁寧だなぁww しかし、わかんない人って、そこからわかんないんだな。
数学感覚で変数や関数を見てるのかねぇ。 関数は数値に置き換えられるモノだとか。
ポインタもアレだが構造体がワケワカラン
構造体の配列さっぱりです
>>129 ダメになっちゃうの?
>>130 間違いが書かれているから指摘したら、切れられた。
更に指摘したら、言い訳が掲載された。
読んだ人がダメになるかどうかは、読んだ人次第。
凄いなコイツw
数学出来る人は最初にアセンブラからやるべき というか地頭のいい人はプログラミング言語なんてやる必要ないでしょ マシン語とマクロアセンブラさえあれば他には何もいらん 阿呆が大きなコード管理出来ないから高級言語なんてもんに頼らなきゃいけないだけで 情報工学とかウンコだよね
お・・・おうww
数学出来る人は 筆算でやれよ
そんな理屈、オマイの脳内でしか通用しねーよ
アセンブラをやったからこそ親和性の高い高級言語が欲しくなる。 BASIC+アセンブラの不便さといったら…
>>131 解説サンクス
でダメになるってんで見に行ったんだけど
void func(void)
{
処理
if (条件) return; ⇒ 省略不可
処理
return; ⇒ 省略可
}
返り値も引数も無い関数の途中にreturnってあり得るの?
return 0; って記述すると停止するとか?
って自分で実行すれば良いのか
ちょっとやってみるか
関数途中で抜けるのにreturn普通につかわね?
GOSUB 〜 RETURN CALL 〜 RET
>129 間違いの箇所教えてくれ。
こういう内容が特に新しくもない焼き直しみたいなCの入門書って、なんで繰り返し出版されるんだろ。 それでも売れるのかな???
>>142 若者が騙されて入門して来るんだよ
毎年毎年
大学教授が書く→出版→受講者に売る。
×大学教授が書く→出版→受講者に売る。 ○大学教授が院生に書かせる→出版→受講者に売る。
>>131 このサイトの管理人が掲示板で切れたのを見たことないな。
へんなこと書いたんじゃないのか?
>>138 有り得る。
例えば引数のチェックでNGの場合とか。
void func(int nArg)
{
// 引数がNGの場合は処理を行わない
if (nArg < 0) {
return;
}
処理
return;
}
パラメータ無くてもexternな変数とか
>>138 だけど
答えてくれた方ありがとうございます
連投スマヌ グローバル変数を参照してれば途中で抜けるのもありなのかな?
void ret_test(void) { return; }
void TestMem(void) { char *Buf=(char *)malloc(1024*16); if(Buf==NULL) { return ; } ... }
毎回同じことをする固定処理で失敗しても呼び出し元に報告する必要がない処理
C言語の質問です。 今C言語の基礎を終わせ、DXライブラリを今から勉強してゲームを作りたいと思っています。 もし完成したらベクター等で配布しようと思っているんですが、 やはりCで書いたプログラムは環境が整ってないと起動することはできないのでしょうか? もし配布した後に起動できない、のようになったらちょっとまずいと思うんですが……
VisualC++でコンパイルしたならvc…….dllがないと動かないな
ごめんなさい、初心者すぎてわかりません。 そのvc…….dllというのは用意するのは簡単ですか?
>>152 うほっ!
ご指摘有難うございます。
再確認したらそうでしたね
あの単語が脳内で理解されるまで時間がかかってしまいました…
>>154 ,155が意味不明だけど
おいおい理解出来る様になりたいです
皆さん有難うございます
精進してきまする
>>156 個人でゲームを作るならCなんて選択はマゾ以外の何物でもないと思う。
ゲーム用によく使われているスクリプト言語の方が良いんじゃね?
最近だったらPythonやLuaとか。
161 :
156 :2011/09/04(日) 09:16:42.28
>>160 ありがとうございます。
授業で習ったことがあったのでCが一番楽だと思ったんですが、検討してみます。
162 :
デフォルトの名無しさん :2011/09/04(日) 15:02:26.06
CでもC++でもいいんですが NIC2枚差したWindowsPCをブリッジのような形にして、 指定したパケットだけ落とすプログラムって作成可能でしょうか? Linuxであればできますが、Windowsでの作り方が分からず困っています。 図 (NIC(1),NIC(2)をブリッジし、共に192.168.1.0ネットワーク) NIC(1) _____|____ |windowsPC| ×ここでHTTPパケットを落とす NIC(2)| | |↑HTTPパケット
wincap?
>>162 よく分からんので検索ワードだけ
パケットフィルタリング C言語
165 :
デフォルトの名無しさん :2011/09/04(日) 15:13:52.10
一度、C言語を知ってしまうと、CGIとかを作るときにも、 他の言語を覚えなくても、C言語でやってしまえばいいと 思うんだけど、どうかな?
全部ハードウェアで実現すればいいよ
>>165 文字解析なんぞは他の言語がうらやましくもある
winsock2から生IPパケット吐ける様になったからIPだけなら直ぐに作れるんじゃないかな
ヘリコプターで近所のコンビニにポテチを買いに行くぐらい無駄な行為
ねーよ
構造体の参照渡しが上手く出来ません。 ミスの指摘をお願い出来ますか 「ヘッダファイル内」 void cursor(struct button *btn); 「main関数内」 struct button{ int buttonX; int buttonY; }btn,*pbtn; void cursor(struct button pbtn); error:型"button *"の引数は型"button *"のパラメータと互換性がありません。
174 :
173 :2011/09/04(日) 19:14:05.82
172修正します 「ヘッダファイル内」 void cursor(struct button *btn); 「main関数内」 struct button{ int buttonX; int buttonY; }btn,*pbtn; pbtn = &btn; cursor(pbtn); error:型"button *"の引数は型"button *"のパラメータと互換性がありません。
ヘッダ内のstruct buttonとmain関数内のstruct buttonは別物なんでは ヘッダの頭の辺りにstruct buttonの定義を書くといいと思う よくわからないけど
「ヘッダファイル内」 typedef struct{ int buttonX; int buttonY; } button; void cursor(button *btn); 「main関数内」 button btn; button * pbtn; pbtn = &btn; cursor(pbtn); これじゃだめ?
もしかしてヘッダファイルの struct button *btn って int * にみなされちゃう系?
178 :
173 :2011/09/04(日) 19:36:34.09
>>175 ,176
アドバイスどうも有難うございました。今コンパイル通りました。
えーと、つまりヘッダファイルで関数宣言する前に構造体を書いてなかったからエラー出てた、ってことなんでしょうかね
pbtnって省略できるんじゃね? 因みにpbtnの役割ってなんなのかな? コードは書けば書くほどバグが入り込むから一文字でも少なく書かないと。 可読性を損なう時は多少長くてもしょうがないと思うけど。 「main関数内」 button btn; // button * pbtn; //pbtn = &btn; cursor(&btn);
180 :
デフォルトの名無しさん :2011/09/05(月) 00:29:23.39
>>168 文字の扱いはたしかにCは苦手っぽいね。
かといって、それだけのために他の言語を覚えるのは
結構かったるい感じだね
正規表現が標準で実装されてたら助かるんだけどな まぁテキストに対して複雑な処理をするなら当時だと awkでも使っとけってことだったのか
Cにしてみれば文字なんていうものはないんだよね charという型名のせいで勘違いしやすいけど
それは勘違いだとおもう
>>180 漢字とか扱うとCなんて使ってられない。
他の言語覚えた方がずっと近道。
ま、ライブラリに丸投げすれば一緒だけどな
186 :
デフォルトの名無しさん :2011/09/05(月) 08:12:08.96
尻から目が出た!
VCが変数名に漢字使えてわらた 使い道あるかは知らん
188 :
デフォルトの名無しさん :2011/09/05(月) 09:51:35.90
CでTDDしている人いますか? なにかツールを使っているなら、お勧めを教えてください
ソースコード読んでて関数の定義部分を確認したい場合に タグジャンプを使わずに一旦関数名でプロジェクトファイル全体をgrepして 関数定義の部分を目で確かめて表示させるやつってなんなのなんでタグジャンプ使わないの馬鹿なの
>>189 タグジャンプを知らないか慣れてないか信用できないのだろ。
「まだそんなツール使ってるの?情弱www」
193 :
デフォルトの名無しさん :2011/09/05(月) 17:56:23.46
C言語から移行しやすい、webアプリの言語ってどれなのでしょうか?
Perlええよ
問題がバレたら、試験にならんだろうが
198 :
デフォルトの名無しさん :2011/09/05(月) 18:28:03.15
C言語の参考書買って勉強しまくって、C言語の達人といわれる
おれだが
>>162 の質問が何をしてるのか全く分からない。
詳しい人教えて。NICってなに?Linuxってなに?
おまいら、このスレで暇つぶしすんな。
>>197 自閉症とアスペルガーの区別もつかん奴に
煽られてもなぁ・・・
Cの達人()
>>193 取り敢えず入りやすいのはPHPかな。
大抵のレンタルサーバで使えるし。
Perlがあがってるけど、あれはややこしくておすすめできない。
Cと違うところがたくさんありすぎる。
質問いいですか? 構造体のメンバ変数を全てファイル出力する場合 やはり1つ1つアクセスしてfprintなどで出力するしかないのでしょうか? 構造体などを引き渡すだけで一気に出力などをする方法などはないのでしょうか? 開発環境はVC++です。
ならsizeof分だけfwriteしてパディング分のゴミデータ出力してはまれよクズ
otfのヘッダーを読み出したいのですが、エンディアンがビックなので結局変数の変換が必要になってしまいます。 エンディアンの異なるデータを、構造体レベルで一気にコピーする簡単な方法はありませんか。記述量が少ないほど良いです。 (アライメントはgcc拡張で対応する前提です)
>>204 メンバにポインタが含まれていたらまじはまれる
それらを書くのがプログラマだろ 黙って打て
書き出しデータの先頭か、構造体にエンディアン情報の変数追加して 読み込み時にエンディアン変換かましたら?
保存するときは常にネットワークエンディアンで保存するようにすればいい
>>203 #progma
などでなんとかならないのなら、そしてコンパイラ依存をさけたいのなら、おっしゃるとおり、
「1つ1つアクセスしてfprintなどで出力する」
のが正解です。
C++だとこういう処理をクラス化するのが楽しいんだけどなぁ。
よかった、QZはやっぱり馬鹿だった。
>>211 そうそう。FileIntとかFileDoubleなんてクラスを作ったりしてね。
エンコーディングの問題はそいつらに任せられるから、
上の方の処理では意識することが少なくて済む。
って、Cで同じようなことをやってもいいけどトリッキーにしかならないからなぁ。
>>210 ×#progma
○#pragma
霧
文字列を8文字のブロックにわけて数値化する方法を探しているんだけど、 有名なやつとかある?
VCで作っててCベタ書きするなんて意味が無いと思うんだが…
頭がトリッキーだと逝ってるような
>>209 いやもう事情が許すかぎりテキストにして出力するのが一番かと。それがだめなら仕方ありませんが。
>>214 charポインタが指す内容をlong longで型キャストしてやりゃいいんじゃねぇの?
Base64 Base32 有名じゃなきゃって、意味わからん
じゃぁ、パンツが見えるかもしれない、スカートをどうしてはくんですか?
見られても良いパンツはいてるから もしくは、見えそうで見えない小悪魔的演出をしてるから。
今や、スカートの下に長パン?履く時代だよ
>214 >218 のようにポインタ使うか、サイズ決まってるならunion使うか。
コードも見んと会話が成立してるところが凄い
コード無いから検証する手間が省ける。
お花畑的な考え方だね
質問のレベルで答えのレベルも変わるだろ。 提供された範囲で答えるしか無いんだし。 具体的なコードが提示されれば又別だよ。
>>195 カゴ⇒自分⇒アン⇒箱の順に探すに決まってるだろ。
230 :
214 :2011/09/06(火) 05:53:50.02
>>218 >>219 >>224 説明不足ですまん。
RSAやってて
数値⇔文字列
の処理を暗号復号の前後にしなくちゃいけないからその方法を探してた。
まぁ、いろいろやってみるわ。
かってにやれば
232 :
214 :2011/09/06(火) 12:58:11.82
ごめんなさい。
もう次回からここのスレタイ C言語なら俺に聞かないでくれ(お断りします編)にした方がいいんじゃね?
入門前の人には質問の仕方から覚えてもらわないと
>>236 突っかかるみたいであれだけど、たくさんの場所で聞くこと自体は合理的な選択じゃね?
ただしローカルルールを理解しようとしない愚か者なわけだが
マルチポストは嫌われるって、知らんのかな。。。 結果的には適切なスレ見つけて、一箇所で聞いた方が教えてもらえるんだよ
>>238 皮肉を言ってるのはわかるがマルチやっちゃうような初心者質問者には伝わらねーよって言いたいわけ
マルチ、マルチうるせーな。わかんねーなら黙ってろ。
>>239 マルチポストがばれない限りはマルチポストのほうが回答がつく確率は高いという話だと思う
嫌われないなんてことは誰も書いてないかと
あ、マジレスすると、構造体Bの中の構造体Aの値を変えているところをなくせばいいよ
>マルチポストがばれない限りはマルチポストのほうが回答がつく確率は高いという話だと思う 実はそうでもない。 例えばこのスレ辺りにピンポイントで質問すれば、間がよければマルチポストするより早くレスがつく。
>>244 マルチ氏ねとレスをした人の行動を考える。
・質問を見る→2chおよびその他のサイトをみて、同じ質問があれば、マルチ氏ねとレスをする
・常に2chおよびその他のサイトを巡回しており、質問を見かけるが回答をせずに放置する
→同じ質問を見かける→マルチ氏ねとレスをする
・マルチポストをした上で、マルチ氏ねと自演をする
いずれにしても、マルチ氏ねとレスをした人は擁護されえない人物であろう。
似たようなスレには結局同じメンバーが集う。
>>246 マルチポストしてる人同様、答える側も関連スレ巡回してるのは当然だと思うんだが。。。
バレないって考える根性が嫌われるんじゃないかねぇ。。。
>>248 もしかするとマルチポストで、すでに回答がついているかもしれないから、回答せずに巡回をするってことだよね
つうか、専ブラで巡回するときに更新があったスレ全部開いてみるってやってる奴は少なくないだろ。 骨髄反射じゃなく、一通り見てレスするタイプなら気が付かない方がおかしいし、何度も見るとイラッとする。
必死杉。
マルチがなぜ悪いのか説得力のある説明が、これまで一つも上がっていない件について。 私?気が向いたらマルチの一つに答えています。 マルチに特に悪い感情はありません。というかマルチが嫌われる理由が想像できない。
>>251 イラっとする人が何度も何度もイラっとする事を経験してるんだから、見た瞬間に怒り爆発って気持ちは分からなくはない
こういう感情失禁って、前頭葉が弱い証拠なんだよな・・・
fgets と scanf を共存して使ってるコードを見た気分になれる
携帯通信量増大の原因のひとつだからww
流石にそれは無いな どっちかと言うと、似たようなスレを巡回してる人が多い故に、何度も同じ質問されてる感覚にイラっと来る人が多いって感じかね
>>252 まずは日本語ちゃんと理解できるようになろうな
stdlib.hでEXIT_FAILUREは1と定義されてますが、main関数で1がreturnされたとき、 OS側は何かするんですか?
OSは何もしない。ただ、そういう値をプログラムが返してきたということを、 呼び出し元のプログラムに伝えることはする。
では、正常終了したか不成功終了したかの値は(呼び出し元プログラムがわかっていれば)何でもいいってことですかね? まあ、慣例に従いますが。
263 :
デフォルトの名無しさん :2011/09/06(火) 21:42:57.62
あ〜疲れた
EXIT_SUCCESSはいいとしてEXIT_FAILUREは実用性ないな。
そんなことはない。
OSは大抵何もしないが、コマンドインタプリタはその限りではない。 例えば、EXIT_FAILUREに反応してアラートを上げるウィンドウシステムがかつてあった。
make は 0 以外を返されると中断して以降の処理を行わないとか
make && ./a.out とかよくやるもんね。
なにそれmakeに成功したら実行ってこと?
>>269 一行でコンパイル実行
失敗しても古いのを実行は、しない
>>265 成功は0だけど、エラーのリターン値はマイナスでエラーの種類ごとに
値が違うって感じの多いじゃん。
H8マイコンを使ってディップスイッチの状態を読み込んで7セグLEDを点灯させる プログラムを作る予定なんですが、参考になるサイト知りませんか?
>>274 そうです
ただ電気系なのでC言語は疎いです
ここで聞くよりはルネサススレとか組み込みスレとか秋月スレとかで聞く方がいいべ ソフトだけなら自力で調べればその程度はできるだろうが
>電気系なので は言い訳にならんでしょ ここで質問しても答えてくれる人はおらん気がするけど 回路図書くところからやらんとプログラムに行きつかんでしょ
逆コンパイルが怖いです。 、というか難読化して訳わからなくしてもそのままコピペ→コンパイルされたらお終わりなんじゃ?
そのままコピペ&コンパイルすると元のアプリ出てくるだけやん
腕なし自慢でもしたいのかね?
>>280 いや・・だからハッキリわかってるところだけチョコチョコっと変えてアルゴリズムとかはそのまま使えちゃうでしょ?
>>279 ローカルで動作するプログラムなら解読されるのは防げない
だけど解読のコストが高くなれば諦める可能性が高くなる
実行ファイルにしてしまえば変数名、関数名が消えるから難読化になってる
難読化ツールを使えば実行時に自己書き換えをするからもっと解読が面倒になる
>>277 ありがとうございます
そっちに行ってみます
GOTOだらけにしてグチャグチャにするってのは効果ありますかね?
難読化はド素人がやれば自然に出来ることなんだけど
解読されて困ることってあるの?
>>285 自分で作った実行ファイルを自分で解析してみればいいと思うよ
関数にstatic変数を幾つも用意し、呼び出す度に値を書き換える。 さらにその値に応じて、関数の動作そのものを変えてしまう。 その関数が200行程度あれば、解読したいと思う意欲は相当そがれる。
入力と出力がはっきりわかる奴は中身見ないでもコピーされちゃうよ
それはクローン と言うか、盗まれたく無いのはファイルフォーマットの場合の方が多いんじゃ無いのかな Officeとかadbe製品とか
IOCCC のはソースコードからして読めないw
仕込みみたいなのは読まれたくなよなあ 自分はやらんけど、変なこと
最近の実行ファイルは暗号化されてるんだっけ? まぁ実行時には複合化されるからクラックの手間増やすぐらいにしか役立たないみたいだけど。
おい 何と複合するんだ
.netのこと逝ってるんじゃあ
おれは今まで公開したソフトは全部ソース付きで3条項BSDかGPL2で公開してるよ。 これには利点が2つあって、 一つは、 コンパイル可能なソースコードをフル公開することにって、作者として信頼される。 変なウイルスやバックドアなどの仕掛けを仕組んでないことの証明になる。 exeやdllをパッと上げても、気味悪がって誰も使ってくれないのが普通。でもソース付きだとある程度信用して使ってもらえる。 もう一つは、 バグ修正や機能追加などの面倒な要望が来たときに、 「コードも公開してありますから、ご自由に改変してくれていいですよ(ニッコリ」と、自分が悪者にならずに断る口実にできるwww もう一つ、 ソースコードのバグを見つけて、修正パッチを送ってもらえる。 という利点もあるはずなんだが、自分はこのメリットにあずかったことは一度も無いわ。
めんどうだからライセンスなんて確認しない
「復号」だってことだろ
patchに仕込み入れた器用な奴がいたなあ バレたけどね
つーかド素人程やたらリバースエンジニアリングを怖がるよね。 Delphiユーザーとかに多い。
なんでこれで動くの? の方がかっこいいと思うけどね
svnで管理して一般人がコミットできるようにしてくれ
妙な仕込み入れる奴がいるから、やるにしても注意せんとね
Vectorとか見たら、エディタの正規表現置換の方がもっと柔軟な事が出来そうな処理でも堂々とシェアウェアにしてる人一杯いるよね。 ああいうのが難読化やらexepackerなんかを使うんだろうな。
正規表現って正しいかどうかすぐにわからんでしょ。試行錯誤、経験
検索してみたら正しいかどうか直ぐわかるじゃん
e-mailアドレスか判定する正規表現、あれ理解できる?
別に理解する必要ないだろ。
rfc準拠メアドの正規表現がややこしいのは、一般的な使用では絶対に使う事のないようなコメントの実装までしてるからだろ 面倒臭がらずに読んだら理解は出来るだろうよ。
それに、なんでわざわざマッチする文字パターンをhex表記にしてるんだろ。 それをエスケープさせて、わざとわかりにくくしているようにしか見えないw
構造体の宣言で #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; } とすると「初期化式が多すぎる」とエラーが出るのは何故なんでしょうか?
Block が二次元配列じゃないからエラー
おまいら、やさすぃなw
構文構造を論理的過ぎるほど理解して書き始めたヤツでもないかぎり 誰でも一度は遭遇するミスだからチョット優しくなれるとおもう
?? なんかカッコとかじゃなくて、おかしくないか?
>>315 Block x =
{ //Block構造体の初期化
{ //Block内の配列の初期化
{1,2}, //Coord配列変数の初期化
{3,4},
{5,6}
}
};
>>318 まぁ、こういう分かり易いくらいに
馬鹿丸出し初心者のミスは答える方も楽だしw
じぇんじぇんw
この流れなら質問できる! 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になるのも謎なんですけど 仕様と言われちゃうと仕方ないけど寂しいです お願いします
>>324 未定義です
鼻から悪魔が出ます
冒険の書が消えます
背が縮んで
彼女と別れて
宝くじをなくします
>>325 >>324 だけど
>未定義です //ソコを知りたい!
>鼻から悪魔が出ます //最近鼻血が止まりません
>冒険の書が消えます //外出してません
>背が縮んで //後2cm欲しい
>彼女と別れて //彼女なんて伝説だろ?
>宝くじをなくします //買ったこと無い
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);
>>328 おぅ
メチャクチャな数字が出てきたぞい
>>330 そりゃそうだ、パラメータが足りてない。
数値を数字って言っちゃう男の人って・・・
>Block x = {{1,2},{3,4},{5,6}}; Block x = {1,2, 3,4, 5,6}; こっちでも通るんだよな。
#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*/
なんか怪しかったから 実際には動作させずに必死にどうなるか解析してしまった
これ何やってんの?
gcc -E でマクロを展開して読めば分かるさ
obfuscated?
プロジェクト管理してて不明瞭にされたって? 後で突っ込んでいいぞ。 struct { unsigned char n;// 出力する回数 + 'Y'(0x59) (4 + 0x59 = ']'(0x5d)) char c; // 出力する文字 + ')'(0x29) ('?'(0x3f) + 0x29='h'(0x68)) // '?'文字を指定回数出力したら、次は改行する ];
342 :
デフォルトの名無しさん :2011/09/08(木) 16:42:41.33
突っ込んでいいね
いいね!
プログラムで.jpgファイルをバイナリで開いて中身をコピーして .jpg→.wavで新たなファイルを作り、 .wav→.jpgと再び同じ方法で戻したらファイルを開けなくなりました。 コピー先のメモリの容量も足りていたのにどこが問題なのでしょうか?
書いたプログラムが間違ってるんだよ
中の数値を配列に入れてファイルに出力したつもりなんですが 本来ならできるはずということで?
diff取ってみればいいじゃん
んるほど
>>346 できるよ。ファイル読み書きの課題3ぐらいで出てきてもおかしくないレベル。
>>344 windowsか?
バイナリで開いたのは読む側だけとかそういうことはないよな。
諦めるな。一度諦めたらそれが習慣となる。
void hoge(int n, void (*hage)(void)) { } みたいに関数ポインタを引数に取る関数のプロトタイプは、 void hoge(int, void (*)(void)); みたいにしていいの?
>>353 それでもいいけど typedef するのを勧める
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の脚注にあるサイトにも上で引用したことと同じようなことが書いてあります. そのサイトはソフトウェア開発会社のものなので,そうそう間違ったことは書かれないだろうと思います. だから,本当に説明が間違っているのか自信が持てません.実行結果は上記の通りなのですが.
>>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;
}
>>355 WinVistaの cmd 上と、cygwin端末上で確認したけど、入力待ちにならなかった。
どんな端末で動かしてるの?
>>355 wikipediaに書いてあるのと違ってるからさっさと見なおしてこい
>>357 >>355 のコピペで入力待ちにならなかったってのは改行がwin風だからだろうかね
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; }
363 :
361 :2011/09/10(土) 11:12:56.53
366 :
361 :2011/09/10(土) 12:44:55.77
>>364 stdlib.hインポートしたら出来ました。
ありがとうございました。
話が戻ってしまう上にスレチかもしれませんが やっぱりWin32APIの関数でも逆コンパイルとかアセンブルしたらすぐわかってしまうのでしょうか?
ちょっと何を心配しているのかわかりませんね
逆コンパイラ「こういう動きのパターンはGetMessageだな」 を心配してます
グローバルな関数名とかはモロわかりなのに何を言ってるんだい
です・・・よね・・(苦笑)
パクられて困るようなものを作ってるのかね?
>>372 当たり前だろ
ゴミしか作れない奴にはわからんだろうけどな
強気な割に質問のレベルが低すぎてお笑い状態
初心者ってスキルも無いのにそういうのにはご執心するじゃん。 ゴミみたいなゲームでも作ってベクターあたりに上げようかと思ってんじゃね? GPL違反発覚を誤魔化すために対策検討してるという事も考えられるが それにしては質問がお粗末すぎるし・・・
メッセージポンプなんて100人作っても大体同じだろ 逆コンパイラ使ってトリッキーなアルゴリズムの動きを見ようって奴もいるだろうけど、 そういうのってよりよい方法が文書で存在してるので正直逆コンパイル面倒ってなる あとデバッグ情報無いのに変数名とか分かるっけ?
dllとかに依存せんならわからんだろうけど
GetMessageを掠め取られて困るようなプログラムってなんだろうw シリアルコード認証あたりだろうけど、入門スレで聞くような題材じゃ無いよな。
これからは主導インライン展開の時代
外からhookされておしまいのような
381 :
デフォルトの名無しさん :2011/09/10(土) 23:48:07.85
アスキーコードで受け取ったものを16進数にする方法を教えてください 0x46を受け取ったら、0xFにするような感じです。
atoi()関数はどうだ?
>>381 strtol() + sprintf()
atoi()は10進数だったな。
#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; }
#include<stdio.h> #include<string.h> #include<ctype.h> int ascii2num(int ascii_code){ if(!isxdigit(ascii_code)) return -1; if(isdigit(ascii_code)) return ascii_code-'0'; return toupper(ascii_code)-'A'+10; } int main(void){ int x; x=0x46; printf("ascii2num(0x%02x)=%d\n", x, ascii2num(x)); x=0x66; printf("ascii2num(0x%02x)=%d\n", x, ascii2num(x)); x=0x10; printf("ascii2num(0x%02x)=%d\n", x, ascii2num(x)); return 0; }
388 :
デフォルトの名無しさん :2011/09/11(日) 01:37:33.57
>>381 #include <stdio.h>
int main(void){
char s;
printf("s = ");
s = getchar();
if (s >= 0x30 && s <= 0x39)
s -= 0x30;
if (s >= 0x41 && s <= 0x46)
s -= 0x37;
printf("%p¥n", s);
return 0;
}
なんでポインタじゃないのにpなんだxだろ
なんでインデント幅が2なんだろ?
C言語って高校生でもできますか?また、習得したら何に使うのですか?
受験勉強に時間を費やした方が良い プログラミングなんかできても就職にも何にも役に立たない
受験勉強としては語学と微積分と行列に集中することをお勧めします。
>>391 自分は中学の時に独学で覚えたけど、作りたいものが無かったら、覚えても無意味だよ
高校でアセンブラ独学で覚えた。 アセンブラよりCの方が簡単…かな? >また、習得したら何に使うのですか? 「英語は何に使うのですか?」レベルの質問。 やりたい事に使え。
396 :
デフォルトの名無しさん :2011/09/12(月) 00:59:49.79
VisualStudioの2010ExpressでC++の入門書を使って勉強しようとしています。 しかし、入門書では、コマンドプロンプトでコンパイルする方法で説明されていますが、 VSを使ってコマンドプロンプト方式で勉強する方法がわかりません。 Projectを作成する時にもCLRコンソールアプリケーションというのを選択すると ソースに以下のような表示が出てしまい、これで、コンソールに表示する状態になっている ようですが、本に書いてある内容と違います。 本には、以下のようなソースがかかれています ---------------------------- #include <iostream> using namespace std; cout << "こんにちは世界"; ------------------------------ VS2010には以下のようなソースが表示されてしまいます。 本のような表示で勉強するにはどうしたらいいのでしょうか? ------------------------------------ #include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); Console::WriteLine(L"Hello World"); return 0; }
CLR 以外
>>396 それはC++じゃなくてC++/CLRという別の言語にさせられてる
なので、
>>397 のいうとおり、CLRを禁止する
>>396 C++の話題はスレ違いだろ。
後、基礎的な勉強ならVCよりMinGWやCygwin導入した方が良いな。
なんでcallocで浮動小数点を確保しても0.0e0になるとは限らないんですか?
>401 だいたい0.0になるから
俺の環境でさっき試したらmalloocで確保しただけでvar==0.0e0になってた。 逆に気持ち悪い
他のプロセスが残したデータが読めてしまうとセキュリティ上問題があるので、 OSからもらった直後はゼロでクリアする環境もある。 free/mallocを繰り返せばゼロ以外になるかも。
オールビット0が浮動小数点数において0.0を示す事は規格で保証されてないよな
IEEE754なら+0になると思うけど それ以外の環境ってどんなのがあるの
407 :
396 :2011/09/12(月) 21:43:36.55
>>397 >>398 >>399 >>400 ありがとうございます。
指示通り空のプロジェクトを作ってみたのですが、
ファイルから、ソースコードを追加して、以下の
ようなコードを書いて、デバッグをしてみましたが、
「visual studio2010\Projects\test3\Debug\test.exeを開始できません。」
「指定されたファイルが見つかりません」
と表示されてエラーになります。
これはどうしたらいいのでしょう・・・
コマンドプロンプトみたいな形で勉強することはVSではできないのでしょうか?
-------------------------------
#include <iostream>
using namespace std;
int main()
{
cout << "こんにちは世界";
}
-------------------------------
Linux+vi+gccからやり直せ
>>407 下手な事するな
空のプロジェクトに新規ソースで作って打ち直せ
そしたら動くと思うから、そのソースを書き換えてまずは入門書の内容を進めろ
ツールの使い方は最低限に留めて、言語の学習に専念しろ
ツールの使い方は、入門書終わってからでも遅くない
(元々mfcや.net使うために複雑なんだから)
>>407 自分はlinuxでgccのみなので詳しくないですが、
VC++ってiostream使うときにライブラリーのリンク指定する必要があったような記憶。
テンプレート実装以前のC++しか知らないけど、coutって今でも現役なのか・・・(感涙
412 :
396 :2011/09/12(月) 22:34:42.64
>>408 なんか、そのほうがいい気がしてきました・・
>>409 空プロジェクトに新規ソースを作ったのですが・・うまくいかないのです・・
>>410 おっしゃるとおり、iostreamのリンクが指定されていないのかもしれません。
というか、ライブラリのリンク先を指定する必要があるんですね・・
鬱です・・
>>411 ご迷惑おかけしました・・・C++はここではやはりだめでしょうか・・
1.VSを起動する 2.ファイルメニュー⇒新規作成→プロジェクト 3.Visual C++→全般→空のプロジェクト プロジェクト名と場所を入れる <OK> プロジェクト名:test3 場所:...\visual studio2010\Projects 4.ソースファイル→右クリック⇒追加→新しい項目 5.コード→C++ファイル ファイル名を入れる <追加> ファイル名:test3.cpp #include <iostream> 6.ビルドメニュー⇒ソリューションのビルド
414 :
396 :2011/09/12(月) 23:14:25.11
>>413 今からやってみます。
あと、ちなみにLinuxでビルドしてみましたら、Linuxではできました
Linuxではg++っていうコンパイラを入れないといけないんですね。
よく知らなかったので驚きました。また報告します
415 :
396 :2011/09/12(月) 23:27:31.03
>>413 ありがとうございます。
はじめは言われたとおりにやってもだめだったのですが、
何度か行うと、ヘッダファイルが読み込まれて、うまくいくようになりました。
ただ、ビルドしたあとでデバッグを実行すると、一瞬黒いDOS窓が出て、
チラっとHelloWorldと出ただけですぐに消えてしまうのですが、これは仕方ないのでしょうか?
質問ばかりですみません・・・
何回もやってると段々表示される時間が延びていくよ
417 :
396 :2011/09/12(月) 23:29:19.90
みなさん、本当にありがとうございます。 また、すれ違いだったようですみません。 統合開発環境って以外と難しいんですね
>>415 #include <iostream>
using namespace std;
int main()
{
cout << "こんにちは世界";
while(1){}
}
こうしたら終わらない
これからC言語を勉強したいので用意するものを教えてください
422 :
355 :2011/09/13(火) 00:43:39.77
>>357 WindowsXPのコマンドプロンプトで、コンパイラがBorland c++ Compilerです。
>>360 改行はあまり関係ないみたいです。例えば次のプログラム
#include <stdio.h>
int main(void){
char a[8] = "A";
char b[8] = {'\0'};
char c = '\0';
sscanf(a, "%[B]%c", b, &c);
printf("b:%s.\n", b); /* 「b:.」と表示されるはず */
printf("c:%x.\n", c); /* 「c:0.」と表示されるはず */
return 0;
}
を実行すると、自分の環境では
b:.
c:41.
と出力されてしまいます。
423 :
396 :2011/09/13(火) 01:25:39.51
全裸になって四つん這いになって片足を上げてしーこっこしたらうまくいくよ
コマンドプロンプトからコンパイル、リンク、実行が、はやくできるといいね 統合開発環境は関係ないよ(ヘルプは便利かも) コマンドラインでやるには、 パスがとおってるか、そういう問題を解決するべき
>>423 なんでスレ違いだってわかっていながら延々話してんだ?
++だからでしょ
配列("array")のアドレスについてお聞かせください。 char array[6] = "Apple"; ここで、printf("%p")で表示すると"array"と"&array"とで表示されるアドレスが同じになります。 "array"と"&array[0]"で表示される値が同じなのはなんとなく理解できるのですが、 "array"と"&array"で表示される値が同じになる理由がよく理解できません。 この二つの表記ってプログラム上どっちを書いても全く同じになるのでしょうか? よろしくお願いします。
指した先の型は違っても、値が同じと言うだけのこと。
>>429 素早いレスどうもです。
ただ申し訳ないのですが、こちら側の力不足で未だに理解できませんです...orz
「指した先の型」とは、"array""&array"の指している先の型ということでしょうか?
"array"が指している先の型はchar型のアドレス(配列の先頭アドレス)だと思うのですが、
"&array"が指している先の型とは何になるのでしょうか?
すみませんがよろしくです。
>>430 ありがとうございます。
早速読ませていただきます!
サイズが6のchar型配列のアドレス
>>428 printf("%p", array)はarray配列のアドレスを出力
printf("%p", &array)はarray配列のアドレスを得てそれを出力
・・・同じ事だろ
>>434 別人だけど
結局の所、そうゆう仕様だよって覚えるしか無いんですよね
>>434 仕様でもなんでもなくて、単に同じ事をしてるだけじゃん
printf("%p", array + 1); printf("%p", &array + 1); をしてみればわかるかも
ついでに printf("%p¥n",*array+1);もね それとそれぞれの+1を取った場合も出力してみるといいかもって さっき紹介したページの受け売りだけどさ 多少理解出来たけど 何でそうなるのとか、この後どう使えばいいのかってのが全然浮かばない
C自体がメモリの扱い方にルールを決めた手法だから charは何を指し、printfは何を指すのか 説明書を見比べた方が早い
ここ教える側も初心者なんだなみんな無茶苦茶
だね。
飛び交う会話が間違ってると思い込もおうと努力する初心者
日本語でOK
常用漢字すら読めないとかVIPにお帰りください
446 :
428 :2011/09/13(火) 12:00:33.39
>>433-440 レス本当に感謝です!
色々調べてみた結果、自分が何で悩んでいたのかが分かった気がします。
自分の混乱の原因を説明すると
「配列とは変数(小さな箱)を格納する大きな箱で、変数とは別個に実体を持つ」
という風に考えていた点だと思います。
「別個に実体を持つ」と考えたのは、ポインタと同一視していた為だと思います。
〜次〜
447 :
428 :2011/09/13(火) 12:01:49.14
そして、"array"と"&array"に関して持ったイメージとしては、 「部屋に小さな箱が敷き詰めてあり、その一番先頭にある箱をAした場合、 この"箱群"の一番先頭にある箱のアドレス(array)は箱Aのアドレスであり、 この"部屋"の一番先頭にある箱のアドレス(&array)も箱Aのアドレスである。」 といった感じです。意味不かもしれません^^; でも謎が少し解けました。皆さんご助言感謝です!
"箱群"と"部屋"の違いってなんですか?
449 :
428 :2011/09/13(火) 12:42:24.64
>>448 箱群(array)
箱A == array
箱B == (array+1)
箱C == (array+2)
部屋(&array)
部屋Aの箱A == *(&array)
部屋Bの箱A == *(&array+1)
部屋Cの箱B == (*(&array+2)+1)
という風に理解しました。
未だしっかり理解できてるか分からないのに、意味不な例えをして
すみません^^;
ここで構造体を持ち出したらどれだけ混乱するだろうか…
// 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); こんなイメージであってますか
>>396 の云うコマンドプロンプトでコンパイルって
実はコンソールアプリケーションでDOSプロンプト画面にhollow worldって表示することだよな
コマンドプロンプトからVSのビルドをする方法を知りたいんだろう
>>447 ああ、うん、ぴっちりつまってるから、最初の箱のアドレスは部屋のアドレスと同じ。
ちなみに、 arrayは配列の要素の型に対するポインタを生むけれど、&array は配列型のポインタを生む。
それを実感することはしばらくないかもしれないけれど、
&array という記述は、それが必要になるまでしないほうがいいと思う。
arrayの型は (char *) &arrayの型は (char (*)[6]) いずれにしろ生成されるバイナリは一緒。
なんだかなぁ
>>452 基本的な事しか答えられないからって、スレ違いの質問に一生懸命答える必要は無い。
教える側も教えられる側もポインタの理解が今一つな事が混乱に拍車をかけてる感じがするな。
int型の掛け算を1億回するのと、float型の掛け算を1億回するのとでは、速度に差はありますか。どっちが速いですか
ポインタで悩むくらいなら こんにちはマイコンとシャープのポケコンと情報処理試験のテキスト買って勉強した方が早いよ
CPUの設計しだい。
>>428 配列のポインタ変換についてのルールは3つ。
@式中の配列名は配列の最初の要素へのポインタとして扱われる
A添え字は常にポインタへのオフセットと同じ
B関数の引数宣言中の配列名は配列の最初の要素へのポインタとして扱われる
>460 ためせばいいやん。 その程度のプログラム書けないなら考えない方がいい。
>>463 arrayで渡されるのは配列の最初の要素へのポインタ
&arrayで得られるのも配列の最初の要素へのポインタ
printfから見ればどちらも同じという事?
>>465 >
>>463 >arrayで渡されるのは配列の最初の要素へのポインタ
Yes.
>&arrayで得られるのも配列の最初の要素へのポインタ
No.
>
>printfから見ればどちらも同じという事?
Yes.
sizeof の値はどうなる? と地雷を置いてみる
どちらもポインタだからsizeofをとっても同じじゃないの。 規格ではそういう想定をしてないとは思うけど
469 :
460 :2011/09/13(火) 20:26:08.22
http://codepad.org/HAoFYvBq こんな結果だった gcc -O0
tasizan [2231050796]clock 1 4 9
kakezan [1190589036]clock 25.000000 36.000000 49.000000
掛け算の方が所要クロックが少なくて速かった。
掛け算のほうが2倍くらい速かった。
#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; }
>>468 例外(
>>428 )を除き、宣言時の型になる。
&arrayはそのままだったらポインタのサイズ
逆参照したら配列のサイズ
473 :
460 :2011/09/13(火) 20:55:47.74
http://codepad.org/MRYeahvW 足し算かとおもったら掛け算してた。なおした。
tasizan [1520466571]clock 2 4 6
kakezan [1150270199]clock 25.000000 36.000000 49.000000
やっぱり掛け算の方が速い。
足し算おせえーーーーーーーーーーwwwwwwwwwwwwwww
474 :
460 :2011/09/13(火) 21:10:23.99
なんで足し算なんてしてるんだ。意味がわからない。 話はかわって、乱数で、1か−1の乱数で、全部足していくと、できた波形がブラウンノイズになりますか。 とおもってやったら、なったけど、これは変だとおもった。 乱数があるていど周期的ってことだから乱数じゃないよ。っておもった。もし乱数だったら、すごく大きな風になったり、おおきなところで揺れ続けたりすることもあるはずだとおもったから。 そこで、すく乱数な乱数でも波がちゃんと範囲内に収まるように補正することが必要だとおもった。どうやればいいですか。
475 :
463 :2011/09/13(火) 21:33:01.87
なんか途中で送信してて、大事な部分が抜けてたorz 配列のポインタ変換についてのルールは3つ。 @式中の配列名は配列の最初の要素へのポインタとして扱われる A添え字は常にポインタへのオフセットと同じ B関数の引数宣言中の配列名は配列の最初の要素へのポインタとして扱われる @にも例外が3つある。後は全て配列の先頭要素へのポインタになる。 a. sizeofの対象になる (配列全体が対象) b. &演算子の対象となる (配列全体が対象) c. 初期化文字列 (char *)
"array" ・・・ @→配列の先頭へのポインタ (char) "array[0]" ・・・ @→配列の先頭へのポインタ (char) "&array" ・・・ a→配列そのものへのポインタ (char[6])
478 :
460 :2011/09/13(火) 21:54:11.18
>>476 スペルミスしてました
☓すく乱数
○すごく乱数です
Linuxのデバイスファイルの扱い方を解説してる サイトや参考書で良いのあったら教えてください
流れぶった切ってごめんなさい。 独学でVBA(Excel)使って書いたプログラムをCに書き直したいのだが、 なにかいい、本とかサイトとかあれば教えてほしい。 Cに関しては「C言語プログラミング能力認定試験」2級程度には理解した。 今引っかかってるのは、Formの作成。ボタンやらコンボボックスやらを配置したアレ。 よろしくおながいします。
CはうんこだからGUI操作でボタン貼り付けたりできないよ C#かJavaがいいんじゃね
483 :
460 :2011/09/13(火) 22:10:17.34
>>482 フリーソフトをダウンロードすると、操作フォームが必ずあるけど
(コマンドプロンプト入力ではユーザーの大半が使えないと思う)
あれはC言語以外で書いてるのかな?
>>481 Cの標準ライブラリにはGUIがないので
なんらかの外部ライブラリが必要です
>>484 Windowsの話なら、APIを使えばCでも書けるけど割りと面倒。
>>483 例えばあんたは、不思議の国のアリスの言葉遊びについて英語の初心者板で質問するのか?
つまり、そういうことだ。
488 :
460 :2011/09/14(水) 00:57:21.16
489 :
460 :2011/09/14(水) 00:58:26.70
>>486 ありがとうございました今度やってみます
>>487 不思議の国のアリス読んだこと無いです。ありがとうございます。こんど読んでみます。
ねま0す
うぜえ
うぜえついでにいうと、GTK+使うってことは逆アセされても文句言えないよ
初心者の作るプログラムを解析するほどみんな暇じゃないから心配しなくて良いw
初心者のほうが解析されることを嫌がるからじゃないかな
何で嫌がるんだろう 理解できん
解析されて困るのは暗号、プロテクトぐらいだろ。 解析する技能持ってる人なら見た目の動作なら簡単に再現できるんじゃね?
496 :
428 :2011/09/14(水) 09:07:37.29
>>456 ,463,471,477さん等々
レス付け足して頂いた方々ありがとうございますです!
コード上での配列名の取り扱いに関してたくさん誤解してる部分が
あったと認識できました。後"&"なども何も考えず使ってました・・・(;;
もっとデータ型とかポインタ、演算子の働き等をしっかり意識して勉強していこうと思います!
>>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
Borland の 2番目、アドレスのサイズが6バイトって、、、、、バグじゃん。
明らかにバグだね。 試しにint[5]の配列作ってsizeofしたら20になってた。 __int64とかは4だったから、配列の時にだけ指してる先のサイズが返るみたい。
Borlandはちょこちょこ変なとこあるよな
VS2010, TinyC, DMCの3つのコンパイラで試した結果は全て sizeof(&array)=4 だった。 旧Borlandだけ違う挙動をするのかな?
Win32用ならありえんな。 DOS 16Bit用でそういうメモリーモデルあるのかな?
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>
C++Builder6とRAD Studio XE1では6になる。 やはりボーランド系実装特有の挙動か
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... ]
Cじゃなくなっちゃうけどtype_info.name() とったらどうなんだろ
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 この辺りで変わった?
なんか面白いな 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
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
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
16ビットから32ビットへの移行期に挙動が変わってる感じだね。 Borlandのコンパイラの内部処理は10年以上同じで変わってないという話を聞いた事がある。 Cの仕様書ではどうなってんの? これだけバラバラだと実装依存かな。
そういう問題じゃない
アドレス幅20bitだもんな。
今Borland C++ Builder 6で試してみた。 __int64 i = 0; printf("%d\n", sizeof(&i)); としたら返ってきたのは4だった。 参照先のサイズが返るのは配列名の時だけみたい。 Borland系のコンパイラだけsizeof(&配列名)した時にsizeof(*(&配列名))になってしまうという事か?
メモリ空間が4G
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
Borland C++ Compilerだけ明らかにおかしい。
妙な結果
つまり配列のアドレスは取らないほうがいいって結論でおk?
>>517 なんでそんな結論になるんだ?
一致するコンパイラがないってことは実装依存ってことだから、
BCCだけおかしいというよりsizeofの結果に期待したコードは書かない方がいいってことじゃね
>>520 BCCだけ一貫してないから。
他のコンパイラはアドレッシングしてる先のサイズか、ポインタのサイズを返してるが
BCCだけは配列だけ違う挙動をしてる。
仕様読んだらBCCの方が正しい実装って気もしてきた ちょっと自信ないからエロイ人の解説待ち
=6 って、おかしくねえか
>>522 仕様書のsizeofの部分だけ書いてよ。
持ってないから見てみたい。
それとも何処かで見られるのかな?
仕様書ってどのCの仕様書?
char (*p)[6], array[6]; p = &array; で、右辺と左辺のサイズが違うとかw
Borland C++ 5.5.1 sizeof(&array)=6 sizeof(&array+1)=4
そもそもarray==&array[0]だよね? &arrayって何を指してるの?
arrayはarrayの先頭アドレス。&arrayは(array+0)のアドレス。
それは規格的には正しくないと思う
char array[6] だとして &array なんて書き方する? 普通は *array++ = とかだろ。 arrayだろ。 &arrayなんてコンパイル通さないでワーニングにしてくれた方がありがたいわ。
VC++だと char array[6]; char *p=&array; error C2440: '初期化中' : 'char (*)[6]' から 'char *' に変換できません。 ってなるな。 エラーレベルいじるか、キャストすれば通るんだろうけど。
>>532 当たり前だ。
もう一回ポインタ勉強し直してこい。
char (*p)[6];
char array[6];
p = &array;
仕様書 チン☆⌒ 凵\(\・∀・) まだぁ?
俺が仕様だ
俺は仕様書にはなれない
C言語では変数のスコープはローカルとグローバルだけ?
JISのPDFって、どっか落ちてない?落とせないんだけど
541 :
デフォルトの名無しさん :2011/09/14(水) 23:57:07.89
Main.c - Main.h - Rib.c - Rib.h - Cit.c といった具合にヘッダで参照していっているcとhのファイル群があるとします。 Main.cからRib.hをincludeし、Cit.cで定義されているグローバル変数を呼び出したいのですが、 undefined reference to〜コンパイル時にエラーを吐きます。 どうすればコンパイルすることができるのでしょうか?
extern
>534 昔は警告で、エラーじゃなかったんだがな。
532 > 531 Cだとワーニングも出ないけど、 C++だとエラーになるってことだろ。
#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の方言かもしれないって最近気づいた。 もしかして構造体の方も方言ですか?(自信ない)
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とかになるんですかね?
>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
コンパイラのエラーレベル設定でなんとでもなりそうだけど。
VCだと、エラーじゃなく警告がでる。 warning C4047: '初期化中' : 間接参照のレベルが 'char *' と 'char (*)[6]' で異なっています。 どっちにしろ、型宣言を正しくすれば、出ない。
553 :
デフォルトの名無しさん :2011/09/15(木) 06:30:03.87
お前らは今まで出したセグメンテーション違反の数を覚えてるかっちゅうことや
まったくの初心者には向かない本です
>>552 だから、Cなら警告、C++ならエラーだろ。
>>544 どっちみち型が合ってない事に変わりはない。
そういうことじゃないんだけどねぇ。
>char (*p)[6]; こういう配列の要素数固定のポインタ定義って使う場面ある? 自分はchar *でなんとかしちゃうけど。
スケジューラで幅24固定とか、幅7固定なんてのは容易に想像できるね。
>>559 固定フォーマットのテーブルを渡す時の引数とかに使うかな。
別に無くても書けるし、趣味の範囲じゃね?
f(size_t x){ // 引数1個でガラッと過程を変えたいときなんかに使うね、何も考えずに書き上げるとif文乱打になる static char s[10][6]={{…; char (:*p)[6]=&s[x];
C言語の勉強をひと通り終えたとこなんだけど、問題がさっぱり解けない・・・ 問題が解けるようになるには、どうしたらいい??
>564 他人のソースを読む。 そのソースを自分流に書き換えてみる。
勉強ってどんな勉強なのか、問題ってどんな問題なのか、 なにも示さずに質問できる神経を直せ。
568 :
デフォルトの名無しさん :2011/09/15(木) 18:14:39.06
やっぱ猫のやつが一番初心者にはお勧めなのか?
プログラミングの動機としては、 たとえば、WindowsのSORTコマンドは、フィールドではなく、文字番号でソートできる(/+n) やっぱり、フィールドでソートしたい場合がよくあるから不満だ。 そんな不満があったら、自作するしかないだろ
enumを文字列に変換するための文字列の配列ってよく作りますよね? あれってどこに定義してます? ヘッダかソースかいつも悩む
複数のソースから参照する必要があるならヘッダ、じゃなきゃソースでしょ、普通。
573 :
デフォルトの名無しさん :2011/09/15(木) 20:20:41.58
うん
宣言はヘッダに 定義はソースに だ
できるだけスコープは狭く。 特定の関数の中でしか使わないなら定義はその中でも。
>>575 >できるだけスコープは狭く。
これ言わんとするところはわかるんだけどさ、
究極に突き詰めると、即値になるよね。
>>575 その通りだけどさ、なら、なんでC++逝かないの?
>>576 そのリテラルがそこでしか利用されないなら即値で良いんじゃないの?
究極に突き詰めて考えちゃうひとって近寄りがたいわー
スコープは自然に書ける範囲でできるだけ狭く。ってことでしょ。 C++みたいなネーム空間が無いので、Cだとプリフィックスでそれと同じことをするから、 Cではなるべく、ソースの外にまでスコープを広げるのは節約した方がいいと思うわ。 ソース内でのスコープは、構造体の定義なら、むしろソース内でならグローバル定義した方が便利なんじゃね? 関数内でローカルに定義するよりも。
enumにしてもdefineにしても名前を付けることに意味があるのに即値でいいって…
つまり、名前に意味がないなら即値でいいってことだな。
質問です10億回ほどループを回すプログラムを更に高速化したいと考えています。 for(int i = 0; i < N; i++){ for( int j = i+1; j < N; j++){ r = sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) + (z[i]-z[j])*(z[i]-z[j]))+0.5; XY[r] += b[i]*b[j]; } } ボトルネックはここなのですが、ここを高速化する書き方はないでしょうか? x,y,zはdouble, bはintです。
>>584 ごめんなさい、書き忘れました
rはインデックスなのでintです
>>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];
}
}
ミスった
>>586 の bi は整数型に直しておいてね
>>583 x[i]-x[j]が
・x[n]-x[m] (i=n, j=m)のときと、
・x[m]-x[n] (i=m, j=n)のときは、
符号が逆になるだけ。
インデックス参照を減らすだけで、そんなに高速化するんですか?
iとj入れ替えてもrとbが同じだから 半分くらいは計算しなくていいってことじゃないのか
あ、ループ条件見てなかったわすまん忘れてくれ
rの取り得る範囲がさほど大きくないなら、sqrtを後回しにできるかもね
マルチスレッドで計算するほうが速くなるほどには遅くないんだよね?
>>583 回数がある程度分かっているんならアンロールすると効果的だぞ
条件分岐でキャッシュをフラッシュしてしまうバカCPUがまだ多い
分岐予測と投機実行は実際にベンチマークを取ってみればいいが
本当に遅いぞ
ターゲットCPUとコンパイラとコンパイルオプションで変わってくる話だな
ループを展開して10億回ほどベタ書きすれば高速になると思う
そういうライブラリとかないの?OpenCLとか使ったことないけど
ここはインラインアセンブラで
クイックソートをするプログラムって2通りしかない気がするんですが どうでしょうか? 非再帰、再帰でしょ。自分流のクイックソートとか可能なの
コンパイルの最適化オプションだけで早くなるよ
コンパイラのフロー解析はマジ神だと思う事があるな あんなの人手で最適化してたらどれだけ時間がかかるかわからん
inline関数て同じファイルに置かないといけないんですか? 別ファイルのinline関数を使うことはできますか?
inlineってインライン展開してねって感じじゃなくてインライン展開してもいいよって感じだっけ
>>603 コピペですむうちは、ベタ書きしてればいいんじゃねの
量が多くなってきたら、その時考えればいいような
606 :
デフォルトの名無しさん :2011/09/16(金) 22:05:50.07
>>601 最適化オプションってなんですか?それってコードと関係ありますか?
Cygwin gcc ですが・・最適化ってどうやってやるんですか?
C言語を勉強してC言語マスター、C言語文法整理の達人と言われてますが
コンパイラとかよくわからないんですが・・・文法書にのってない・・・
>>602 フローチャートとかのフローですか?解析って何の解析ですか?
最適化ってのはCPUへの命令の最適化だろ? よーするに機械語とか、言語のアセンブリじゃん どんな言語でも結局CPUへの命令列作ってるだけだから、 無駄なく無理なく機械語吐けるのが最適化された言語解釈器、つまりはコンパイラだよ
いまはJITじゃなくてAOTのおはなししてるんです
-O1とか-O2って分かるだろ gcc オプション でぐぐればいくらでも出てくる テキストも英文だけど付いてたはずだけどなあ フロー解析とはプログラムの実行過程をシミュレートしてCPUに都合の良いように 命令を並べ替えてしまう事 元のプログラムのフレーバーがすっかり消えてしまう場合もしばしば
C言語文法整理てC言語策定してる中の人でしたか・・
>>608 んじゃあAOTのおはなし聞かせてくれよ
612 :
デフォルトの名無しさん :2011/09/16(金) 22:24:22.33
>>610 いやforやらwhileやらprintfやら関数は何でもしってるって意味です・・・
コンパイラとか解析とかよくわからないです。自分はメモ帳で言語書いてる
だけなんで。
質問なんですが、機械語に法則性のある動きをしたものを、言語にまとめたのが
プログラミング言語ですよね?言語作るときは機械語を理解してないとだめなん
ですか?機械語はどんなCPUでも一緒ですよね?
機械語がどんなCPUでも一緒だったらどんなにラクなことか!!!!
・・・・ 機械語がどんなCPUでも同じわけないだろ x86は上位互換性はあるけどな(完全ではないけど) 機械語を知らなくても高速に実行できて開発期間も短縮出来、 バグも取りやすいようにしたのがプログラミング言語 もちろん機械語を知っていた方がクリティカルな部分を直接機械を 叩いて実行させなければならない場合もある(ドライバとか特にね)
あ、あと大事な事を忘れていた 「移植性の高さ」な C言語はその低レベルさにも関わらず移植性が高い だからLinuxがこれだけいろんなハードウェアで広まった
616 :
デフォルトの名無しさん :2011/09/16(金) 22:32:10.85
>>614 でもどんなパソコンにもC言語使えますよね?マザーボールの種類は
多様ですが機械語の法則性の共通の上でC言語って作られたってこと
でOKですか?
マザーボール?
察してやれよ
わざと言っているとしか思えないここまで来ると
620 :
デフォルトの名無しさん :2011/09/16(金) 22:54:54.25
機械語ってのはマザーボール上の半導体の配置方法のことでしょ? それをオブジェクトパッケージにしたのがマザーボールというパソ コンの部品になると思ってるんだが間違いですか? だからパソコンのブレインであるCPUの機械語はCPUによって違うと 思うんですが、マザーボールの開発ってのはどうやってするんですか?
プログラムの大先生(笑
622 :
デフォルトの名無しさん :2011/09/16(金) 23:08:21.38
マザーボールって自作できるの?それが聞きたい。 機械語を理解してないとマザーボールは作れないんですか?
624 :
デフォルトの名無しさん :2011/09/16(金) 23:20:29.56
あすいません、マザーボールじゃなくてマザーボードでした。 マザーボード自作するにはどんな知識いりますか?
とりあえず半田ごてが必要だな
プリント基板の設計と製造方法、あと半田付け
627 :
デフォルトの名無しさん :2011/09/16(金) 23:29:57.10
原始的なコンピュータ、ポケコンあたりのマザーボードを想定するなら 電気工学一般の知識が必要。 一人で自作できるのはおそらくポケコンのマザボあたりまでで、 それ以上のものとなれば高周波回路とか高度な電磁気学とかも必要になる。 はっきり言えば、今のレベルのマザボを一人で自作するのは無理。
629 :
デフォルトの名無しさん :2011/09/16(金) 23:36:21.81
>>628 やっぱりか・・・
所詮C言語なんてツールなんだよな・・・
俺は根源的なものがつくりたい・・
>>612 forもwhileも関数じゃないだろ。
自動車免許持ってても、車は作れないよね
原子でもいじってろ。>629
根源的、というなら形而上、形而下の話。 論理回路を形而上、実装を形而下というなら根源的なモノは論理回路の理論、すなわち数学のブール代数あたり。 とあるアルゴリズムと形而上、そのC言語での実装を形而下とするならやはり根源的なモノは数学になる。 理論と実装、その二つの形而上と形而下の組み合わさったモノである形も、 やはり現実世界においては根源というしかない。 だからこそ、根源を生成できるような人間は一握りの、数十年に一度の天才に限られている。 コンピュータの出来る以前にその限界を示したチューリングのように。
>>586 返答ありがとうございました
結論から言うと自分のPCとコンパイラでは逆に7%ほど遅くなりました
XY[r]を仮にXY[100]などに変えたところ速度が飛躍的に上がることは確認していたのでインデックスの参照に何か遅くする要因があるとは思っていましたが、おかげで理由がわかりました
参照を減らして、sqrt内の計算量も減らしても遅くなっているのでこれはコンパイラの設定の問題かと思います
ちなみにdouble bi~zij;の部分はループの外で行いました
>>595 回数はデータによって異なるので、一番回すのがこのくらいです。
MMXは後々インテルコンパイラでコンパイルするときに勝手にやってくれそうなので
いまはやるつもりはないです。
>>634 入門の域を超えているから仕切り直すなら最適化スレがお勧め。
rの値の範囲がどの辺りか判らんけど、誰かが書いていた通りsqrt()は省略できる可能性が高いね。
あと、メモリ空間との相談になるけどb[i]*b[j]を予め計算しておくとか。
>>635 ありがとうございます、そっちでも質問してみます
rの値は最大で200000くらいです、計算量が10億回なのに対して、
rの最大値がその程度なのでここで計算数を減らしています
r^2でかなりの大きさになるので、sqrtをテーブル化するような方法も厳しいかと思います。
またsqrtの精度を下げて四則演算だけで行う方法も考えてみましたが、これも余計に時間がかかってしまいそうです。
>>624 知識よりも常識とコミュ力とコネだな
しゅうかつがんばってください
ところでこれ何の計算なんだ? 統計に見えるけど。
機械語はナウマン式コンピューターだと全部一緒。 ソロバンや指を折って数えるやり方も同じ。 高級言語って い+ろ をAと、は+に をBと置きかえて さらにA+Bを Δと置き換えてって繰り返してるだけだし 置き換え方式や細かいルールが違うからソースを変えないと動かないけど、やってることは一緒
かっこつけてopaque型なんか使うんじゃねーよ紛らわしい!
機械語はほぼアセンブラをひとづづつ置き換えただけじゃん どう考えてもどれもが一緒なわけがない
> ナウマン式コンピューター だれか突っ込んでやれよ デカくて巨大で手に負えないelephantな実装かよ
爆釣だな
Naumann Neumann 最初の標本は明治時代初期に横須賀で発見され、ドイツのお雇い外国人ハインリッヒ・エドムント・ナウマン (Heinrich Edmund Naumann: 1854年-1927年)によって研究、報告された[2] ナウマンゾウ - Wikipedia ノイマン型の名は、最初にこれを広めたEDVACに関する報告書 First Draft of a Report on the EDVAC の著者がジョン・フォン・ノイマン(ひとり)になっていることに由来 ノイマン型(-がた、von Neumann architecture) ノイマン型 - Wikipedia
>>638 原子配置です、これを複数のデータついて比較することで内部構造がわかります
> rの値は最大で200000くらい ってただの配列のインデックスなんだよね? そもそも XY[] を XY[(x[i]-x[j])][(y[i]-y[j])][(z[i]-z[j])] の三次元配列にすれば委員で内科医?
>>647 おまえ稀に道に転がってる虫を見るような目で見られないか?
x,y,zって実数じゃなかったか
const staticな文字列の配列ならヘッダに書いてもいい? もはや実体じゃなくて定義扱いってことで
複数でインクルードしたとき、実体はどこにあることになる?
static なら各ソースに同じものの複製が散らばることになるんじゃね? おりこうさんなコンパイラなら纏めてくれるかもしれんけど
CでDBMSのカーソルを利用できる環境って なにがある?
DBMS次第じゃないかな?
今、win32apiを勉強してるんですが linuxだとデバイスファイルというのでwin32apiよりは 簡潔にディスプレイへの描画等できるとききました。 例えば指定ピクセルの色を○○に変更とかも 簡素に実現可能なんでしょうか?
660 :
デフォルトの名無しさん :2011/09/18(日) 00:03:37.62
階乗を求める方法で再帰以外を探しています 目的は並列計算で円周率の計算をする課題があるのですが 再帰では並列化ができそうにないからです 再帰で並列化できる方法でも構いません 何かいいものはありませんか?
>>659 もしよかったら何と言うデバイスファイルを利用するかだけでも
ヒントを頂きたいです
>>660 階乗を他人に説明することを考えて、
その通り実装すればいいよ。
>>663 ありがとうございます
さっそくトライしてみようと思います
665 :
デフォルトの名無しさん :2011/09/18(日) 00:19:09.48
>>662 n*(n-1)*(n-2)*(n-3)・・・*(n-(n-1))
という感じでやって
a = n*(n-1)
b = (n-2)*(n-3)
c = a*b
みたいに実装するということですかね?
>660 計算する階乗ってどれくらい? n=100位?として long ans[100+1]={0}; を利用。 long calc(int n){ if(ans[n]>0) return ans[n]; if(n==0) return ans[n]=1; return ans[n]=n*calc(n-1); } なんてのはどうかな? ans[]を更新する時に排他制御とか必要になると思うけど。
667 :
デフォルトの名無しさん :2011/09/18(日) 00:52:00.02
>>666 nは10000以上になりますね
すいませんまだはじめったばっかなので再帰とどう違うかわかりません
668 :
666 :2011/09/18(日) 00:58:08.23
> 再帰とどう違うかわかりません いや再帰だよw
669 :
デフォルトの名無しさん :2011/09/18(日) 00:59:58.63
>>668 ですよねw
これは並列化が可能なんでしょうか?
違うn!を計算する処理を並列で動かしたとき、配列のアクセスだけで済むようになるかな?って考えますた
>>670 なるほどやっと理解しましたわ
ありがとうございます
末尾再帰を除去した階乗の計算はメモ化するのが速いよな 並列化できるのか・・・?
>>660 1)1から10000までの数字が入った、大きさ10000の配列を作る
2)その配列をシャッフルする
3)その配列をたとえば4等分して、小配列を四つ作る
4)小配列の数値をそれぞれ掛け算する(ここら辺が並列化)
5)求めた小配列の掛け算の値を、さらにまとめて掛け算する
>>673 なるほど、そしたら負荷も分散してよさそうですね
ありがとうございます
n!の計算には(n-1)!の値が必要で,これはn=1から手続き的に求めることができる 乗算の計算量がO(1)とするとn!はO(n)で求まる 並列化して速くできるとすればO(log(n))とかO(n^1/k)とかにしなければならないんだけど 無理にスレッドなりMPIなり使って並列化しちゃうと,同期ポイントで時間食うか, 「N個の部分問題に分割してN個を統合する」みたいな無駄なことしそう
n!が一つだけ欲しいのなら二分法で最大n/2-1並列、log2(n)回で求められるけど。 まぁ、並列にするのはそこじゃないだろ。
スターリングの近似で、小数点以下 8 桁を超える精度らしい。 階乗計算するのに十分だろ。これならループも再帰をいらないよ。
>>679 目的は円周率を求めることなのに8桁精度でいいの?
うん
じゃ、暗唱の方が精度高いわwww
math.hにかいてある
>>680 階乗を、自然数から複素数に拡張したときの精度が、小数点以下8桁以上。整数部分は一致するだろう。
>>680 そのくらいの精度があればどこまでも求められるよ
>>686 しかし log の精度が足りなかった!
>>685 書き換えない同一データがいくつもあるのは無駄だよね?
extern つけとけ。
>>690 結論言うとそうなんだけど、
ヘッダをインクルードする方法に違いがない状態で、
コンパイラが生成したオブジェクトファイルの
どれに実体が入るか、指定する方法があるの?
もしかして、リンカでするの?あるなら、教えて
>>692 >const staticな文字列の配列ならヘッダに書いてもいい?
これから始まってる話なので、初期化が伴います。
>extern は正直いって使わない。本当に必要なんですか? 初心者は使う必要ない。初心者は。
>>694 extern を使うメリットは?そんなものあるのですかね?
外部で使ってることの目印になる
>>696 使う必要がない人は、使わなくてもいい。
複数ソースに分割しているときに、
共通設定をグローバル変数においているときは、
多分使いたいと思うだろう。
>>698 そういう時も、共通なグローバル変数の宣言だけをヘッダに書いて、
そのグローバル変数を使うモジュールだけがそのヘッダを読み込むようにすれば、特に extern はいらないのでは?
グローバル変数の初期化はちゃんとコードとして表現しなければならないのだけれども、むしろその方が好ましいと思います。
>>697 変数名に約束事をつけたほうが、まし。読みやすいし。
コラくちごたえするな!
>>699 非staticという意味で明示的にやってるだけ。
省略できる状況なのに
this->や::でアクセスするのと同じだよ。
プリプロセスで
extern
__declspec(dllexport)
__declspec(dllimport)
を切り替えるのなんてよくあることでしょ。
>>699 変数の*宣言だけ*するためには extern が必要だよ
変数名に約束事をつけるのは、 コーディングしている人間のためであって、言語仕様ではない。 一人で趣味として作るならともかく、チームでするときは 個人的な好き嫌いでプログラムは書いてはいけない。
それならチームでプログラムやるのがそもそも間違ってる
もはや子供のダダ。厨二でさえ無い。
main() { } で動くのに int main(void)
誤送信 main() { ... } で動くのに int main(void) { ... return 0: } と書く必要あるんですかー(棒)。
>>703 いや、初期化しなければ省略できる。仮定義は宣言ではない、というのであれば話は別ですが、それは字面の話。
実際の作業はリンカがする点ではなんらかわりない。
>>704 それはそのとおりだと思います。しかし、チームで作成するとき(経験はありませんが)を仮定しても、わざわざ extern を使う利点が想像しがたいのですが。
というか、extern を陽に記述することと、チームで作成することとになんらの相関を見出せないのですが。
extern を使うと、そのグローバル変数の帰属を決めなくてはなりませんが、たくさんモジュール分割すると、その作業で混乱しませんか?
ギャグってのは一度噛んだら終わりなんだよ
>>709 さすが無職の趣味プログラマが言う事は一味違いますなあ(笑)
他言語で作ったオブジェクトファイルをリンクする場合もexternいらないの?
extern = public static = private
>>711 具体的に論拠を示せないのですね。がんばってください。
>>712 どうなんでしょう?
コンパイルの生成物であるオブジェクトファイルにはグローバル変数のアドレスだけ載ってきますから、変数のサイズで両者に矛盾がなければ、extern つけなくても OK だという気がします。
masm には EXTERNDEF というディレクティブがありました。
C/C++両方使う立場の人として言うと extern無しの仮定義とかC++と互換性のない機能を使うのって面倒だからいや C++のサブセットの範囲内の機能しか使いたくない。
気にしたことは無いが errorno はどうなってるんだろ 元の 不変定数だけどそれが文字列の配列で(enum とペアで)一か所で定義運用したいという意図とは外れるだろうが
ソース上の関数名/変数名とコンパイル後(オブジェクトファイル内)の関数名/変数名(ラベル名?)って違うんだよね。 その名前の付け方の統一の為にexternが必要なんだよね。
externに親でも殺されたのか?
1つのソースに10万行とか書きたくないです
>>714 お前の書き込み時間見てりゃ馬鹿でも分かるって
平日の昼間から平気であれだけ多量の書き込みが会社から出来るわけねー
このスレの限りでは平日の昼間には来てないな
書いてる奴の仕事が何かは、ワリとどーでもいい
専ブラで残ってるキャッシュだけでQZの書き込み時間を調べたけど真夏は 夜中3時とか早朝4時、昼間の書き込みが多いな 最近は日曜日の書き込みが多く、平日は早朝か夜7時過ぎか夜中だ もしかして最近就職したのか?
この俺を差し置いて就職とな
一応祭日だよな?
今日の話をしてんじゃねーよ
>>719 10万行のソース書くのは御免こうむりたい。
どうしてもなら、プログラム書いて自動生成。
規格的には仮定義は1つの翻訳内だけで複数翻訳間に関しての動作は未定義ではないの?
しかしまだ無職なのに書きこむ時間を自己抑制してるとしたらさぞかし辛い 事でしょうなあ〜
夏は夜勤だったのかも知れないだろ
いや書き込み時間帯は見事にバラバラ 3交代かねえw で、QZは自分のPCのCPU-Zのスクリーンショット晒しはまだ?
荒れてるな
肌荒れにはマルチビタミンだろ
肌研の化粧水まじやばい
>>714 おまえ、すこしは緩急のバランス考えて、たまには引くことも考えろよ…
延々と押しばっかりだから、正誤関係なく嫌われるんだっつーの…
もっと人に物言う時の上手いやりかたとか、人との関わり方とか心とか、C言語以前にそういうこと学んだ方が…
>>736 言っても無駄でしょう
こいつは重度の人格障害で中年ニートですから
キチガイに何言っても無駄だろ
おしり拭く姿ってマヌケだよな
ここもID表示にすればいい
マイコンからある信号を送り出しPCのUSBからその信号を受け取るんですが、 PC側でその信号が来た時にいろいろ処理がしたいと思っています USBを監視するにあたってどういう風な記述が必要かよくわかりません お願いします
少なくとも入門編じゃあねーな USB操るとかは上級者レヴェルだ ちなみにUSBのチップはなんなんだよ
WinUSB みたいな汎用ドライバを挟んだほうが楽そう
>>736 >おまえ、すこしは緩急のバランス考えて、たまには引くことも考えろよ…
たしかに。
でも、匿名掲示板にぐらいなら過激側にふって書いたほうが、いろいろと面白いでしょう?
>延々と押しばっかりだから、正誤関係なく嫌われるんだっつーの…
そっかなあ?素直に誤りを認めるときには認めているつもりなんですが。先日のバッファーオーバーランのときとか。
>もっと人に物言う時の上手いやりかたとか、人との関わり方とか心とか、C言語以前にそういうこと学んだ方が…
そうしたほうがいいみたいですね。今マイブームの吉村昭とかじゃだめですか?
いい年して、まともに日本語も理解できないアホにかまうなよ
>>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
–
VCのCの規格って何?
>>747 判じ物の様相を呈してきていますが、
ISO/IEC 9899:1999 6.2.2.2
In the set of translation units and libraries that constitutes an entire program, each
declaration of a particular identifier with external linkage denotes the same object or
function. (後略)
とある以上、external linkage に属する識別子(それがISO/IEC 9899:1999 6.9.2.2
>>747 の tentative
definition で宣言されようとも)は一つのアドレスに結び付けられている、と思います。
751 :
デフォルトの名無しさん :2011/09/21(水) 20:16:32.82
enumの名前が大域を汚しまくって困るのですが、名前空間的なハックはないものでしょうか。
これでいいだろ typedef enum Hoge { Hoge_hoge, Hoge_foo, Hoge_bar } Hoge;
ふぎゃーふぎゃー
ホゲーホゲー
CってまだK&Rがバイブルとか呼ばれてんの?
少なくとも俺はそう思ってる 「過去を知らずして未来を語ることは出来ない」 by σ(゚∀゚ )オレ
リレー回路でもいじってな
>>750 それは(定義でなく)宣言についてでしょ?
definitionもしくはtentative definitionが複数翻訳にまたがって1つにまとめられるかの文がないと
やはり未定義だと思う。
sscanfで数値を読み出すときに文字数を動的に制限したいんだけど どうしたらいいかな sscanf("5678","%3d",&val); // val=567 ↑この3を可変にしたい
if (val>9) { sscanf("5678","%1d",&val); } else if (val>99) { sscanf("5678","%2d",&val); } else if (val>999) { sscanf("5678","%3d",&val); } ……
始めから6dくらいにしといてそれに統一しとけよ
>>762 1点目
valが10以上のときは常に最初にヒットしてしまう
2点目
なんでval使うん?
>>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として多くのシステムが採用しているとされている。
>>761 その文字列をsprintfで作るとかしないと無理じゃないかなぁ。
>>761 >>767 // フォーマット文字列じゃなくて変換対称文字列を加工してしまう手はどう?
int foo(const char * str, int len) {
char buf[len + 1];
sprintf(buf, "%.*s", len, str);
sscanf(buf, "%d", & val);
return val;
}
>>768 char buf[len + 1];
Cだから、ここは変えないとというのはさておき、発想的には、それで
>>761 の要求を満たせるのかどうかかと
うしろ切っていいのっていう
どういうことだ? 761の例でうしろ切ってるジャン
>>770 printfみたいに、引数で文字数を渡したいんじゃない?
if (lseek (STDIN_FILENO, 0, SEEK_CUR) >= 0 && fflush (stdin) == 0) { fseeko (stdin, 0, SEEK_CUR); } これ一体何やってんの? 同じ事2回やってる気が…
>>770 %3dは例で、実のところは%3d%sかもしれない
ありえるのがこのスレ。
>>762 指定した数だけgetch()したら良いんじゃね?後は必要な文字が来るまでで読み飛ばす
非同期入力だったらどうするんだ 後から後から文字が付け足されて入ってくるぞ
>>772 移植を含めたつぎはぎだらけのコードなんじゃないのかなぁ。
「何がしたいのか」がコメントに書かれて無いとそういう疑問を後世に残すハメに。
ちなみにそのfflushは未定義
stdinを引数にしたfflushの動作は未定義 な
VCだけ独自拡張で使えるんだよな これを言うと知らなかった奴が結構多くて驚く
GNU Cでも使えなかったっけ?
gccもアカンよー
それできるのglibcだっけ?
>>778 未定義なものを独自に定義されていた、それだけのことなのに驚くなんてどうかしてるよね
>>782 学校の先生も知らずに教えてたりするよ
どうなってるのかと思う
784 :
デフォルトの名無しさん :2011/09/22(木) 22:00:39.03
うん
fflush(stdin); 問題なくコンパイル通ったけど? gcc version 4.5.2 (GCC)
786 :
デフォルトの名無しさん :2011/09/22(木) 22:44:38.26
へえ
コンパイルは通るさ 実行結果が未定義なだけで
鼻から悪魔がでる
未定義なら警告でないの?
未定義=何が起きても不思議ではない HDDをフォーマットされても文句は言えない
>761 sprintf(fmt, "%%%dd", len); sscanf("5678", fmt, &val);
fflush(stdin)が定義されてる処理系のときって fflush(NULL)ってするとstdinも一緒にflushされるのか?
flushでは閉じられないだろ。あくまでflushするだけで。 フラッシュボタンを押しただけで便座が閉まっちまったら挟まっちまうじゃないか。
i=i++; を定義しようという運動はありますか?
>>796 むしろコンパイルエラーにして欲しいけど。
それとも「エラーとする」と定義して欲しいってこと?
Cコンパイラを実装しやすくしようという方針に反するからやらないだろうけど。
fflush(stdin)ってPOSIX 1988のころは標準化しようとしてたんじゃなかったかな。 90年代に入ってまた下火になり、2000年代にまた再燃してる。
>>793 JISのCでfflushのとこをみると
>streamが空ポインタのとき、fflush関数は、この箇条で動作が定義されているすべてのストリームに対して、
>その定義されている動作を行う。
って書いてあるから、stdinに対しての動作が定義されてるってことはそれもやっちゃうのかと思ったんだ
ちゃんと出力だけって定義に変えてあるのね
>>796 あなたのHDDをフォーマットするようにする事は出来ますよ
構造体ってstaticにできる?
>>797 エラーでも可。
とにかく、言語レベルであいまいさが残されてるのはいやじゃね?
実際のところ、i=i++はコンパイルでwarningになるんだし。
p=&i; *p=i++; みたいなのはどうすんの?
>>804 ごめん、勘違いしてた。
static struct {
int a;
} data;
こんな感じのを別の関数の中に定義してmain関数から data.a でアクセスできると思ってた
>>806 翻訳単位は左から右へ進み
参照直後に加算することを保障する (現状では 参照直後 から 副作用完了点の間)
ってことか?
808 :
807 :2011/09/23(金) 18:57:27.32
1行目のは 代入演算での 右辺、左辺の取り扱いでの話
無駄なものを定義されるとコンパイラの最適化が利かなくなるから C言語以外の言語でやってほしい
>>809 でも、これで最適化が効かなくなる状況ってほとんどないよ
>>806 void func(&a, &b) {
a = ++b;
}
func(i, i);
みたいのは?
>>805 イミフ。
>こんな感じのを別の関数の中に定義して
関数の中で定義するのだから、ローカル変数になっているよね。
>main関数から data.a でアクセスできると思ってた
ローカル変数だからその変数はmainでは見えない。
staticが付けば静的変数にはなるけど、mainから見える見えないは関係ないよ。
>>803 >>806 >>811 そういうのをコンパイラがチェックするのは、Cのポリシーに合わないと思う。
そういうことはしないでね、と決めてコンパイラの実装を軽くするのが、Cっぽいのでは?
>>812 なにもしないとmainから見えてしまうと勘違いしていた
(上記勘違いを前提にして)staticをつければ見えなくできるのかどうか聞いた
ってことだろ 会話を読め
const変数をポインタを通して間接的に変更出来たりするしな 結局C/C++はプログラマの「うっかりミス」からバグの生成を出来るだけ 排除しようとするけども、プログラマが「故意に」バグらせようとしたら無力 #define private public ↑ これでカプセル化など簡単に破れる
>>814 それだと関数内の組み込み型なローカル変数も main で見えるハズ という理解からのスタートにならない?
構造体って static にできる? と聞く動機に欠けるような。。。
817 :
812 :2011/09/23(金) 20:33:54.53
staticをつけることでグローバル変数と同じように扱えると思ったんです。 皆さんごめんなさい><
>>817 >staticをつけることでグローバル変数と同じように扱えると思ったんです。
staticはグローバル変数にがつく時とローカル変数につく時で意味が変わる。
グローバル変数につくと、内部結合になるので、俗にファイルスコープになって、
グローバルよりスコープは狭くなる。
>>814 いやー、そうは読めないでしょ。ま、本人が出てきているので、水掛け論は止めましょ。
書式指定での%xと%pの違いってなあに?
そんくらい調べろks
>>820 分からないなら無理しなくていいですよ^^;
ンなこと言う魔があったらおしえてやよれks
大した違いはないんじゃないかなー 表示の仕方が微妙に違うくらい?
しょうがねえ、マジレスしてやる。 ポインタのサイズ≠intのサイズ だ。
正確じゃない
win7 32bit : int = 32bit , pointer = 32bit win7 64bit : int = 32bit , pointer = 64bit
そりゃWindowsはLLP64モデルを採用しているからそういう結果になるだろうね
LP64でも同じだよ。 むしろIP64な環境の方がめったに無いから。 っていうか、「Windowsだから」じゃねーし。 処理系とOSの区別もつかないバカ。
longのサイズにも気おつけませう
char , short , int ,long ,long long,__int64
>>829 「Windowsだから」じゃなくて「WindowsはLLP64」ってあるだろ
何を当たり前のことを得意気に「処理系とOSの区別もつかないバカ(キリッ」だ
馬鹿かw
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[][?]){ こういう場合、?に何を入れたらいいの
835 :
デフォルトの名無しさん :2011/09/24(土) 15:14:55.16
>>833 どうしょうもない。
代わりに↓とか。
間違えてたらスマン。
int a(int *hairetuX[], int elemNum)
{
// hairetuX[a][b]
*(hairetuX + a*elemNum + b);
}
833〜835はargvをどう捉えてどう処理してるのか興味あるわ
特に>835は*(pointer + integer)がpointer[integer]の糖衣構文だと認識しているかどうか知りたいね。
835だけど、argvはNULL終端文字列へのポインタの配列と捉えてる。
>>838 言われてみれば型おかしいね。
すんまへん。
あと俺は「が」と「の」が逆の認識。
>>838 糖衣構文なの? 完全に等価だと思ってたんだけど
843 :
第三者 :2011/09/24(土) 19:11:13.31
int a(void *hairetuX, int elemNum) { // hairetuX[a][b] *(((int *)hairetuX)+ a*elemNum + b)= ... ; } こんな感じか?
hoge.cを作ったらhoge.hも必ず書く人 に質問したいんだけど hoge.cの中で使ってる標準関数のincludeって hoge.hに書く派? それとも、hoge.cに書く派?
hoge.hに書くに一票。
ついでにその思想も書いてもらえると勉強になる
hoge.hに#include <stdio.h>とか書くの? それはないでしょ。
stdio.hが要らない別のファイルでhoge.hをインクルードしたら無駄にstdio.hが展開されるだろ
>>842 規格でidenticalと書かれているからじゃないのかな?
The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
マクロとかをhoge.h内で使用してるなら。 製作者ならhoge.cに #include <stdio.h> #include "hoge.h" と書いても、他人は #include "hoge.h" #include <stdio.h> と書くかもしれんし。 重複展開もどうせキャッシュに載るだろうし、そんなにコンパイルに時間かからんと思うし。
#ifdef で回避しても展開されるの?
最近のVCはStdAfx.hに記述するらしいな。 // stdafx.h : 標準のシステム インクルード ファイル、 // または参照回数が多く、かつあまり変更されない // プロジェクト専用のインクルード ファイルを記述します。
ヘッダファイルでヘッダファイルをインクルードしだすと 階層構造がぐちゃぐちゃになるきがするから 俺は最小限にしてるわ システムインクルードをヘッダファイルでやるのは俺ルール(笑)だとありえないな 適切な順番でインクルードするのは使いたいCファイル側の責任だと思ってる
>>850 そりゃ、h内でstdio.h使ってたら、hの中でincludeしないとだめでしょ。
>>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
>>846 hoge.hをインクルードする際に
どのライブラリに依存しているか把握する必要がなくなる。
<...>でインクルードするようなライブラリは
基本的に修正する事はないので
無駄なビルドが発生するというデメリットもない。
まぁ、pchを使ったらいいよ。
>>853 と同意見。
c ファイルの方に #include <windows.h> と記述し、ユーザー側 .h ではシステムファイルのインクルードは行っていません。
そうしておけば、windows.h に依存する記述をユーザーヘッダに含ませても無問題。
インクルードガードは必要に応じて行いますが。
俺は
>>855 と同じ方針だな
そのヘッダ内の宣言記述で確定してないと困るものは include に含ませるようにしてる
コンパイル時間を減らしたいから FILE* のみ存在するヘッダ ← 前方宣言で処理 FILE の実体が存在するヘッダ ← ヘッダ内でインクルード かな。 後者のパターンで、インクルードしないメリットって何かあるの?個人的な好み以外で
FILE*の前方宣言てどうやるのクラスの前方宣言はやったことあるけど
>>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
とかだね
まぁヤル馬鹿はいない
VCでincludeする順番によっては誤作動するライブラリがあったような気がする。 順番間違わないように定番自作関数のヘッダファイルにinclude書いた記憶がある。
>855 #ifndefだろ
やばい #if defined(A) #elif defined(B) だろとか言われそう
>>863 ごめん、単純ミスです。
#ifndefが正しい。
>>853 >ヘッダファイルでヘッダファイルをインクルードしだすと
>階層構造がぐちゃぐちゃになるきがするから
自分にとっては
「XXXヘッダを使うに先立って、YYYヘッダをインクルードしておくこと」
などという約束事が必要なのがぐちゃぐちゃになっていると思う。
XXXヘッダにYYYヘッダをインクルードしておけば、ソースがその依存関係を語ってくれる。
>>859 もしかしてstdio.hをインクルードしないですむように、勝手に
FILEを宣言しようとしている?
カプセル化を破ろうとする行為だよ。
ヘッダをインクルードするのは、公開して何を隠すかを
ソースで表すためにしている。
FILEが使いたいならstdio.hをインクルードすべき。
ユーザプログラムでFILE構造体の中身が気になることは無いはず。
>>866 stdio.hをインクルードすると分単位でコンパイル時間が延びるような貧弱な環境かもしれないだろ
循環の対策としてifndefの外側にincludeを書くという方法もあるよ 自分は基本的にifndefの内側にはincludeを書かないルールにしてる #include "bbb.h" // 外に書く #ifndef __AAA_H__ #define __AAA_H__ // #include "bbb.h" //中ではなく #endif // __AAA_H__ あまり一般的ではないかもしれないが。 自分のケースだとこれで循環や宣言順などの面倒な問題の多くがクリアーできる。
>>832 longのサイズを決定するのはOSじゃないよ。
まだわかってないんだね。
最近知った言葉を使ってみたかっただけなんだろうけど
無理しないほうが恥かかないで済むよ。
こういう話のかみ合わない人ってどこにでもいるよね
キモいヤツ
Cで効率化って Pen4は窓から投げてコア2拾って来いよ たぶんそこらへんに落ちてるw
874 :
デフォルトの名無しさん :2011/09/25(日) 09:39:16.70
typedef struct{int a,b,c;} _tag; int main(void){ _tag tag[4][4]; for(int i=0;i<=3;i++){ for(int j=0;j<=3;j++){ tag[i][j] = {1,1,1}; //6行目 } } return 0; } なんか6行目に「構文エラー : ';' が '{' の前にありません。構文エラー : ';' が '}' の前にありません。」 ってなるんだけど… for文使って 「構造体[i][j]={ , , , };」 ってできないの?
時代は変わるwww
int i,j;
>>874 二重の配列に二重のループなんだから、入れるのは値一つで充分だろ。
初期化ではなく代入や引数等で構造体のメンバを一括して与えるのは… C90からできるんだっけ?
fgetsで標準入力から読み込んでるんだけどこれより速いのない? 一行の長さがバラバラだからfreadが使えないし
そうじゃないけど、そんなことより、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); } } }
tag[i][j] = (_tag){1,1,1};
882 :
880 :2011/09/25(日) 11:14:53.37
>>874 はコンパイラ/バージョン/コンパイルオプションに何使ってる?
いやいや どんなバージョンでも初期化には中括弧を使えるから 素人は死んでてください
886 :
デフォルトの名無しさん :2011/09/25(日) 13:38:28.13
gcc の -pedantic って、何故 "pedantic" なんだろう? あまり「名が体を表していない」ような気がする。 誰かその由来を教えてください。
そんなこと気にする奴は衒学的なヤツだけだ
888 :
880 :2011/09/25(日) 15:47:32.72
>> ゲンガクテキ gcc の -c89 って、何故 "89" なんだろう? その由来を教えてください。 -std= c89 iso9899:1990 ISO C90 (same as -ansi). gnu89 Default, ISO C90 plus GNU extensions (including some C99 features).
>>861 FILE*でポインタだからそんなことする必要ないだろ。
?
FILE*でポインタかぁ いみわからない
FILEの前方参照の書き方賭けよ
>>888 ANSIで制定されたのが1989年。ISOで制定されたのが1990年。
>>886 当時訳分からん単語だと思って調べて、すんなり理解できた俺とはまるで逆なんだな
名か体のどっちかを勘違いしてんのか?
規格の細かい記述を持ち出してきて延々難癖つけたり、 泥沼の議論をしたりするところをみてないとわからないんじゃないかな。 それこそ昔のfj.lang.cあたりを見てたら一発でわかると思うw
>>894 いや、
>>887 的な意味だろうとは思うのだが、
ちょっと皮肉が過ぎるかな、と。
実際、このオプションを必要としているのは
規格厨だけじゃないからね。
897 :
844 :2011/09/25(日) 20:54:04.46
やっぱいろいろな思想があんだな。 勉強になったわ。
>>895 それは今でもよくみられることです、ええ。
>>879 getchar()とかでどうよ
getchar()が速いかは知らんけど
>>901 遅いよ。
>>879 1行当たり文字数が少ないなら、fread()で一括で読んでから自前でばらした方が速くなる可能性はある。
でも、cygwinみたいなシミュレーション環境でもない限りfgets()より大幅に速くするのは難しいと思う。
>>896 pedanticスイッチをつけなければならない理由は?
>>901 getchar() の速度は、マルチスレッドか否かで大幅に変わるだろ。
まずは
>>879 の環境を聞かないと。
>>879 とりあえず setvbuf() で、バッファサイズを大きくしておけ。
>>879 あと、Windows 環境ならば、fopen() の時に
バイナリモードにするのもよいかも。
>>904 それはマルチスレッドだと遅くなるという解釈でいいんだよな
規格厨だけじゃないけど規格を重視しなければならない場面で使うよっていうのなら、
それこそ
>>896 に対する皮肉だよな
Windowsの環境でS-JISのテキストファイルをUTF-8にして保存するにはどうすればいいでしょ?
iconv -f Shift_JIS -t UTF-8 sjis.txt > utf-8.txt
やることは簡単だ。 S-JISを2byteずつ読みこんでいって、それをUTFの該当のコードに照らし合わせりゃいい。 ただし、その簡単な変換表を作る作業はまぎれもなくクソ。 がんばってね。
"汚れ仕事はPCにやらせる"が鉄則
>>913 じゃあそのヨゴレ仕事の内実を是非とも今ここで教えてくれ
できればソーース付きで
山ほどあるだろ汚れ仕事 ソースをコピペしてかさ増しするとか
ソースの笠間市は難読化でやるなぁ 無駄部分をそれとなーく紛れ込ませたり 無意味な判定を紛れ込ませたり 何もしない大掛かりなループ挿入したり
てめーのソースなんて誰も解読しねーよ
そんなのカバレッジテストで一発で一掃されるだろ、普通。
カバレッジテストツールほしい
C99はどうして一向に流行らないの?いらない子なの?
いらない子だよ
20年ぐらい遅れてる人が一杯いるから
C99使うくらいならC++に行くだろ
C2011はいつ出るの?
すみません、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の上でやっています。
組み込み系C言語で 関数の引数や戻り値、ローカル変数はすべてスタック領域に格納ですか? それともコンパイラによっては汎用レジスタとかに格納とかもありますか?
registerって使ったことねえな
コンパイラによる registerで明示的にレジスタ使う変数定義できたり 最適化すればコンパイラの判断でよく使う値や変数をレジスタに入れたままで使ったり てかローカル変数も引数も何もしなくてもいくつかまではレジスタに入るものじゃなかったっけ
931 :
928 :2011/09/28(水) 00:43:25.44
ありがとうございました。それを受けて追加で質問があります。 グローバル変数は品質や安全面を考慮するとあまり使わないほうがいいとよく聞きます。 でも、レジスタかスタックかわからないローカル変数よりも グローバル変数を静的メモリ配置(できればアドレスも決めて)したほうが コンパイラ依存も無く、どこのメモリに格納されているか把握できるので、 そっちのほうが安全かなと思ったんですがいかがでしょ?
>>931 どうしてもその区別が必要なら volatile で修飾するといい
>>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
RISCを触ってみた経験もない癖に見栄張るなやカス
>>934 学生実験で SPARC/Sun OS 4.1.1 を触っていたんですけどねえ。これって RISC じゃなかったんでしたっけ。
学生時代・・・
>>933 「デフォでレジスタだった」ら、どうなの。
すべてregister修飾すればいいと言ってるつもりはないんだろうけど、そう読める書き方はどうかとおもう。
てか、QZっていつぞやにどっかのサイトから丸パクリしたregister修飾されてるコード貼ってたろ。
register修飾が無意味のような思想を持っているなら、おかしいよな。
アセンブラの知識がにわかくさいんだが
>>928 皆さん最適化の話しかしてないけど関数の呼び出し規約(ABI)の問題もある。
関数の引数や戻り値に関しては勝手にレジスタを使ったりはできない場合もある。
>>927 おお確かに。ありがとうございます。
ところで、どうやらこれはscanfの「処理できない入力がバッファに残る問題」が関連して
いるようなんですが、これってEOFに関してはどうなんですかね。
というのは今、ふとUbuntuの上で試したら元のコードでも問題なかったので...
Mac OS Xの方はある意味EOFが処理できずにバッファに残っている状態のような...
まあ「そもそもscanfの挙動に頼るんじゃねーよ」と言われればそれまでなんですがw
でも、例えば他人のバグを指摘するときに自信を持ってバグの指摘をしたい場合もありw
>>940 実際に違う挙動を起こしたと言うコードを見ていないからなんともいえないが、何か勘違いしていると思う。
入力が本当に終了して最初のループを抜けているのなら、
二番目のループでも当然入力が終了したままだからそのまま抜けて当然。
>>940 確かに戻り値はレジスタ経由の実装が多いね。
APIのように、OSなどシステム側から提供される場合はABIで引き数がスタック経由である場合が多い。
これも、前から積むか、後ろから積むか、などの違いがあることもあるが。
一方、コンパイラ側から提供されるライブラリならコンパイラ側の自由が利くから、
それこそLSI-Cのようにレジスタ経由で引き数を渡すのが前提になっている場合もある。
>>941 うーむ、それってscanf()特有の事情は関係ない、純粋にstdinの扱いということですか?
とすると
>>927 さんのアドバイスも無効ということになり...
念のためですが、入力はターミナルから対話的に行っていて、EOFというのは
ターミナルからctrl-Dを入力するという事です。
ターミナルの終端通達コードが違う ってことはないの?
>943 OSXで動けばいいってだけなら、間にrewind(stdin);をかませる。
rewind(stdin) より clearerr(stdin) のほうがいい?
stdinの仕様よく知らないけど 普通のファイルだと考えた場合 一度EOFが帰ってきたらもう後はいくら読み込もうとしてもEOFじゃないの?
>>948 普通のファイルと端末=stdin とはまた違うようです。
パイプでリダイレクトされる(≒ 普通のファイル)ことを考えると scanf() の戻り EOF(ストリームの終端、ASCIIコードEOFに非ず) を入力のセパレータに使うべきではないような感じ
区切りは空行で十分じゃねーの。
QZは嘘を付いてでも自分を大きく見せようとするからな さすが自己愛性人格障害
stdinも普通のファイルも大差ないだろ シークできないって程度じゃね?
経験値がいくつのときにレベルアップするかのテーブルがあれば可能じゃね
つまらん・・・ 予測も何も、%表示は線形と定義して、順次平均を出していくだけ。 初期パラメータに、切り捨て、四捨五入、切り上げ の3つを選べばより正確さがますだけ。 悩むようなアルゴリズムじゃない。
10匹分の合計で計算すりゃマシな値でるんじゃね?
まず考えるのは最小二乗法だが、 %表示の誤差を単純に処理していいのかは 悩む所だろうなあ
質問者は正確なLvUPの経験値が知りたいのかな? 一匹づつの結果より累計の結果の方が精度高いと思う。
>例えば現在の獲得総経験値が「48%」と表示されていて >敵を倒し、1230の経験値を得て「50%」になったとします、そして >1.1230→「52%」 >2..1230→「54%」 >3...1230→「57%」 (1230*4)/(57-48)≒1%分の経験値
何の話か知らんが10%時間は6分だ
Exp. = 10 * Lv. * (Lv. - 1) (゚σ ゚)ホジホジ
数学板いくほどのもんなのか?
968 :
デフォルトの名無しさん :2011/09/28(水) 23:31:43.51
これから、webアプリが流行してくると、C言語の役割が変わってくるような感じが しています。アプリ関係は他言語で、OSや組み込みレベルはCでっていうふうに 分かれていくような気がしてきませんか?
もともと言語は目的があって作られております
しない
どうでもいいがな それよりHTML5勉強しろよ
今でもアプリをC言語でなんか書かないだろ
クロームだけが頑張ってもな・・・
いや他のブラウザも追従するだろ 特にFirefoxやOpera当たり
>>975 operaはどうだろ・・・
あいつら「自分こそが正しい」の一点張りで、見れないサイトあっても
ガン無視決め込むからな・・・
977 :
デフォルトの名無しさん :2011/09/29(木) 03:20:46.88
指定桁数で四捨五入する以下の関数の実行速度を上げたいの。 (valueは正、digitsは0〜5が保証される) これ以上速くできる? double NormalizeDouble(double value, int digits) { static double t0[] = { 1, 10, 100, 1000, 10000, 100000 }; static double t1[] = { 1, 0.1, 0.01, 0.001, 0.0001, 0.00001 }; return (int)(value * t0[digits] + 0.5) * t1[digits]; }
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; }
return (int)(value * t + 0.5) / (double)t;
次スレ立てます
>>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];
}
整数どうしの積に0.5加えた、元の方が早いよ
どうも、
>>926 ですが
>>948 私もそう思ったんですが... どうなんでしょうかね。標準入力に関して。
ちなみに stdio でなく read() で同じコードを書いてみると、一旦EOF(ctrl-D)を
入力したあとに後に再び read() を呼ぶことで、引き続き標準入力を読めました。
これは Ubuntu も Mac OS X も同じ。
ということは scanf() も同じ挙動をした方がいいのかな、と思ったり...
入力を閉じている(CtrlD)のに再度入力できるのが不自然だと思う。 標準入力をリダイレクトしてファイルから読んでいたら、そんな振る舞いはしないと思う。
read() は、単に読み込んだバイト数を返すだけで read()の戻り値が0の時にEOFと判断するのはstdioがやってること。 (cookedモードの)端末I/Oは行の先頭で^Dが入力されたときに0バイトが読み込まれたと返すだけで、 次にread()が呼び出されたら、入力に応じた値を返す。 現象から推測してreadが0を返したときに、 Linux(glibc?)はEOFフラグをたてないけど、OS XはEOFフラグを立てておき EOFフラグが立っている状態でさらにscanf等を呼び出すとreadせずに そのまま-1を返しているんじゃないのかな。
すごく素朴な疑問なんだけど ポインタ変数の宣言をする時なんで皆「void *i」なの? 「void* i」の方がポインタ変数って分かりやすくね?
>>990 void* i, j;
みたいに間違うから。
C++だとvoid*形式のが好まれてるけどね。
次からは「void *i」って書く事にします。
?
>>993 void* i,j; だと void*という型に見えちゃうけど実際には
void *i,j; だということを認識しろという話だろボケ
>C++だとvoid*形式のが好まれてるけどね。 こっちの話じゃね?
もうね、書き方は宗教に近いからどうでもいいと思うよ。 俺は中間を取って void * p; と真ん中に書く、どちらからも文句言わせんw
>>997 どうでもいいと思うならわざわざ出てくるなよ。
どうでもいいから中間にしたと言っているだろうが、文盲か
1000ならプログラミング技術がチョットだけ向上
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。