- 1 名前:デフォルトの名無しさん mailto:sage [2016/11/06(日) 22:58:02.60 ID:dU5z27As.net]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用) 前スレ 【初心者歓迎】C/C++室 Ver.99【環境依存OK】 echo.2ch.net/test/read.cgi/tech/1469177649/
- 899 名前:デフォルトの名無しさん [2017/07/09(日) 16:51:56.41 ID:EeQkMvgZ.net]
- >>885
つまりポインタpは配列を参照してもp自体は配列型ではなくて単体(?)のオブジェクトだということでしょうか?
- 900 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 16:56:52.17 ID:3Luqddjj.net]
- >>886
もちろんや。 pはarrayとは別のアドレス2293468にある int*型の独立したオブジェやで
- 901 名前:デフォルトの名無しさん [2017/07/09(日) 17:01:52.64 ID:EeQkMvgZ.net]
- >>887
ありがとうございます!5時間以上つまってたのが一気にクリアになりました!
- 902 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 17:16:44.02 ID:Uu/MlKNR.net]
- >>880
> &pp[0] : 2293468 これはpのアドレス > &pp[1] : 2293472 > &pp[2] : 2293476 pp[1], pp[2]は存在しないからアクセスしちゃダメ たぶん 2293464: pp 2293468: p 2293472: array[0] 2293476: array[1] 2293480: array[2] みたいなメモリ割り当てになってるんだろうな
- 903 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 22:31:05.00 ID:WeAgIUgc.net]
- >>889
意味のある値が取れないだけで 別にアクセスしても問題ねーだろ
- 904 名前:デフォルトの名無しさん mailto:sage [2017/07/09(日) 23:28:17.80 ID:1po+7Ikw.net]
- >>890
正しく割り当てられたオブジェクトのアドレス以外を指しているのなら、アクセスしてはいけないだろう。 889の例ではたまたまpp[1]が表す位置がスタック上の有効なアドレスでアラインメントも問題無いだろうけど、 例えばppがスタックやヒープの末端のオブジェクトを指していたら、pp[1]にアクセスしたらNGということもある。
- 905 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 06:50:03.40 ID:ZgtWUD/x.net]
- 中身にアクセスしてなくてただのアドレス計算だぞ
C/C++言語的にはNGだけど、それで例外が発生するとはなかなか考えにくい もしかしたらビルド時に警告を出してくれるかも
- 906 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 06:54:34.99 ID:t9ouoliu.net]
- アドレス計算自体はOKだと思うよ。
- 907 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:04:04.53 ID:Ols/UzwR.net]
- 配列ならば確保した数+1までのアドレス計算はやっても大丈夫&整合がとれる位置に配置されている
- 908 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:05:58.47 ID:ZgtWUD/x.net]
- 無効エリアのアドレス計算
値不定か動作不定かどっちだか忘れた これらをOKと呼ぶならOKなんでしょう
- 909 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/07/10(月) 07:13:12.05 ID:ZgtWUD/x.net]
- >>894
-1も有効だとうれしい事があるけど、-1はダメなんだよね
- 910 名前:デフォルトの名無しさん mailto:sage [2017/07/10(月) 22:27:20.57 ID:WIOZS2V0.net]
- >>894
つまり式「&pp[1]」は大丈夫でないと?
- 911 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 13:12:04.11 ID:eWIFW1BW.net]
- ppは配列じゃないだろ
- 912 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 18:17:43.80 ID:L5b0rMHK.net]
- これがアスペいうやつだな
配列でないオブジェクトも要素数1の配列として考える仕様→よくご存知で pは配列じゃないからな→わかる ppは配列じゃないからな→頭悪いな ppは配列じゃないだろ→アスペ
- 913 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 20:17:20.41 ID:gS+YojZ9.net]
- ん?まったくよくわからんのだが、だれか解説して
>配列でないオブジェクトも要素数1の配列として考える仕様 ↑まずこれがよくわからない 配列じゃないオブジェクトといえば、例えばint i;などは配列としては扱えないよね で、下二行の意味も分からない
- 914 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:08:22.53 ID:qjau/h5c.net]
- 配列かどうかは関係なく、オブジェクトの後ろのアドレスは計算も出来るし比較も出来る
- 915 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:10:11.51 ID:qjau/h5c.net]
- >>894は配列じゃない場合に関しては何も言ってないから間違いではないが
わざわざ配列と書いてるので配列以外は違うと思ったかわからなかったか だろう
- 916 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:14:58.67 ID:qjau/h5c.net]
- >>897
「つまり」が意味不明 >>894は配列じゃない場合には何も言ってない 「大丈夫でない」は正しい >>898 配列じゃないから何? >>899 実際には配列ではない
- 917 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 22:28:18.47 ID:gS+YojZ9.net]
- いや、それは俺も思ったんだが
ppが配列じゃないのは当たり前なんだが(てかポインタだし) おそらくはそんなことは問うてないって言いたいんだと思う つまり、ppが指している先が何であるかが問題であるから 配列か配列じゃないかを問うべきはppではなくppの指している先である「p」であろうと 同じことをもう一度言うけど pp[1]としたとき問題になるのはppの指してる先がどうなっているかで 今回の場合はそれは「p」であるから 正しくは、「ppの指してる先のpは配列じゃないだろ」って言うべきっていう主張かと
- 918 名前:デフォルトの名無しさん mailto:sage [2017/07/11(火) 23:00:18.82 ID:634mVLA8.net]
- >>901
なら&pp[1]も大丈夫なんじゃね?
- 919 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 07:01:19.46 ID:Mf+sZV2C.net]
- pp[1]の時点で動作不定
正しく動かない環境はもしかしたら存在しないかもしれないけど
- 920 名前: ◆QZaw55cn4c mailto:sage [2017/07/12(水) 07:26:19.94 ID:9q9UgJkW.net]
- >>880
ん、最初にもどってメッセージを書くとすれば、こうなるかな >ポインタそのものにオブジェクトってできるんでしょうか? 私が意味を取り違えているかもしれないが、「できない」 ポインタを取得したからといって、オブジェクトが生えてくることはない あくまで、先にオブジェクトを確保した上で、それに対してポインタを設定する手順をとる >例えば、配列arrayのアドレスをポインタpで、ポインタpのアドレスをポインタpのポインタppで調べたんですが、 array を確保しているので、p は array 確保分(p 〜 p + 3)だけプログラムとして意味がある。 pp は p 一個分だけ意味がある。すなわち *pp = p、でも pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない &pp[1] と書くとなにがしかのアドレスを生成するが、それは使えない アドレスを生成できるからといって、その領域が意味のあるものとは限らない >>881 では意味のないことを求めてしまいごめんなさい
- 921 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 08:20:30.93 ID:SNfdy8To.net]
- >>906
>pp[1]の時点で動作不定 ちなみにそれを規定する規格の記述はどこ? Cでは明確に禁止されているようだがC++では見つけられなかった
- 922 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 09:01:11.94 ID:6a7v2dDL.net]
- https://www.google.com/search?q=%22behaves+the+same+as+a+pointer+to+the+first+element+of+an+array+of+length+one%22
- 923 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 09:10:12.68 ID:6a7v2dDL.net]
- https://www.google.com/search?q=%22If+both+the+pointer+operand+and+the+result+point+to+elements+of+the+same+array+object%2C+or+one+past+the+last+element+of+the+array+object%22+%22otherwise%2C+the+behavior+is+undefined%22
- 924 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:20:57.39 ID:ahqaJGrL.net]
- >>907
まとめとしてはそれでいいし否定するわけじゃないけど、若干気になるのは 1.ポインタ自身もポインタというオブジェクトじゃないのか? 2.末尾+1のアドレス(を指すポインタ)はデリファレンスできないけど、大小比較には使えるのでは
- 925 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:41:52.51 ID:uqOuLEsE.net]
- そんで俺はちょっと思ったんだけど
Cはポインタを配列のように扱えるのが便利だなぁと 逆に配列名を参照したらポインタ値になるし あと他、関数ポインタを普通の関数のように扱えたり 逆に関数名を参照したらポインタ値になったり 意味の上で別解釈しようがないからそれでいいだろ、的な 二つに共通しているのは (1)参照しても意味のある値が得られなそうなシンボルは自動的にポインタ値に成り下がってもらおう (2)その上でポインタに対していろいろな演算 ()[] が出来るようにしておこう というもので、これでシームレスになるしタイプも減るから便利だろう、と でもそういう方針なんだったら何故我々は「.」と「->」を 使い分けなきゃならないんだ?と思わんこともない 意味の上で別解釈できたり不明瞭だったりは無いのに ただ、Cの構造体は(1)を満たしていない もし(1)を満たすようにしてしまうと、構造体を参照するとポインタ相当に成り下がってしまうので 代入演算子で代入したり、関数に値渡ししたりが出来なくなる ただし、C言語がそのような仕様になっていた可能性は十分にあると思う というのも配列がまさにそうであって、代入でコピーできないし、関数に値渡し出来ないから アセンブリレベルでは配列も構造体もレジスタに入りきらないという意味では同じで 先頭アドレスからのオフセットでアクセスするのは同じであるから そういう着想に基づけば、構造体も配列と同じようにポインタに成り下がる仕様に なっていた可能性はあると思う 構造体は代入できないからmemcpyしろ、がCの常識だった可能性はある そんで、「.」演算子は構造体のポインタに対して有効、となって、「->」は無くなる で、そうはしなかった代わりに「->」演算子が有る、とも取れる
- 926 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:42:12.78 ID:uqOuLEsE.net]
- 気まぐれか、意図的か、歴史的事情か、生い立ちに由来するものか、知らんが、そうなっている
だが実際これが大当たりで、もしそうじゃなかったらC++が全く成り立ってこない C++のクラスはCの構造体を拡張したものだが、オブジェクトが勝手にポインタに成り下がる仕様だと 代入したり、関数のreturnで値として返したりができない となれば独自のクラスを定義して、まるで基本型のように振舞わせたり、メソッドチェーンをしたりが出来ない もしやるとしたらnewして返すしかないので、GCが無いとどうにもならなかっただろう (実際C++とCの配列は相性が悪く、std::vectorかstd::arrayを使わないと上手くいかない場合も多い ポインタ相当に勝手に成り下がってしまうので代入ができない) ただ、このことが本当に良かった事なのかどうなのかは分からない GCは有ったほうが良かったかもしれないし、C++の代入やコピーコンストラクタに関する話題は後を絶たない 他の言語のほとんどがオブジェクトを参照で扱うのを見てると Cの配列のように勝手にポインタに成り下がって代入できない考え方のほうがスタンダードなのかもしれない C++のクラスは、状況に合わせて、これを選べ
- 927 名前:驕Aという立場になってるが
もしCの構造体が配列のような仕様だったなら、どうなっていたか分からなかった事を考えると感慨深い [] - [ここ壊れてます]
- 928 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:43:43.81 ID:uqOuLEsE.net]
- よくよく考えてみればなかなかに奇妙
まず常人が普通に考えたら、配列や関数名を参照したらポインタ値が得られることにしようっていう発想がない プログラマは基本的に几帳面で、整合性を気にする生き物だから ポインタ値は「&」を付けたら得られることにしよう、と決めたのだから &arrayとか&funcとか書かせたくなるのが普通だろう そして(*array_ptr)[1]とか(*func_ptr)()とか書かせたくなるものだろう ところがCは、レジスタに乗らないもの、演算できないもの、を 勝手にポインタと同等に格下げするというルールを設けたうえで そのポインタに対して各種演算子を定義することで整合性を保ちつつタイプ数を減らすという ウルトラCをやってのけた ここまででも俺ではちょっと思いつかないなーと感心するわけだが 逆にこんなすごいことを思いついたんなら、全部このルールで行きたくなってくるのが凡人 その方が整合性がありそうな気がするから なのに構造体はそうなっていなくて、代わりにアロー演算子が定義してある だから配列と違って構造体は代入ができるし関数に値渡ししたり、値で返したりが出来る それはそれで奇妙なことだと思ったりもするが、とにもかくにも この辺がC++の基本方針や特色にものすごく影響が出てる GCが無いのもそうだし、最近でも右辺値参照が追加されたりとか、結構尾を引いていて C++特有のややこしさの一端でもあり、他には代えがたいメリットでもある ある意味で、Cの配列の考え方のが、他言語のオブジェクトの考え方に近いというのが何とも そして構造体をベースとするC++とCの配列は相性が悪いという C言語の功罪は凄い
- 929 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 13:48:37.49 ID:vq82ZnF5.net]
- 3行で(´・ω・`)
- 930 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 17:58:12.38 ID:SNfdy8To.net]
- 駄レスの関係無いリンク先をまじまじと読んでしまった
日本語でレスが書かれていない時点で読む価値が無いと判断すべきだった
- 931 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:07:40.57 ID:SNfdy8To.net]
- >>915
「初期のK&Rが至高と考えるボクは 構造体がコピーできる仕様にハンタイです」
- 932 名前:デフォルトの名無しさん [2017/07/12(水) 18:19:22.64 ID:Oma/x2r0.net]
- ユーザーヘッダーファイルを作って
#include<stdio.h> #include<math.h> #define PI 3.14 double r; void nyuuryoku(void) { printf("半径を入力してください。\n"); scanf("%fl", &r); printf("%f\n", r); return; } double keisan(void) { printf("%f\n", r); return PI*pow(r, 2); } と書いてprintfでrを観察してみたんですがscanfでrに数値を入力しているはずなのにrに何も反映されていないことがわかりました。 rはグローバル変数として扱われていると思うのですがなんでrの値が変わらないんでしょうか?
- 933 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:34:20.99 ID:+I30gFZ0.net]
- void nyuuryoku(void) {
char buf[256]; printf("半径を入力してください。\n"); if(NULL==fgets(buf,sizeof(buf),stdin)){ printf("ちゃんと入力しろやボケ\n"); return; } sscanf(buf,"%fl", &r); printf("%f\n", r); return; }
- 934 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:44:41.01 ID:FRCEttse.net]
- >>918
× scanf("%fl", &r); ○ scanf("%lf", &r);
- 935 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:45:48.34 ID:+I30gFZ0.net]
- %lfちゃうか?
- 936 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 18:46:07.89 ID:+I30gFZ0.net]
- 失礼しますた
- 937 名前:デフォルトの名無しさん [2017/07/12(水) 18:49:05.30 ID:Oma/x2r0.net]
- oh....
コンパイラも見逃してくれてたからそんなミスとは思いませんでした(´エ`;) ありがとうございました
- 938 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 19:24:59.74 ID:iSKiMIM1.net]
- -Wallつけるか、clang使え
- 939 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 21:38:59.46 ID:Q4X+sAyq.net]
- >>912-914
なんか色々勘違いしてるしどうでもいいから続きはチラウラで頼むわ
- 940 名前:デフォルトの名無しさん mailto:sage [2017/07/12(水) 23:05:57.46 ID:2e79StFo.net]
- 最近のチラシは両面印刷で困る
- 941 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 00:31:49.82 ID:/oMuxl/G.net]
- >>907
>pp[1]= *(pp + 1) は確保していない領域を指すのでこの表現は使ってはいけない Cの規格をよく読み直したらそうでもなかった
- 942 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 01:06:35.55 ID:+2MHjXyv.net]
- >>912-914は基礎的なところで間違った理解をしていると
そのうえに乗っかるすべてのものについて間違った理解をすることしかできなくなるという見本のようだ
- 943 名前: ◆QZaw55cn4c mailto:sage [2017/07/13(木) 06:27:44.49 ID:NDMOLt7F.net]
- >>927
>>880 int **pp = &p; でpp[1] は書いちゃだめだろう?
- 944 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 07:12:43.09 ID:/oMuxl/G.net]
- >929
その書いちゃダメを規定する6.5.6p8には「that is evaluated」という条件がある evaluateはメモリアクセスの有無と関係無く基本的に全て行われるはずだが 6.5.3.2p3の例外既定により該当しないばかりか「&*」が省かれるとある
- 945 名前: ◆QZaw55cn4c mailto:sage [2017/07/13(木) 08:39:26.58 ID:045lcfaT.net]
- >>930
シンタックスではなくセマンティクスというわけですか‥ありがとう
- 946 名前:デフォルトの名無しさん [2017/07/13(木) 18:16:27.80 ID:PDgj9Ebq.net]
- #include<stdio.h>
#include<string.h> #define NUM 10 int main(void) { int length; char name[NUM * 2 + 1]; char family_name[NUM + 1]; char first_name[NUM + 1]; printf("姓を入力してください\n"); scanf("%s", family_name); printf("名を入力してください\n"); scanf("%s", first_name); strcat(name, family_name); strcat(name, first_name); length = strlen(name); printf("名前:%s\n", name); printf("長さ:%d\n", length); return 0; } このプログラムで入力まではちゃんとできてるみたいなんですがstrcatのところでおかしくなって 結合結果がフフフフフフフってなります。どうしてでしょうか?
- 947 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:29:33.51 ID:lX8cJUTX.net]
- 笑われてんじゃね?
- 948 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:30:25.16 ID:lX8cJUTX.net]
- マヂレスすると、nameが不定
- 949 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 18:34:34.28 ID:a0isPZOF.net]
- >>932
char name[NUM * 2 + 1] = {0};
- 950 名前:デフォルトの名無しさん [2017/07/13(木) 18:37:48.37 ID:PDgj9Ebq.net]
- ありがとうございました
- 951 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 19:34:29.65 ID:b1PvI/zl.net]
- どうでもいいけど、
char name[NUM * 2 + 1] = ""; 普通こうじゃね? char name[NUM * 2 + 1] = {'0'}; これでも良い コンパイル結果はたぶん全部同じだけど
- 952 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 20:27:20.55 ID:bV5zFMan.net]
- >>932
俺のところで試してみたらフフフノフフフになった
- 953 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 20:43:44.17 ID:lX8cJUTX.net]
- Visual Studio のデバッグビルドだと、不定メモリをCCで埋める
だからこれに対応する'フ'が表示される なぜ途中が'ノ'になるかはわからん strcatではCCの後の0を探してその後に文字列をコピーするから、0の位置によっては例外が発生したり動作がおかしくなったりするかも
- 954 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 21:06:57.04 ID:a0isPZOF.net]
- >>937
= {'\0'};のタイプミスだよね?
- 955 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 21:23:18.88 ID:lX8cJUTX.net]
- >>940
タイプミスじゃなくて文字化けした スマホから見ると、? が◆の中に書かれた文字になってる
- 956 名前:デフォルトの名無しさん mailto:sage [2017/07/13(木) 23:03:34.21 ID:xdHlDIka.net]
- プログラム終了にexit 0とreturn 0がどう違いますか?
- 957 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/13(木) 23:59:30.53 ID:anRp6w5D.net]
- >>942
違わない。 main 内の return は exit と同じ。
- 958 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 19:19:48.00 ID:TW7O0pB9.net]
- というタワゴトで他人を陥れるのであった
- 959 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 19:26:30.76 ID:RoIBY40S.net]
- exitは死のトラクターが働かない
- 960 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 19:32:27.26 ID:RoIBY40S.net]
- 異常終了以外でexitを使うヤツは素人
- 961 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 20:20:31.05 ID:8ghhANnS.net]
- えっ
mainのreturnでint値返すのはexitをその返り値で呼ぶのと全く等価でしょ? 少なくとも現行のC,C++規格では等価と書いてあるけど現実の実装ではそうなってないってこと?
- 962 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 20:52:35.05 ID:RoIBY40S.net]
- #include <iostream>
#include <cstdlib> struct A { ~A() { std::cout << "OK" << std::endl; } }; int main(void) { A a; std::exit(-1); }
- 963 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 20:55:56.83 ID:RoIBY40S.net]
- >>947
どこに書いてあったか? 苦情入れるぞ。
- 964 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 21:04:08.43 ID:TW7O0pB9.net]
- 今日の>>945は健常者
後始末される例外ケースについて触れていたら完璧だった
- 965 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 21:06:50.82 ID:VdC9hBdZ.net]
- atexit で後始末回収機構走らないの?
- 966 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:39:46.62 ID:RoIBY40S.net]
- >>947
どこに書いてあった?
- 967 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:46:17.67 ID:RoIBY40S.net]
- atexitはマニュアルに書いてある通りだから、ここでいちいち説明する必要はない。
- 968 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 21:53:53.48 ID:RoIBY40S.net]
- マニュアルこそが聖書。マニュアルを読まない奴等はノンプレイヤー。
- 969 名前:デフォルトの名無しさん mailto:sage [2017/07/14(金) 22:54:13.51 ID:RlDfzlps.net]
- つまりexit()はバカ発見器ってこと?
- 970 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/14(金) 23:01:28.54 ID:RoIBY40S.net]
- C++でexit使うぐらいなら、代わりにC++例外を使った方がいいよ。デバッグしやすいし。
- 971 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 05:41:00.21 ID:81gh4ly6.net]
- >>947
exit() 関数に入ってしまってはデストラクタが働かないのに,それでも return 文と一緒といいはるの? それ規格がまちがってるから,そのうち修正がはいるはず
- 972 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 13:25:52.33 ID:d+yGYUAe.net]
- ポインタの作法に慣れないです
読めるけどかけないです
- 973 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 16:38:44.94 ID:sZ4h7fLQ.net]
- ポインタは2段までしか使わないなあ
関数ポインタはstd::functionに入れる癖がついたし
- 974 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 17:20:33.71 ID:d+yGYUAe.net]
- #include<stdio.h>
int unko(int x); int aho(int *y); int main(void) { int a[5] = { 1,2,3,4,5 }; unko(a); aho(&a); printf("%x\n%x\n", a, &a); return 0; } int unko(int x) { printf("%x\n", x); return; } int aho(int*y) { printf("%d\n%d\n",*(y+1), y[2]); return; } このとき関数unkoで配列aの中身にアクセスする方法ってありませんか? アドレスがわかっているからできそうな気もするんですがよく解りません。
- 975 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 17:27:13.54 ID:xLcEZRbh.net]
- aがint a[5]であるとき、aはint配列の先頭アドレスだ。unkoの引数をポインターにしろ。
- 976 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 17:56:11.02 ID:d+yGYUAe.net]
- はい
- 977 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 20:48:00.24 ID:iuayY/9E.net]
- そもそもこのソースコンパイルエラーになるんじゃね?
- 978 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 21:29:06.16 ID:d+yGYUAe.net]
- >>963
VSだとコンパイラ通るんですが他のだと通りませんか? あと関数unkoをいろいろ弄ってたんですが #include<stdio.h> void unko(int x); void aho(int *y); int main(void) { int a[5] = { 1,2,3,4,5 }; unko(a); aho(a); printf("%x\n%x\n", a, &a); printf("%d\n",a[4]); return 0; } void unko(int x) { printf("%x\n", x); int *p = x; printf("%d\n%d\n", p[1],*(p+2)); p[4] = 10; return; } void aho(int*y) { printf("%d\n%d\n",*(y+1), y[2]); return; } こんな記述にすれば少なくともVSでは引数をポインタにしなくても配列aの要素を覗いたり操作したりできることがわかりました。
- 979 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:31:54.33 ID:18nkvKxh.net]
- 型がめちゃくちゃだあああ!!!
型が形無し!
- 980 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:36:49.71 ID:18nkvKxh.net]
- できることとやってもいいことは違うんだよ。
- 981 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:39:23.41 ID:18nkvKxh.net]
- コンパイル時に出て来る度重なる警告を無視したらダメだよ。
- 982 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 21:44:11.03 ID:d+yGYUAe.net]
- すみません
- 983 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:46:08.79 ID:18nkvKxh.net]
- お使いの32ビット環境ではintとint*が同じサイズだから、キャストされれば代入できる。sizeof(int) == sizeof(int*)。
しかし、64ビット環境では動かなくなるかもしれない。ポインター型を無視した良くない書き方だ。
- 984 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:54:52.27 ID:18nkvKxh.net]
- おそらく、君の環境では、
sizeof(int) == 4, sizeof(int*) == 4 のはずだ。 64bit環境では、多分 sizeof(int) == 4, sizeof(int*) == 8 になる。確認してみたまえ。
- 985 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 21:57:34.94 ID:18nkvKxh.net]
- int*のサイズがintのサイズより大きいと、ポインター(アドレス)の値が正しく代入できない。これが64bitで失敗する理由だ。
- 986 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:08:26.63 ID:qXQ9KlTo.net]
- こまけーことをゴチャゴチャと
Cなんて大なり小なり環境依存な場面しか使わん 貴様はintに32767以下しか入れんのか?
- 987 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:10:20.05 ID:d+yGYUAe.net]
- 確かめてみたら確かに自分の環境では両方4バイトでした
64bitのプログラムにしたらダメになるんですね・・・ 勉強になります。ありがとうございます。
- 988 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:23:44.38 ID:vkKq60sj.net]
- 2レスで失礼します
VC++9Eでruby-opencvのビルドを試みているのですが構文エラーが多発してビルドできません >C:\dev\ruby-opencv>nmake >〜 >cl -I. -I. -IC:/dev/ruby-1.8.7-p374/win32/bin/lib/ruby/1.8/i386-mswin32_90 -IC:/dev/ruby-opencv-master/ext/opencv -MD -O2b2xty- /EHsc -IC:/dev/ruby-opencv-master/ext/opencv/ext/opencv /EHsc -DHAVE_OPENCV2_CORE_CORE_C_H -DHAVE_OPENCV2_CORE_CORE_HPP -DHAVE_OPENCV2_IMGPROC_IMGPROC_C_H -DHAVE_OPENCV2_IMGPROC_IMGPROC_HPP -DHAVE_OPENCV2_VIDEO_TRACKING_HPP -DHAVE_OPENCV2_FEATURES2D_FEATURES2D_HPP -DHAVE_OPENCV2_FLANN_FLANN_HPP -DHAVE_OPENCV2_CALIB3D_CALIB3D_HPP -DHAVE_OPENCV2_OBJDETECT_OBJDETECT_HPP -DHAVE_OPENCV2_LEGACY_COMPAT_HPP -DHAVE_OPENCV2_LEGACY_LEGACY_HPP-DHAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H -DHAVE_OPENCV2_HIGHGUI_HIGHGUI_HPP -DHAVE_OPENCV2_PHOTO_PHOTO_HPP -DHAVE_OPENCV2_NONFREE_NONFREE_HPP -DHAVE_STDARG_H -I/usr/include -IC:\dev\OpenCV2.4\install\include -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c -TpC:/dev/ruby-opencv-master/ext/opencv/algorithm.cpp >〜 >algorithm.cpp >C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\istream(699) : warning C4003: マクロ 'read' に指定された実引数の数が少なすぎます。 >C:\〜\istream(699) : error C2059: 構文エラー : ')' >C:\〜\istream(846) : コンパイルされたクラスの テンプレート のインスタンス化 'std::basic_istream<_Elem,_Traits>' の参照を確認してください >C:\〜\istream(700) : error C2143: 構文エラー : ')' が '{' の前にありません。 >〜 >C:\〜\xxbind1(320) : warning C4003: マクロ 'bind' に指定された実引数の数が少なすぎます。 >C:\〜\xxbind1(320) : error C2988: 認識できないテンプレートの宣言または定義です。 >C:\〜\xxbind1(320) : error C2059: 構文エラー : ','
- 989 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:24:14.08 ID:vkKq60sj.net]
- 何らかのファイルが足りないとかならまだ判るのですがこのファイルはVCに付属の物ですし構文エラーなどと言われても理解できません
algorithm.cppは一番最初のファイルで全く進まない状態です ちなみにRubyとOpenCVのビルドは一応通っています(本当に問題ないかは未確認) C/C++は不慣れでVSの使用経験もあまりないため原因の見当も付かず手詰まり状態です。もし何か判る方がいたら教えてもらえると助かります
- 990 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/15(土) 22:27:42.35 ID:18nkvKxh.net]
- readというマクロが悪さをしているようだ。#include順を変えるか#undefしろ。
- 991 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 22:35:18.82 ID:Z+b63Gri.net]
- >>958
使わずに済むのなら無理して使う必要は無いだろ? 正しく動けばそれでいい
- 992 名前:974 mailto:sage [2017/07/16(日) 12:18:52.82 ID:wcmK4agw.net]
- >>976
すみません。その場所の特定ってどのようにすればいいのでしょうか 比較的規模の大きいライブラリですし、インクルードしているファイルだけでもかなりの数になりそうです ファイルの検索とテキストエディタだけでは追えそうにありません 追跡を支援してくれるツールとかないんでしょうかね・・・
- 993 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2017/07/16(日) 12:28:40.60 ID:flrpsNzv.net]
- >>978
IDEのフォルダ内検索か、 grepツール
- 994 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 15:16:03.75 ID:1O/pViqJ.net]
- マクロ展開したソース吐くオプションあったよな
VCならd.hatena.ne.jp/nurs/20100516/1274020395 1.ソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒ プロパティ⇒プリプロセッサ⇒前処理済みファイルの生成⇒行番号つきか行番号なしを選択 2.再びソリューションエクスプローラ上で展開後の結果を見たいcppファイルを右クリック⇒コンパイル これで、cpp が置かれているのと同じファイル階層に、cppと同じ名前だけど拡張子が.iになってる ファイルができてるからそれがそうだよ gccなら -E
- 995 名前:デフォルトの名無しさん [2017/07/16(日) 17:55:59.24 ID:i1aK64sE.net]
- class Kitty {
public: char *str; Kitty() { str = "Kitty on your lap\n"; } Kitty(const Kitty &obj) { str = "Di Gi Gharat\n"; } } g_obj ; int main() { Kitty obj = g_obj; cout << g_obj.str; cout << obj.str; return 0; } Kittyクラス終わりのセミコロンの間に変数g_objがあるんですがこれはどういう意味なんですか?
- 996 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:11:45.98 ID:0XlWr73/.net]
- 「int i; のセミコロンの前に変数g_objがあるんですがどういう意味ですか」
と訊いているに等しい
- 997 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:13:11.34 ID:0XlWr73/.net]
- 訂正
誤 変数 g_obj 正 変数 i
- 998 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:25:45.80 ID:dVrh8pbL.net]
- g_objはKittyのインスタンスだが
あまりこういう書き方はしないかもね
- 999 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 18:31:52.76 ID:ZbG5GhXO.net]
- >>981
Kitty と言うクラス定義とその型を持つ g_obj と言うグローバル変数を同時に定義している 要するに class Kitty { ... }; Kitty g_obj; を一つにまとめてるだけ
- 1000 名前:デフォルトの名無しさん [2017/07/16(日) 18:48:37.09 ID:i1aK64sE.net]
- >>982 >>984
レスありがとうございます >>985 わかりやすい解説ありがとうございました
- 1001 名前:デフォルトの名無しさん mailto:sage [2017/07/16(日) 22:25:00.23 ID:Z5uaiz2p.net]
- >>986
それはさておき >str = "Kitty on your lap\n" このウンコード、何かおかしいとは思わないのかね
- 1002 名前:デフォルトの名無しさん mailto:sage [2017/07/17(月) 00:15:32.26 ID:+UBTk6HR.net]
- >>987
ウンコードは食べるとニガいからな
- 1003 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 05:08:40.08 ID:gGqeofJB.net]
- ほ
- 1004 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 07:08:39.06 ID:vzMDiUgd.net]
- 次スレ立てたにゅ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】 mevius.2ch.net/test/read.cgi/tech/1500329247/
- 1005 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 19:37:15.43 ID:bPzCLpNs.net]
- おつ
- 1006 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 22:55:46.66 ID:KX2fhuwb.net]
- ひょっとして2ちゃんのこのスレ
他のC/C++相談所よりハイレベル!?
- 1007 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 07:02:25.97 ID:Jp1Fyagp.net]
- うめてんてー
- 1008 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 07:03:18.13 ID:Cx7F+3jm.net]
- 梅
- 1009 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 10:27:43.90 ID:MRnyPI+k.net]
- 他のC/C++相談所ってどこ?
- 1010 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 16:13:01.49 ID:AV+hYp2C.net]
- SNS の C++ コミュニティとかじゃね?
- 1011 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 17:00:45.76 ID:Si/VL0fD.net]
- それトリ割れしてるよ
#o%K%H:+O
- 1012 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 17:08:00.13 ID:AV+hYp2C.net]
- >>997
知ってるけど成りすましは一度しか出てきてないのでまあいいかなって。
- 1013 名前:デフォルトの名無しさん mailto:sage [2017/07/19(水) 17:33:56.27 ID:bGQD/KSW.net]
- このスレにはQさんがいるからな
Qさんがいれば安心だ
- 1014 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2017/07/19(水) 17:43:36.36 ID:AV+hYp2C.net]
- >>1000 を取れたら長門は俺の嫁
- 1015 名前:1001 [Over 1000 Thread.net]
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。 life time: 254日 18時間 45分 34秒
- 1016 名前:過去ログ ★ [[過去ログ]]
- ■ このスレッドは過去ログ倉庫に格納されています
|

|