X



C言語なら俺に聞け 140 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 6f8c-8ulf)
垢版 |
2017/05/11(木) 22:20:03.99ID:cn414UR90
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


http://echo.2ch.net/test/read.cgi/tech/1487757355/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0004デフォルトの名無しさん (ワッチョイ cfa9-xHOS)
垢版 |
2017/05/12(金) 16:05:36.32ID:UWkhiPx90
C99からif,for,whileの後に続く括弧の中がブロックのなかという
認識になったらしいんですけど、for以外でどうやって
その中で変数を宣言できるというんですか?
だったらforだけブロックの中っていうことでいいんじゃないんですか?
0005デフォルトの名無しさん (ワッチョイ c300-yCMP)
垢版 |
2017/05/12(金) 16:31:31.05ID:js7UY7om0
if ( char * p = malloc( N ) )
こういうのとか?
0017デフォルトの名無しさん (ワッチョイ c300-yCMP)
垢版 |
2017/05/13(土) 14:03:34.24ID:u94khtn50
コンパイラーによってはセキュリティ警告でも出るんだろうな
0033デフォルトの名無しさん (ワッチョイ 7f92-xFWy)
垢版 |
2017/05/14(日) 10:51:06.70ID:44d8vf440
>>32
a+=1 と ++a の評価は同じ
a+=1 と a++ の評価は違う
評価後の値はどちらも同じ

#include <stdio.h>
int main(void)
{
int a;

a = 0;
printf("%d\n", a); // a=0
printf("%d\n", a += 1); // a=1 評価結果はインクリメント後の値
printf("%d\n\n", a); //a=1

a = 0;
printf("%d\n", a); // a=0
printf("%d\n", ++a); // a=1 評価結果はインクリメント後の値
printf("%d\n\n", a); // a=1

a = 0;
printf("%d\n", a); // a=0
printf("%d\n", a++); // a=0 評価結果はインクリメント前の値
printf("%d\n\n", a); // a=1

return 0;
}
0034デフォルトの名無しさん (ワッチョイ 8ff3-SU9n)
垢版 |
2017/05/15(月) 10:50:08.41ID:ITGYMTaF0
int a=1;
a = a+++a;

これ、たいていの環境で 3 になるみたいだけど
内部ではどっちに構文解析されてるの?
0041デフォルトの名無しさん (ワッチョイ 7fcd-/tbB)
垢版 |
2017/05/15(月) 14:05:11.81ID:KBSLJwGw0
>>37
// GCCの場合
a=10;
printf("1: %d\n", a = a++ + a); // a=21
a=10;
printf("2: %d\n", a = ++a + a); // a=22
a=10;
printf("3: %d\n", a = a + a++); // a=21
a=10;
printf("4: %d\n", a = a + ++a); // a=22

1と2は予想通りだけど3と4は予想が外れた。
GCCは素直に前方から評価すると思っていたが、
インクリメント演算がある項を先に評価するようだ。
0048デフォルトの名無しさん (ワッチョイ 7f92-xFWy)
垢版 |
2017/05/15(月) 15:48:46.87ID:Vosr5hkL0
VC++での逆アセンブルコード (Visual Studio 2017 debugモード)

// a=a++
a = 10;
004037DE mov dword ptr [a],0Ah
a = a++;
004037E5 mov eax,dword ptr [a]
004037E8 mov dword ptr [a],eax
004037EB mov ecx,dword ptr [a]
004037EE add ecx,1
004037F1 mov dword ptr [a],ecx

// a=++a
a = 10;
004037F4 mov dword ptr [a],0Ah
a = ++a;
004037FB mov eax,dword ptr [a]
004037FE add eax,1
00403801 mov dword ptr [a],eax
00403804 mov ecx,dword ptr [a]
00403807 mov dword ptr [a],ecx

// a = a+++a
a = 10;
0040380A mov dword ptr [a],0Ah
a = a+++a;
00403811 mov eax,dword ptr [a] // aの値と
00403814 add eax,dword ptr [a] // aの値を加算して (a+a)
00403817 mov dword ptr [a],eax // 一時保存(評価)して
0040381A mov ecx,dword ptr [a] // 評価結果に対して
0040381D add ecx,1       // 1を加算して (a+a)++
00403820 mov dword ptr [a],ecx // 最終結果をaに代入
0052デフォルトの名無しさん (ワッチョイ 2375-QWrk)
垢版 |
2017/05/15(月) 16:26:58.46ID:K4VlRHcT0
>>49
https://godbolt.org
0053デフォルトの名無しさん (ワッチョイ 2375-QWrk)
垢版 |
2017/05/15(月) 16:38:44.35ID:K4VlRHcT0
>>51
a+++a;は未定義動作でしょ?
0055デフォルトの名無しさん (ワッチョイ 7f92-xFWy)
垢版 |
2017/05/15(月) 17:14:07.00ID:Vosr5hkL0
>>52を利用して逆アセンブルコードを調べてみた
スタックを使って細工するところとかコードの展開内容としては結構トリッキーだけど
GCCの場合のa=a+++a のイメージとしては
{
tmp = a, a=(++a) + tmp;
}
といった感じかな
>>54の言う通り内部的には別変数を利用しているとも言える

逆アセンブルコード
push rbp     
mov rdp, rsp
a = 10;
mov DWORD PTR [rbp-4], 10

a = a+++a;
mov eax, DWORD PTR [rbp-4] // aの値に

lea edx, [rax+1]
 // 1を加算して
mov DWORD PTR [rbp-4], edx // aに保存

add DWORD PTR [rbp-4], eax // aに元のaの値を加算
pop rbp
0056デフォルトの名無しさん (ワッチョイ 7f92-xFWy)
垢版 |
2017/05/15(月) 17:17:38.16ID:Vosr5hkL0
レイアウト崩れたので修正

逆アセンブルコード
 push rbp     
 mov rdp, rsp
a = 10;
 mov DWORD PTR [rbp-4], 10
a = a+++a;
 mov eax, DWORD PTR [rbp-4] // aの値に
 lea edx, [rax+1] // 1を加算して
 mov DWORD PTR [rbp-4], edx // aに保存
 add DWORD PTR [rbp-4], eax // aに元のaの値を加算
 pop rbp
0061デフォルトの名無しさん (ワッチョイ d3cd-+8ye)
垢版 |
2017/05/15(月) 22:35:38.71ID:m4iBjxKl0
ざっくりだけど
C99以前だとaの変更とその変更と関係ないaの評価を行っているからアウト
C11だとa++でのaへの1加算と、2つ目のaの評価に順序性がないからアウト
0064デフォルトの名無しさん (ワッチョイ 7f92-xFWy)
垢版 |
2017/05/16(火) 03:27:48.17ID:lv7gi33v0
>>63
関数呼び出しの順序の問題ではなくて、インクリメント演算子を自分自身に適用した場合の副作用の問題
f(x)の副作用としてg(x)の状態を変化させ、g(x)の副作用としてf(x)の状態を変化させるような場合、(f(x) + g(x))の評価は未定義ということ
0065デフォルトの名無しさん (ワッチョイ 7f92-xFWy)
垢版 |
2017/05/16(火) 03:34:54.85ID:lv7gi33v0
「インクリメント演算子を自分自身に適用した場合」は説明不足だった
「同じ式の中でインクリメント演算子を自分自身に繰り返し適用した場合」の方が適切だった
0070デフォルトの名無しさん (ワッチョイ 8383-hEfH)
垢版 |
2017/05/16(火) 18:26:04.60ID:j2WgBIQo0
大学の講義でc言語やってるのですが、行き詰まってしまったので質問させていただきます
分割コンパイルしているのですが、全部書いてあります
コメント文で分割コンパイルの区切りを表しています
http://codepad.org/VplJG9tZ
これによって表示されるものを左に90度回転させたいのですが条件としてmain関数しかいじってはいけないというものがあります
2次元配列でいけるのかと思ったのですが、どうしたらいいかわからず手詰まりです
よろしくお願いします
0075デフォルトの名無しさん (ワッチョイ 8383-hEfH)
垢版 |
2017/05/16(火) 21:05:08.54ID:j2WgBIQo0
>>71
すみません宿題スレとはどこでしょうか
0077デフォルトの名無しさん (ペラペラ SD9f-5YWk)
垢版 |
2017/05/16(火) 22:17:40.57ID:Ag35s8j3D
>>68
swiftだとa++は廃止された
分かりやすく書くってこと
0084デフォルトの名無しさん (ワッチョイ c300-yCMP)
垢版 |
2017/05/16(火) 23:17:13.00ID:f+nf4d790
インクリメントが無い言語はクソ
0093デフォルトの名無しさん (ガックシ 067f-sbka)
垢版 |
2017/05/17(水) 16:12:39.52ID:IVbqBIIG6
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main()
{
int i, j, a; //int 整数
FILE *fout; //FILE ファイルの管理用
errno_t error;
if ((error = fopen_s(&fout, "output.txt", "w")) != 0){
printf(" エラー:ファイルの出力ができませんa \n");
exit(1);
}
a = 0;
for (i = 0; i<5; i++){
for (j = 0; j<10; j++){
a = a + 1;
fprintf_s(fout, "%d ", a);
}
fprintf_s(fout, "\n");
}
fclose(fout);
}
これにIf文使って
0 0 0 0 0 0 0 0 0 0
0 0 0 14 15 16 17 0 0 0
0 0 0 24 25 26 27 0 0 0
0 0 0 34 35 36 37 0 0 0
0 0 0 0 0 0 0 0 0 0
にするにはどうすればいいの?おしえてエロい人
0096デフォルトの名無しさん (ガックシ 067f-sbka)
垢版 |
2017/05/17(水) 16:24:58.51ID:IVbqBIIG6
>>94
大学生です。
指定場所以外も数字が出てしまいます
0099デフォルトの名無しさん (ガックシ 067f-sbka)
垢版 |
2017/05/17(水) 16:45:05.44ID:IVbqBIIG6
>>95
ベン図的な考え方ですか......!!
ありがとうございます。
>>97
なぜか0〜50全て表示されてしまってます!
>>98
エロ魔人になるにはまだ早いです!
0102デフォルトの名無しさん (ワントンキン MM1f-QWrk)
垢版 |
2017/05/17(水) 18:52:23.54ID:81y1dPE2M
初心者にありがちな無意味なコメントだね
0105デフォルトの名無しさん (ワッチョイ 5bc3-2WpE)
垢版 |
2017/05/18(木) 06:55:44.12ID:Zs9E6Q4t0
俺なら条件部分は↓のように書くかな。
if ((a >= 10) && (a < 40) && ((a % 10) >= 4) && ((a % 10) <= 7)) {
「表示する値、表示しない値を条件に判断」という雰囲気。

普段は表組みの行と列の番号(変数i, j)で制御するけど、
この問題だとaの1の桁の値とjの値が一致しないから何やら座りが悪い感じ。
a = 10*i + j + 1;
みたいに「行と列の表示位置から表示すべき値を算出」なら馴染むんだけど。
0107デフォルトの名無しさん (ドコグロ MM62-J3Da)
垢版 |
2017/05/18(木) 12:47:56.59ID:Zif2rhHOM
>>105
> if ((a >= 10) && (a < 40) && ((a % 10) >= 4) && ((a % 10) <= 7)) {
なんかちょっとイラッとくる
if ((10 <= a) && (a < 40) && (4 <= (a % 10)) && ((a % 10) <= 7)) {
の方が分かりやすいじゃん
って思うのは俺だけかな

まあそもそも >>95 でいいと思うが
0111デフォルトの名無しさん (ワッチョイ 3e0d-Yh7p)
垢版 |
2017/05/19(金) 08:23:29.86ID:/7Hxktnz0
if (10 <= a && a < 40 && 4 <= a % 10 && a % 10 <= 7) {
ほらすっきり。
0113デフォルトの名無しさん (ワッチョイ 3e0d-Yh7p)
垢版 |
2017/05/19(金) 13:22:27.31ID:/7Hxktnz0
10で剰余したものをビットマスクって、おまえ何屋?
ビット演算子はB言語の名残で変な結合するから気をつけたほうがいいが
その話と>>111のコードは関係ないぞ
0117デフォルトの名無しさん (ブーイモ MM96-JCxV)
垢版 |
2017/05/19(金) 15:36:33.74ID:9d9oZwpEM
>>112
それ14の判定結果からして偽じゃね?
0124デフォルトの名無しさん (ワッチョイ 3e0d-Yh7p)
垢版 |
2017/05/19(金) 17:08:03.89ID:/7Hxktnz0
>>122
=は右
これ豆なw
0125デフォルトの名無しさん (ブーイモ MM96-JCxV)
垢版 |
2017/05/19(金) 17:10:52.81ID:9d9oZwpEM
>>118
あ、そうか。確かに。
0128デフォルトの名無しさん (ブーイモ MM76-JCxV)
垢版 |
2017/05/19(金) 21:31:34.84ID:91iCt1N+M
yagniかkissかってところ?
0131デフォルトの名無しさん (ワッチョイ 636e-F2TF)
垢版 |
2017/05/19(金) 23:37:00.55ID:jsPxGdeJ0
Cは、ライブラリがすくない。おぼえることがすくない
0132デフォルトの名無しさん (ワッチョイ dea9-ysFl)
垢版 |
2017/05/20(土) 06:07:10.11ID:ZnY/c9+20
関数にinlineをつけて外部定義を無くせば
インライン展開されなければinline staticと違って
リンカエラーになるとおもってたんですけど、
inline staticを使ったときにはインライン展開される関数が
inlineをつけて外部定義の無くすとリンカエラーになります
なぜですか?
0133デフォルトの名無しさん (アウアウエー Sac2-PCQh)
垢版 |
2017/05/20(土) 08:13:36.98ID:Ykf9CvnEa
>>131
野良ライブラリが多いのは多分Cが一番だろうけどな。
何かしらの言語の野良ライブラリの元はCの野良ライブラリが必要で〜とかで、Linuxじゃないと集めてられない。
Win32APIもC前提だけど、多分MSの中の人もいくつあるか把握出来てないんじゃないかな。
0134デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/20(土) 18:45:47.54ID:AtO1B5PX0
ISO/IECだってしょせんはブランドの1つでしかなく
別に数学的な公理とかじゃないからな
0138デフォルトの名無しさん (ワッチョイ afcd-cm4/)
垢版 |
2017/05/20(土) 22:38:50.18ID:feiyOPgg0
>>136
区切りで「/」使いたいなら、パス全体を「"」で括る
「/」以降をオプション「.」をコマンドとして認識するから、全体で一つのコマンドと認識させる必要がある

「/」を区切りに使うのはunix
windowsでも一応使えるけど普通はバックスラッシュ使う
0143デフォルトの名無しさん (ワッチョイ b33c-ysFl)
垢版 |
2017/05/21(日) 11:36:43.59ID:p33VUuKu0
#include <stdio.h>
int main(void){

char i[100];

printf("名前を入力してね。\n");
scanf("%s",i);
printf("%sさんですね。\n",i);

return 0;
}

7行目scanf関数で、&iでなくて、iでいけるのはなぜですか?
0145デフォルトの名無しさん (ワッチョイ 9f92-cm4/)
垢版 |
2017/05/21(日) 11:44:04.43ID:JHzb8j250
>>142
&はアドレス演算子で、その変数がメモリ上のどのアドレスにあるかを示す
scanf関数で&を使うのは、つまり、「この変数のアドレスに読み取ったものを書き込め」という意味になる。

しかし文字列などの配列は、配列名自身が「配列の一番最初の要素へのアドレス」を示すものになっているので
配列には&が不必要
0146デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 12:20:22.06ID:EhbYbiNc0
>>144
printf("%u", sizeof i);
これで4だか8だかになるとでも?
0147デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 12:22:40.28ID:EhbYbiNc0
クズの言い方だと
float a = 1.5f;
printf("%f", a);
これが問題なく動作するから、
よって a は double 型だと言っているようなものだ
0150デフォルトの名無しさん (アウアウエー Sac2-PCQh)
垢版 |
2017/05/21(日) 12:32:18.38ID:wd4rgPA1a
あ、読み込み専用ってのは値が変えられないんじゃなくて、アドレスを変えられないって意味ね。
関数に渡された配列iをi++ってするとi[a++]と同じ意味になる。
(Cでi[a++]なんて書き方許されたかは忘れたが意図は組んでくれ)
0152 ◆QZaw55cn4c (ワッチョイ 03af-gH2G)
垢版 |
2017/05/21(日) 12:41:04.19ID:pUWFtSb10
>>146
そりゃ配列とポインタは振る舞いがまったく同一というわけではなく,はっきりいって別物だから,言い分はわからんでもない.

>>143
訂正する,配列名を示す識別子は配列の先頭を示すポインタになる >>145 が丁寧な説明だ


>>147
そのたとえは意味不明,可変長引数の可変部は float->double に格上げされることを隠すなんでひどい物言いだね
0161デフォルトの名無しさん (ワッチョイ aa18-JCxV)
垢版 |
2017/05/21(日) 17:32:24.58ID:ViqOYprV0
何でいきなり構文解析器の話になった?
0164デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 17:59:27.49ID:EhbYbiNc0
>>149
コンパイルエラーって、どこが?
https://ideone.com/VpAiLB

>>152
147だが、最後ふじこってんじゃん
落ち着いてもっぺん日本語で書いてくれ
0168デフォルトの名無しさん (ワッチョイ 6b3c-kvD5)
垢版 |
2017/05/21(日) 19:20:07.02ID:lXB+sVuE0
%f は 引数を double 仮定で引き出す
呼び出し側は (可変長引数の可変部なので) doubleに格上げしてから引数に詰んでる

詰んでるものと引き出すものの食い違いはおきてないんじゃないかね
0169 ◆QZaw55cn4c (ワッチョイ 03af-gH2G)
垢版 |
2017/05/21(日) 19:28:27.25ID:pUWFtSb10
>>168
>積んでるものと引き出すものの食い違いはおきていない
そりゃ引数に積むときに float->double しているから,そうなって当然だが,その事実を隠したまま
>>147
を主張されても,そりゃないよ,としかいいようがない.
0171デフォルトの名無しさん (ワッチョイ afcd-cm4/)
垢版 |
2017/05/21(日) 19:40:24.59ID:kPjNSBDr0
配列型の"式"は、一部のケースを除いてポインタ型の式に"型変換"される、それは配列の先頭要素を指す、また左辺値でもない
関数の実引数での使用についてなら、>>147の既定の実引数拡張でfloatがdoubleに拡張(型変換)される例と同じような話だと思うんだけどな
0176デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 21:39:54.59ID:EhbYbiNc0
>>174
int main(void)
{
char i[100];
wanker(&i);
return 0;
}

void wanker(char (*j)[100])
{
/* ここは、「配列を関数に渡した先(関数の中)」だが? */
printf("%u", sizeof *j);
}
0177デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 21:45:09.31ID:EhbYbiNc0
>>169
隠している? それは聞き捨てならんな
公文書に書かれていることを俺がどう隠したとぬかす?
0179デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 22:00:12.54ID:EhbYbiNc0
>>178
どう無理なんだ?
int main(void)
{
int i[100];
booger(&i);
return 0;
}

void booger(int (*j)[100])
{
printf("%u", sizeof *j);
}
0183デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 22:10:36.85ID:EhbYbiNc0
176でも初期化はしてないが
0184デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 22:13:36.56ID:EhbYbiNc0
>>182
型をかけばいいって、こうか?
if (sizeof i != sizeof(char*)) puts("ahem!!");
0186デフォルトの名無しさん (アウアウエー Sac2-PCQh)
垢版 |
2017/05/21(日) 22:39:46.18ID:fA6hmJLUa
>>179
分かってきたかも。
そのコードだと

int *i;
ってポインタ宣言すると

iのままがポインタで、*iがポインタの指す中身だから。。。

配列の実体になるんだ。

もっとシンプルに初心者のやりがちな

int main(void)
{
int i[100];
booger(i[100]);
return 0;
}

void booger(int i[100])
{
printf("%u",sizeof a[100]);
}

こう言うコードだとポインタのサイズが返ってくる。
0189デフォルトの名無しさん (ワッチョイ dea9-ysFl)
垢版 |
2017/05/22(月) 06:47:21.18ID:3isejMaU0
void f(void * v, int size, void * x){
*v=*x;
}
上のコードで x の指し示す値のサイズが size であるとき
どのようにvの指し示す場所にxが指し示す値を一度に代入できますか?
0194デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 09:21:02.66ID:uUtJqX7+0
while(size--) *(char*)v++ = *(char*)x++;
0199デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 13:11:20.22ID:uUtJqX7+0
>>195
すまん、素でボケてたw

しかしこれ構文規則には違反してないぞ
意味論においてvoid*の増分が禁止されているって話で
0202デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 17:02:12.42ID:uUtJqX7+0
cc love.c じゃなく
make love でいい件か?
0204デフォルトの名無しさん (ブーイモ MMea-ysFl)
垢版 |
2017/05/22(月) 19:41:32.06ID:h9CxmUP8M
>>201
まじか、知らなかった
0206デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 20:02:28.46ID:uUtJqX7+0
便利にゃ違いないけど
ロクに指示も与えずよきに計らえってスタンスで
何が出来てくるのかに受動的でいることに
俺は我慢できないな

無関心な大将を有能な部下がフォローして事なきを得たってことだろ
0207デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 20:02:58.11ID:uUtJqX7+0
だからスタックサイズのデフォも知らない馬鹿が大量発生するわけだし
0215デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 21:42:16.48ID:uUtJqX7+0
そういうオチか
ばかたれぃっ!!
0218デフォルトの名無しさん (ワッチョイ 07cd-d60Q)
垢版 |
2017/05/23(火) 09:00:04.50ID:BTD2Lf690
>>208-209>>217
C99規格には「(void *)c++ は1だけインクリメントされる」という規定はない。
C99規格書(ISO/IEC 9899)は英語なのでそれを元にしたJIS X3010で説明する。
X3010は章番号を変えてないのでISO/IEC 9899の該当文章は自分で確認してくれ。

ISO/IEC 9899:TC2
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf
JIS X3010
http://kikakurui.com/x3/X3010-2003-01.html

> 6.2.5 型
> 型は,オブジェクト型(オブジェクトを完全に規定する型),関数型(関数を規定する型),
>及び不完全型(その大きさを確定するのに必要な情報が欠けたもの)に分類する。
> void型の値の集合は空とする。それは,完全にすることのできない不完全型とする。
> void へのポインタは,文字型へのポインタと
> 同じ表現及び同じ境界調整要求をもたなければならない。

voidは不完全型だがvoid*はオブジェクト型でchar*と相互に代入可能だ。

> 6.5.3.4 sizeof 演算子
> sizeof演算子は,関数型若しくは不完全型をもつ式,それらの型の名前を括弧で
> 囲んだもの,又はビットフィールドメンバを指し示す式に対して適用してはならない。
> 型char,unsigned char若しくはsigned char(又はそれらの修飾版)をもつ
> オペランドに適用した場合の結果は,1 とする。

不完全型であるvoidにはsizeofを適用できない。
char派生はサイズ1と明確に規定されているがvoidのサイズは規定がない。
だから(void *)c++が元の値のままでもC99規格違反ではない。
0222デフォルトの名無しさん (ワッチョイ cb92-UOaC)
垢版 |
2017/05/23(火) 11:24:40.32ID:ufwaINxg0
>>218
ポインタの算術演算なので参照するところが違う
6.5.6-2の定義で加算可能なポインタは「オブジェクトへのポインタ」であり、
void *はキミが引用した6.2.5によりこの条件を満たさない 従ってQzはうんこ 今すぐ死ね

6.5.6 Additive operators
2 For addition, either both operands shall have arithmetic type,
or one operand shall be a pointer to an object type and the other shall have integer type. (Incrementing is equivalent to adding 1.)
0225 ◆5HCMEYYr5o (ワッチョイ 1b35-mR0Q)
垢版 |
2017/05/23(火) 12:35:42.70ID:F0rvxaiH0
この件、過去に私が書いたコードを元に議論されたんだよね、当時の書き込みが見つからない…

>>218
>>222
ありがとうございます。感謝です。うれしいです。

>>218
>void へのポインタは,文字型へのポインタと
>同じ表現及び同じ境界調整要求をもたなければならない。

というのだから

>>222
当然、(char *)++ と (void *)++ は同じだよね
0230デフォルトの名無しさん (ワッチョイ 07cd-d60Q)
垢版 |
2017/05/23(火) 13:03:46.65ID:BTD2Lf690
>>225
「同じ表現及び同じ境界調整要求」と同じ演算ができるかは別の話だ。
const変数は非const変数と「同じ表現及び同じ境界調整要求」だが変更できない。

>>222のJIS X 3010:2003該当部分は下記の通りだ。
voidはオブジェクト型ではなく不完全型だからvoid*に加減演算するのは規格外だ。

> 6.5.6 加減演算子
> 制約 加算の場合,両オペランドが算術型をもつか,又は一方のオペランドがオブジェクト型への
> ポインタで,もう一方のオペランドの型が整数型でなければならない。(増分は 1 の加算に等しい)
0231デフォルトの名無しさん (ワッチョイ b33c-7Hrf)
垢版 |
2017/05/23(火) 15:16:25.17ID:Eouhg5rk0
gccでも-pedanticオプションを使えばgcc拡張を警告するぞ
-std=c99オプションに頼るな

gcc-8の警告文
warning: wrong type argument to increment [-Wpointer-arith]

clang-5の警告文
warning: arithmetic on a pointer to void is a GNU extension [-Wpointer-arith]
0233デフォルトの名無しさん (アウアウカー Sacb-W7a5)
垢版 |
2017/05/23(火) 17:50:06.75ID:YSxby3lha
>>225
char型へのポインタ型のオブジェクトとvoid型へのポインタ型のオブジェクトが同じ境界調整を持つという規格が
なぜchar型のオブジェクトとvoid型のオブジェクトが同じサイズという話になるの?
0234デフォルトの名無しさん (ワッチョイ 1b35-mR0Q)
垢版 |
2017/05/23(火) 18:08:28.42ID:F0rvxaiH0
>>230
なるほど、感謝です。
この議論、以前にも(自分のコードを対象に)問題になって、そのときは
void *p;
に対して
p + 3
が意味をもつのか、というあたりだったのですが、当時の議論に誤りがあったのかもしれません。
なお手元のgcc5.3.0 では -ansi -Wall で警告を出してくれませんでした。

>>228
あなたにもとっても感謝してますよ
これからもどうかご教示ください :-)

>>233
えっ、そう読むのか…
0235デフォルトの名無しさん (アウアウカー Sacb-W7a5)
垢版 |
2017/05/23(火) 18:17:27.01ID:YSxby3lha
>>234
それ以外にどう読むの?
「同じ表現」はポインタ型のオブジェクトの内部表現の話だよね
並列で書いてある「同じ境界調整」もポインタ型のオブジェクトの境界調整の話と捉えるのが自然じゃないの
0236デフォルトの名無しさん (アウアウカー Sacb-W7a5)
垢版 |
2017/05/23(火) 18:22:45.88ID:YSxby3lha
>>234
あと、-Wpointer-arithって言われてるのに、なんでWallで確認してるの?
Wallを勘違いしてない?
0238デフォルトの名無しさん (ワッチョイ 1b35-mR0Q)
垢版 |
2017/05/23(火) 18:40:44.02ID:F0rvxaiH0
>>235
該当部分を読むと

JIS 6.2.5
>void へのポインタは,文字型へのポインタと同じ表現及び同じ境界調整要求をもたなければならない ( 39 ) 。
>同様に,適合する型へのポインタ同士の場合,修飾版であるか又は非修飾版であるか(const とかのことby QZ) にかかわらず,
>同じ表現及び同じ境界調整要求をもたなければならない。
>構造体型へのポインタは,すべて同じ表現及び 同じ境界調整要求をもたなければならない。
>共用体型へのポインタは,すべて同じ表現及び同じ境界調整 要求をもたなければならない。
>これ以外の型へのポインタは,同じ表現又は同じ境界調整要求をもつ必要はない。

これを読んで感じるのは、つまりポインタ自身の表現やアラインメントを、いろいろ細分化する実装を思いつかない
far とか near とかでもなさそうだ。
細分化するとすればむしろポインタが指す先に関することではないだろうか?

>>236
え?-Wall って全部だすんじゃなかったんですかね。たぶん勘違いしていると思う。
0239デフォルトの名無しさん (ワッチョイ cac8-amUu)
垢版 |
2017/05/23(火) 18:40:46.39ID:wffizmnr0
汎用ポインタのインクリメントは、
エラーが出るか1進むかだろう。
0240デフォルトの名無しさん (ワッチョイ 9e28-Yh7p)
垢版 |
2017/05/23(火) 18:41:11.96ID:7CxjD8/v0
>>235
境界調整が同じでもサイズの違うオブジェクトへのポインタはあるだろ
char *a, (*b)[2];

K&R C では char* でよかった用途に、
なぜ、わざわざ void* を持ち込んだのか考えてみれ
サイズが 1 なのが気持ち悪くて、
サイズが不明ということにするためだろうが

この期に及んで void* が指す先のサイズが 1 とか言い出す
どスカタンがもしいたら死刑でいい話だぞ
0241デフォルトの名無しさん (アウアウカー Sacb-W7a5)
垢版 |
2017/05/23(火) 18:46:38.37ID:YSxby3lha
>>240
安価先間違ってない?
ポインタの指すオブジェクトのサイズが一緒なんて一言も書いてないんだけど
0245デフォルトの名無しさん (ワッチョイ 9e28-Yh7p)
垢版 |
2017/05/23(火) 19:00:42.38ID:7CxjD8/v0
>>241
IDで追ってみたら、おまえさんの疑いは晴れた
すまんかった
0246 ◆QZaw55cn4c (ワッチョイ 1b35-mR0Q)
垢版 |
2017/05/23(火) 19:01:37.22ID:F0rvxaiH0
>>244
void *memmove(void *dst, const void *src, unsigned n);
void *memcpy(void *dst, const void *src, unsigned n);
にて char * ではなく void * になっている理由はなにか?
0249デフォルトの名無しさん (ワッチョイ afcd-cm4/)
垢版 |
2017/05/23(火) 19:31:53.76ID:ZdN5y2SH0
>>238
Wallは全ての警告が有効になるわけではない
https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/Warning-Options.html#index-Wall

> これを読んで感じるのは、つまりポインタ自身の表現やアラインメントを、いろいろ細分化する実装を思いつかない
> far とか near とかでもなさそうだ。
> 細分化するとすればむしろポインタが指す先に関することではないだろうか?
思いつかないなら、同じにすれば良いだけでしょ
そこからなぜ「同じ表現」はポインタの話なのに、「同じ境界調整要求」はポインタの先のオブジェクトの話になるの?

>構造体型へのポインタは,すべて同じ表現及び 同じ境界調整要求をもたなければならない。
>共用体型へのポインタは,すべて同じ表現及び同じ境界調整 要求をもたなければならない。
構造体/共用体型のオブジェクトが等しい境界調整要求を持つほうが非現実的でしょ
0250デフォルトの名無しさん (ワッチョイ 9e28-Yh7p)
垢版 |
2017/05/23(火) 22:10:38.61ID:7CxjD8/v0
>>247
K&R C では char* をキャストなしで変換できてたが?
int *a = malloc(4);
0251デフォルトの名無しさん (ワッチョイ 9e28-Yh7p)
垢版 |
2017/05/23(火) 22:57:03.61ID:7CxjD8/v0
>>246
バス幅が8bitでないハードでもったいないことしないためだろ
0252デフォルトの名無しさん (ワッチョイ afcd-cm4/)
垢版 |
2017/05/23(火) 23:35:41.22ID:ZdN5y2SH0
>>238の通りQZは「構造体型のオブジェクトが全て同じ境界調整要求をもつ」と主張してるからな

この世に存在する大多数のコンパイラが規格に準拠していないという新説を主張しているぐらいだら
QZの脳内には、余人には考えつかない理屈があるんだろ
0255デフォルトの名無しさん (エーイモ SE8a-9r6K)
垢版 |
2017/05/24(水) 15:28:53.02ID:QjzRyjLLE
すいませんこのスレにワッチョイを導入した経緯ってなんですか?
0256デフォルトの名無しさん (ワッチョイ 9e7c-Yh7p)
垢版 |
2017/05/24(水) 18:24:04.77ID:yvqQkV490
>>254
言い忘れ
今のCだって void* を void* 以外のポインタに変換できるが
あくまで推奨としてキャストする慣習があるだけで、
キャストが義務化されたのは C++

なので >>247 はかなり斜め上
あることを言い忘れているのだろうと好意的に解釈しても
互換とは何かについて考察が甘いと言わざるを得ない
0258デフォルトの名無しさん (ワッチョイ 9e7c-Yh7p)
垢版 |
2017/05/24(水) 18:36:39.06ID:yvqQkV490
>>257
そりゃ、管の方言だろ
cl, gcc, clang-cl どれもok
0259デフォルトの名無しさん (ササクッテロロ Sp03-4D2f)
垢版 |
2017/05/24(水) 19:26:19.45ID:E7SQQ2iip
PStructA pstA[10];
に対して
&pstA[1] と pstA+1 は同じ一番目のポインタを返すという認識で合ってるでしょうか?
ポインタ演算と配列の違いが腑に落ちてないです
0260デフォルトの名無しさん (ワッチョイ 6b00-Gjiu)
垢版 |
2017/05/24(水) 19:45:56.66ID:L7sKwR/z0
アドレス取得が後か先かの違いじゃない?
あんまり深く考えるとハゲるよ
0263デフォルトの名無しさん (ワッチョイ 0fbc-OpMt)
垢版 |
2017/05/25(木) 10:12:33.17ID:NxjYanVn0
>>261
できる/できないを、何を基準に言っている?
K&R 仕様の cc は死ぬほど寡黙なコンパイラで
だからこそ lint が別で用意されていたんだぜ
0268デフォルトの名無しさん (ワッチョイ 8b92-6MgW)
垢版 |
2017/05/25(木) 12:50:12.06ID:0WgUeo5I0
>>263
ああ、思い出して来た
K&R(コンパイラ)では代入でポインタの型検査を行わなかった
関数呼び出し関数プロトタイプがないのでできなかった
すなわち全てポインタ型は互換だった

ここにポインタの型検査を持ち込むんだからK&Rでの「互換」はANSI Cか必要とした「互換」ではなく当然に役にたたない
従って、>>250は的はずれな指摘
0269デフォルトの名無しさん (ワッチョイ 0fbc-OpMt)
垢版 |
2017/05/25(木) 14:30:16.20ID:NxjYanVn0
落ち着けよ
代入と関数原型は関係ないし
格助詞がふじこってるぞ
0271デフォルトの名無しさん (ワッチョイ 0fbc-OpMt)
垢版 |
2017/05/25(木) 15:59:46.97ID:NxjYanVn0
いや、だから代入と関数原型は関係ねえってば
代入が関数なのはC++だぞ
0273デフォルトの名無しさん (ワッチョイ 0fbc-OpMt)
垢版 |
2017/05/25(木) 21:47:16.88ID:NxjYanVn0
代入には型検査がもともとあった
double a = 1.5;
int b;
b = a;
b には (int)a の値が正しく代入され
決して a の bit63-32 が切り裂きコピーされることはない
0278デフォルトの名無しさん (ワッチョイ 0f29-OpMt)
垢版 |
2017/05/26(金) 09:57:19.90ID:qaraDccl0
>>274
char *a = "QZ";
int *b;
b = a;
で、これの何が関数呼び出しと関係があるんだ?
俺のページフォールトはいいから
おまえのラッチアップを何とかしようや
0280デフォルトの名無しさん (ワッチョイ 0f29-OpMt)
垢版 |
2017/05/26(金) 11:12:11.70ID:qaraDccl0
>>279
わかんねえよデフェクト野郎

代入での型の検査の話だが
お前の制御記憶にはショートモードの故障が発生してるぞ
0282デフォルトの名無しさん (ワッチョイ 0f29-OpMt)
垢版 |
2017/05/26(金) 11:33:23.33ID:qaraDccl0
>>281
アホウはおまえ
>>240から始まって247-250と流れてるのが
おまえにはANSI-Cの話に見えるのか

どうでもいいがCの規格文書名はISO/IEC9899だろうが
未だにX3.159-1989を拠り所としている化石かおまえ?
0283デフォルトの名無しさん (ワッチョイ 8b92-6MgW)
垢版 |
2017/05/26(金) 13:06:41.64ID:IXNjZ2pR0
アホウ ポインタの型検査が規格になったのはANSI-Cだ

> K&R C では char* でよかった用途に、
> なぜ、わざわざ void* を持ち込んだのか考えてみれ
> サイズが 1 なのが気持ち悪くて、
> サイズが不明ということにするためだろうが
このバカ(お前?)が決定的に間違ってる
void*が必要になったのはポインタ型検査に伴い発生する不都合を解消するためだ
それがあらゆる型へのポインタと互角なポインタであり、その役割をvoid *に割り当てた
0284デフォルトの名無しさん (ワッチョイ 0f29-OpMt)
垢版 |
2017/05/26(金) 15:24:42.21ID:qaraDccl0
>>283
> ふじこふじこ

>>250もっぺん読め
別に不都合なんか起きてなかったぜ

どうでもいいが、あらゆる型へのポインタと互角に戦えるポインタがあったとして
それ以外のポインタってつおい? compatibility を日本語では互換性だ
ボビーオロゴンみたいな日本語を素でやるな池沼
0288デフォルトの名無しさん (ワッチョイ 0f29-OpMt)
垢版 |
2017/05/26(金) 22:00:35.72ID:qaraDccl0
>>285
で、どんな「不都合」が生じたというんだ?
空想論を一切含まない具体的な例示をしてみろ
0290デフォルトの名無しさん (ワッチョイ 0f29-OpMt)
垢版 |
2017/05/26(金) 22:06:47.38ID:qaraDccl0
K&R1はCの元々のコンセプトを純粋に美しく語っているもので
これに嫌悪感を持ったり無関心な者はCの本質を知らないのではなく解りたくない者で
去る者は拒まずの消極的破門でいい
0293デフォルトの名無しさん (ワッチョイ 7bf9-OpMt)
垢版 |
2017/05/27(土) 06:58:12.92ID:ucevWPfX0
>>292
戯れ言も、せめて事実に基づいてぬかせシャブ中野郎
キャストなんかいらねえのに
おまえが何か思い込んでるのは
コンパイラに警告されたからだろうが
警告って何かわかってねえのまる出しだな
0296デフォルトの名無しさん (ワッチョイ 4b35-+I1J)
垢版 |
2017/05/27(土) 15:46:27.40ID:4RTqTK2k0
>>285
>K&Rではポインタの型検査を行ってなかったので、char *(に限らず全てのポインタ)が互換だっただけだ
が事実だったら

>>292
>memcpyとか一々キャストしなきゃならないだろ
ではないのではないだろうか?
0302デフォルトの名無しさん (ワッチョイ 4b10-OpMt)
垢版 |
2017/05/28(日) 07:21:49.29ID:cMxKlmAA0
>>294
ほらな、警告とは何かがわかってない
X3.159-1989ではエラーも警告も定義していない
それらは特定のコンパイラ製品の挙動だ

特定のコンパイラにdisられたら
自分が悪いんだろうとしか思えない
ど初心者の心理からいつまで経っても
卒業できないポンコツPG乙
0305デフォルトの名無しさん (ワッチョイ 2b75-sfkZ)
垢版 |
2017/05/28(日) 21:50:21.98ID:HrcHJfqb0
>>299
いつの時代のfreeは値返したの?
0306デフォルトの名無しさん (ワッチョイ bb6e-+G4n)
垢版 |
2017/05/28(日) 21:54:08.04ID:QPUrPhGM0
ANSI C以外を語るじじいが居座るスレかよw
0307デフォルトの名無しさん (ワッチョイ 4b10-OpMt)
垢版 |
2017/05/28(日) 21:55:27.91ID:cMxKlmAA0
K&Rにはvoidがなく返却値の型を省略すればintと見なされた
returnがないか空のreturn;は不定を返した
これだけ言えばわかるな?
0308デフォルトの名無しさん (ワッチョイ bb6e-+G4n)
垢版 |
2017/05/28(日) 22:01:09.82ID:QPUrPhGM0
C言語はUNIXの仕様が前提だから、そこまで含めて移植しなかったから混乱した。
0310デフォルトの名無しさん (ワッチョイ 2b75-sfkZ)
垢版 |
2017/05/28(日) 22:10:09.67ID:HrcHJfqb0
>>307
いや、freeが何返してたのか解らんけど。それをcastする理由も。
まぁ、一生使うことのない知識だからどうでも良いけどね。
0314デフォルトの名無しさん (ワッチョイ 0f9c-kS8n)
垢版 |
2017/05/29(月) 01:16:09.85ID:j0cmL5ae0
返却値と返り値で、何が違うの?
確かに返却値って言葉はあまり使わない気がするけど、そんなこだわるほどのもん?
0317デフォルトの名無しさん (ワッチョイ 0f9c-kS8n)
垢版 |
2017/05/29(月) 01:53:50.29ID:j0cmL5ae0
>>316
その君の言うところの意味が、「返す」と何が違うの?って話。
「返す」を大辞林で引いたら一番目の意味に「返却」と書いてある事実をどう考える?

所詮その程度の主観的な印象に過ぎない物を、人に押し付けられても…
まあ、2chだし、言うのも勝手か。
0318デフォルトの名無しさん (ワッチョイ 2b75-sfkZ)
垢版 |
2017/05/29(月) 02:14:29.26ID:JtPPrjAE0
>>317
返すの意味の一つに返却があるというだけでイコールでは無いと思うけどね。
例えば”上げる”とか辞書引いたら色んな意味が載ってて一番目に載ってる意味と関連するわけではないということは解るよね。
0320デフォルトの名無しさん (ワッチョイ 0f29-OpMt)
垢版 |
2017/05/29(月) 05:18:14.60ID:6wk42oha0
>>313
それは日本鉱業標準審査会に言え
俺に言うな、わかった?
0324デフォルトの名無しさん (ワッチョイ 0f9c-kS8n)
垢版 |
2017/05/29(月) 09:05:50.24ID:j0cmL5ae0
>>319
おかしくないと思うけど?
0328デフォルトの名無しさん (ワッチョイ bb6e-+G4n)
垢版 |
2017/05/29(月) 09:40:08.06ID:3z87Obs+0
ここまで「却」という漢字の調べた者なしw

「却」の意味は答えると「返却値」はおかしいが、英語でReturnと言ってるので返却と翻訳したのだろう。
0330age (ワッチョイ db8d-InMg)
垢版 |
2017/05/29(月) 11:00:15.37ID:T5H0S0Nm0
Windows環境のHANDLE型について教えて下さい。
Windows10/64環境下とWindows7/64環境ではHANDLE型の扱いは異なるのでしょうか?

HANDLE型が使用できない処理系の為に
HANDLE型を返すWindowsのAPIにラッパする形でHANDLE型を整数(unsigned long)にキャストするDLLを作成し、
HANDLE型が使用できない処理系から作成したDLLを通して目的のAPIを使用していました。

Windows7の32/64ビット環境では動作しているのですが、
Windows10の64ビットでは動作しません。
(Windows10/32ビットでは動作しています。)
0332デフォルトの名無しさん (ワッチョイ 2b75-sfkZ)
垢版 |
2017/05/29(月) 11:27:00.44ID:JtPPrjAE0
>>330
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
HANDLEはPVOID
PVOIDはvoid*
つまり64bitのWindowsアプリケーション(LLP64環境)では64bit 同環境でunsigned longは32bit
つまりWindows7ではたまたま動いてるだけ。
0333デフォルトの名無しさん (アウアウアー Sa7f-+G4n)
垢版 |
2017/05/29(月) 13:16:39.33ID:6ZDN/iGxa
>>330
Windows SDKの話をここでするなというやつがいるから、Windows SDKスレを探したらないんだなw
0340デフォルトの名無しさん (ワッチョイ 1f7b-OpMt)
垢版 |
2017/05/29(月) 20:55:21.03ID:zjgINM2w0
ここの過半数が訳語「返却値」を知らないわけか
マジでアホの集まりだな
0341デフォルトの名無しさん (ワッチョイ 0f9c-kS8n)
垢版 |
2017/05/29(月) 21:35:32.81ID:j0cmL5ae0


0345デフォルトの名無しさん (ワッチョイ ab6e-cSoe)
垢版 |
2017/05/29(月) 22:54:17.27ID:hRA+Cftk0
returnは、他動詞だから、返す値だろ。返された値
シェーン、カムバック!
0346330 (ワッチョイ db8d-InMg)
垢版 |
2017/05/30(火) 09:45:25.55ID:Kzko1WIk0
>>332

ありがとうございました。
「たまたま動いているだけ」が妙に納得しました。
0348デフォルトの名無しさん (ワッチョイ 4b10-OpMt)
垢版 |
2017/05/31(水) 05:42:53.04ID:89AX9+Wb0
>>343
知らないおまえは最悪に格好悪い
これだけは間違いない
0350デフォルトの名無しさん (ワッチョイ 2b75-sfkZ)
垢版 |
2017/05/31(水) 06:57:32.87ID:g7bIgogk0
俺は知らんなぁ。
知ってると何か良いことあんの?
0352デフォルトの名無しさん (ワッチョイ 0bd4-+I1J)
垢版 |
2017/05/31(水) 11:27:45.76ID:tgfSYh/d0
typedef した部分を分離独立して、必要に応じて #include とかは普通にアリだけど。
この場合、#include した時点で同じ翻訳単位になってしまいそうだし。

A.できません(たぶん
0356デフォルトの名無しさん (ワッチョイ 8ade-01DN)
垢版 |
2017/06/01(木) 22:22:53.65ID:iiFY2Tb80
>>349
いや、おまえは知らない
そうでなければ343のような発言には至りえない
0357デフォルトの名無しさん (ワッチョイ 8ade-01DN)
垢版 |
2017/06/01(木) 22:23:46.02ID:iiFY2Tb80
知ってても、このやりとりで知っただけのくせに
それ以上に訳知り顔すんじゃねえぞ
0360デフォルトの名無しさん (ワッチョイ 2575-YsH8)
垢版 |
2017/06/01(木) 23:36:18.95ID:Gz+/nkqG0
知ってたからといって、どうというものでもないものをよくここまで引っ張れるよね。
0361デフォルトの名無しさん (ワッチョイ a6f0-01DN)
垢版 |
2017/06/02(金) 05:53:52.88ID:3GNvn+Lb0
効いてる効いてるw
俺、別に言ってること変えてねえぜ
まあ、そういうことにしなきゃ立場ねえのはわかるが
0365デフォルトの名無しさん (ワッチョイ eac8-CLsp)
垢版 |
2017/06/02(金) 13:28:22.87ID:fUQLBdQr0
関数側から見て返す値がリターン(Return)値
関数を呼び出した側が受け取る値をリザルト(Result)値

私はこの二つでしか理解しておりませぬ
0366デフォルトの名無しさん (ワッチョイ 2d51-01DN)
垢版 |
2017/06/02(金) 19:53:55.49ID:4eAI2C8m0
はあ?
無知をバカにされて発狂してんのはおまえだろw
0368デフォルトの名無しさん (ワッチョイ 2d51-01DN)
垢版 |
2017/06/03(土) 19:01:35.82ID:d/bMfhNd0
「自分だけが知ってる」すっごい知識だっておバンバン

自分の国の公文書に書いてあることなんだが
あ、自分の国じゃなかったか
なるほどそのようで
0369デフォルトの名無しさん (ワッチョイ 2575-YsH8)
垢版 |
2017/06/03(土) 20:31:14.37ID:ez6eSYjJ0
>>368
公文書に書いてあるんだ。それって何の公文書?
0371デフォルトの名無しさん (ワッチョイ 2575-YsH8)
垢版 |
2017/06/03(土) 23:29:36.08ID:ez6eSYjJ0
>>370
JIS規格票は公文書だったのか。それは知らなかった。
0374デフォルトの名無しさん (ワッチョイ 456e-1YR0)
垢版 |
2017/06/04(日) 02:48:19.44ID:0v3tAx3a0
公文書なら無料にするべきだ
0376デフォルトの名無しさん (ワッチョイ 6a37-1CPh)
垢版 |
2017/06/04(日) 11:22:12.97ID:QtczELPi0
公文書の無料と言うのは、国民全員の負担になるということなので、実はあまり良くない。
ほとんどの人が損をするという意味で、携帯の新規機種変無料とかと似たような問題。
0380デフォルトの名無しさん (ワッチョイ 6a37-1CPh)
垢版 |
2017/06/05(月) 00:56:05.33ID:9KIhNzrG0
>>377
それは0円なんて言う訳のわからんガラパゴス作戦に乗っからんと売れないようなゴミを作ってたからでしょ。
0387デフォルトの名無しさん (ワッチョイ 25aa-YsH8)
垢版 |
2017/06/05(月) 23:06:28.96ID:s9HDUBeH0
お前ら書いたプログラムをaddressSantizerやThreadSantizer、valgrindとかでチェックしながらテスト実行してる?
0388デフォルトの名無しさん (ワッチョイ 3511-YtzE)
垢版 |
2017/06/05(月) 23:45:19.00ID:agBnyIwY0
Cで書かれたプログラムがどのように機械語に翻訳され実行されるのかについて書いてある資料ってありませんか?
C言語の書き方的なWebサイトや本は腐るほどありますがCのコースコードがコンパイルされリンクされ実行可能なバイナリが出来上がり
そのバイナリ(必要なら関連する動的リンクライブラリも)がメモリにロードされ実行される過程をある程度詳しく解説している物はまず見かけません
この過程で良く使用されるファイルフォーマットの情報も欲しいです
当然実行環境や開発環境によって差異はあると思いますが基本的なところは変わらないはずですよね?
今のところターゲットはWindowsのPEと組み込み向けのバイナリファイル(メモリイメージ)で、開発環境はひとまずVC++とGNU系を考えています

最近C/C++を本格的に使わざるを得なくなり調べているのですがこのへんの情報が得られずに悩んでいます

スレ違いだったらすみません
0389デフォルトの名無しさん (ワッチョイ dd9f-CnD/)
垢版 |
2017/06/06(火) 01:06:07.57ID:uiQBRp2m0
コンパイラの実装がどうなってるかを知りたいのか、
それとも機械語がどう実行されているのかを知りたいのか

後者ならアセンブリ言語を勉強すればいい気がする
参考書も探せばありそう
0394デフォルトの名無しさん (ドコグロ MMed-Tm/A)
垢版 |
2017/06/06(火) 07:16:30.22ID:rRaTvlwzM
>>388
> 最近C/C++を本格的に使わざるを得なくなり調べているのですがこのへんの情報が得られずに悩んでいます
使うだけならそんな情報は要らんだろ
ネタでないならもっとピンポイントで聞かないと本読めと言うような回答しか返しようがない
0396デフォルトの名無しさん (ワッチョイ b96f-rLqX)
垢版 |
2017/06/06(火) 10:44:02.61ID:euIMzFdw0
>>388
デバッガーの使い方かアセンブリ言語を調べたらいいんじゃない?
「C言語をアセンブリ言語に翻訳してどうやってコンピュータを動かすか見てみよう」
っていう企画はネットや紙面でたまに見かける

gccならオプションでアセンブリ言語を出力できたはず
0397デフォルトの名無しさん (アウアウカー Sad5-6jhl)
垢版 |
2017/06/06(火) 12:13:04.78ID:HfSY3J2pa
>>388
「ハロー"Hello, World"」っていう本が面白い
linuxでの話だがシステムコール呼び出しやmain関数の前に行われる処理、共有ライブラリの仕組み、elfフォーマットなどCプログラミングの裏にあるものについて詳しく書かれてる

まあ他の人も言ってるように普通にプログラミングするのにそんな情報は当分いらないけどな
0399388 (オッペケ Sr3d-YtzE)
垢版 |
2017/06/06(火) 20:33:35.53ID:5Y/t1Obrr
レスありがとうございます

C/C++コンパイラに与える物に関する情報は沢山あるのですが、その先で何をやっているかについて解説されている資料は一気に減る気がします
リンカについて解説されている資料もあまり見ませんし、ほとんどはリンカはコンパイラが勝手に呼び出す物とされているように思います
今のところやりたいのはAPIフックやラッパーDLLなどを利用した既成アプリケーションへの介入と、組み込み系のアセンブラとCを混合した開発です
後者の場合は純正の開発ツールを使う場合に限りそれなりの資料がありますがgccなどで開発する場合の情報は多くない上に錯綜していたりします

>>389
昔組み込み系のソフトウェアをアセンブラで書いたことがあるのでアセンブラは多少読めますがCとの繋がりが見えてきません
アセンブラは違っていなければ何でもOKな所があるというか、特に生で動かす場合はレジスタの使い方からコードの配置やジャンプの方法まで
好きに決められますけど、Cだとその辺は全てブラックボックスですよね

>>391,396
アセンブルリストを出せるのは知っていますが出てきたコードはそのまま実行出来る物ではないですよね?たとえば別のソースコードの関数を
呼ぶようなケースでは呼び出し元が呼び出し先のアドレスを把握できていないと動かないはずです

>>397
おぉ、探していた物一つはまさにそんな感じの情報です。Windows向けのがあれば理想的でしたがその本を探してみます
0402デフォルトの名無しさん (ワッチョイ 9e7e-SN6U)
垢版 |
2017/06/06(火) 21:18:01.76ID:vqgdCAO10
ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ
が挙げられているが、その著者の坂井さん関連で本屋で実際手に取って
みて好きなのを選んだらどうだろうか。

12ステップで作る組込みOS自作入門
http://www.amazon.co.jp/dp/4877832394/

リンカ・ローダ実践開発テクニック
http://www.amazon.co.jp/dp/4789838072/

熱血! アセンブラ入門
http://www.amazon.co.jp/dp/479804180/
0403デフォルトの名無しさん (ドコグロ MM12-Tm/A)
垢版 |
2017/06/06(火) 21:33:57.74ID:6cAGm0S8M
>>399
> ほとんどはリンカはコンパイラが勝手に呼び出す物とされているように思います
コンパイラとコンパイラドライバの区別もついてないのに背伸びしすぎ w
そもそもgccでもアセンブラを混在させたきゃインラインアセンブラで充分だしドキュメントも揃ってる
0405デフォルトの名無しさん (ワッチョイ 2997-8pkt)
垢版 |
2017/06/06(火) 23:37:37.16ID:Qy4U0ic00
>>403
言ってることが嘘くさいよな。コンパイル、リンクの流れを知らないのは。
0406デフォルトの名無しさん (ワッチョイ f9cf-q7dZ)
垢版 |
2017/06/07(水) 01:45:32.01ID:MW2os+Jx0
ヒカル TV出演「年間5億は稼ぐ勢いですね」
https://www.youtube.com/watch?v=G7qL6ftpets
第1回案件王ランキング!YouTuberで1番稼いでるのは誰だ!
https://www.youtube.com/watch?v=asF2wQ2xhjY&;t=61s
ユーチューバーの儲けのカラクリを徹底検証!
https://www.youtube.com/watch?v=FUSb4erJSXE&;t=504s
【給料公開】チャンネル登録者4万人突破記念!YouTuberの月収公開!
https://www.youtube.com/watch?v=Y7DAQ0RKilM&;t=326s
誰も言わないなら俺がYouTuberのギャラ相場を教えます
https://www.youtube.com/watch?v=E4q-vaQh2EQ&;t=118s
YouTuberになりたいのは馬鹿じゃない!YouTuberになる方法
https://www.youtube.com/watch?v=Fr0WXXZRMSQ

最高月収5000万円だとさ。年収じゃなくて「月収」な
おまえらもyoutubeに動画投稿したほうがいいぞ。副業にぴったしだ
やろうと思えばスマホがあればできるぞ
最低2年はやらないとここまではいかないだろうけど才能とアイデアと
企画力と継続力があればが大儲けできる可能性がなくもない
まだまだ他の職種に比べれば競争率は低いからオススメ
顔出したくないならラファエルみたいに仮面つければいい
0407デフォルトの名無しさん (ワッチョイ f9cf-q7dZ)
垢版 |
2017/06/07(水) 01:46:59.80ID:MW2os+Jx0
ヒカル TV出演「年間5億は稼ぐ勢いですね」
https://www.youtube.com/watch?v=G7qL6ftpets
第1回案件王ランキング!YouTuberで1番稼いでるのは誰だ!
https://www.youtube.com/watch?v=asF2wQ2xhjY&;t=61s
ユーチューバーの儲けのカラクリを徹底検証!
https://www.youtube.com/watch?v=FUSb4erJSXE&;t=504s
【給料公開】チャンネル登録者4万人突破記念!YouTuberの月収公開!
https://www.youtube.com/watch?v=Y7DAQ0RKilM&;t=326s
誰も言わないなら俺がYouTuberのギャラ相場を教えます
https://www.youtube.com/watch?v=E4q-vaQh2EQ&;t=118s
YouTuberになりたいのは馬鹿じゃない!YouTuberになる方法
https://www.youtube.com/watch?v=Fr0WXXZRMSQ

最高月収5000万円だとさ。年収じゃなくて「月収」な
おまえらもyoutubeに動画投稿したほうがいいぞ。副業にぴったしだ
やろうと思えばスマホがあればできるぞ
最低2年はやらないとここまではいかないだろうけど才能とアイデアと
企画力と継続力があればが大儲けできる可能性がなくもない
まだまだ他の職種に比べれば競争率は低いからオススメ
顔出したくないならラファエルみたいに仮面つければいい
ハロウィン用でいろいろな仮装マスク売ってるからオヌヌメ
0408388 (オッペケ Sr3d-YtzE)
垢版 |
2017/06/07(水) 07:27:30.60ID:ahDmd+gPr
一番使用経験があるのがインタプリタで、次がアセンブラです。この二つは一から実用になる物を作ったことがありますが
コンパイラは既存のコードを改造するのがせいぜいで何かを一から作ったことがありません
C/C++はVC++にプロジェクトを読み込んでビルドしたり、configure→makeやgccのコマンドを叩くくらいしかできないです

>>400,402,404
全部買える余裕はないのでまずは本屋で眺めてみます

>>403
組み込み系だとアセンブラからCで書かれたコードを呼び出す例も普通にあるようです
リセットベクタから最初に実行されるコードはアセンブラで書くのが一般的みたいですし

>>401
あ、なるほど。実行する部分はOSの仕事ですね
0409デフォルトの名無しさん (ワッチョイ 250d-k7rq)
垢版 |
2017/06/07(水) 11:32:37.62ID:F8quZWoL0
>一から実用になる物を作ったことがあり
を指してるのは
(自作した)インタプリタと (自作した)アセンブラ じゃなく
既存のインタプリタと既存のアセンブラによって得られた生成物
だよな?
0410デフォルトの名無しさん (ワッチョイ 66aa-7ey3)
垢版 |
2017/06/07(水) 11:49:04.14ID:SSzPpmQQ0
情報処理資格の組み込み・エンベッドのテキストに書いてある

宇宙産業・医療機器・産業機械などは、組み込みの高資格を持っていないと無理。
この領域では、すぐに人が死ぬから、MISRA-C に準拠していないと、使えない。
国際的に、MISRA-C 無しのCは、製品には使えない

各人が、個別のアセンブラで学ぶことは、
各人が個別の言語で話すことと同じになり、分断される

だから日本の情報処理資格では、CASL2 という抽象的なアセンブラで、議論する。
それをまねたのが、LLVM。
だから外国が、LLVMに飛びついた

>>395
を参照
0411デフォルトの名無しさん (アウーイモ MMa1-8pkt)
垢版 |
2017/06/07(水) 12:42:49.70ID:AU15h8rIM
>>408
Cで作られたかどうかは関係ないだろw
0414デフォルトの名無しさん (ワッチョイ eaea-q7dZ)
垢版 |
2017/06/07(水) 23:18:34.34ID:Mt8hQ3L40
鶴亀算のプログラムが違うと言われたのですが、どこが違うか教えてくださいm(_ _)m
#include <stdio.h>
int main(void){
int a;//足の合計
int b;//頭の合計
int c;//鶴1羽の足の数
int d;//亀1匹の足の数
int x,y;
scanf("%d %d %d %d",&a,&b,&c,&d);
//全部が鶴だとする
x = c * b;
//実際の足数の合計-全部が鶴の場合の足数
x = a-x;
//亀の数
x = x / 2;
//鶴の数
y = b - x;

printf("%d %d\n",x,y);
return 0;
}
そもそも鶴亀算の計算方法がネットで調べてもよく分かりませんでした
0418デフォルトの名無しさん (ワッチョイ 0bcb-Fz1p)
垢版 |
2017/06/08(木) 17:37:09.59ID:JhfPMuMm0
https://ideone.com/iVXO9e
上のコードのどこが間違っているのか分かりません
動くようにするにはどのようにしたらよろしいですか?
0423デフォルトの名無しさん (ワッチョイ 9d97-Eb90)
垢版 |
2017/06/08(木) 19:40:15.68ID:HjFtHmDJ0
>>422
結局、何がしたいのか?
0429388 (オッペケ Sr71-MZAq)
垢版 |
2017/06/09(金) 23:48:48.50ID:IBAe8Zr/r
まだ一冊も買っていませんが>>397,402両氏に感謝
坂井氏の記事は判りやすくて良いですね。別件でググっていたらITmedia系列で連載しているのを発見しまして
今読んでいるところですけど大変為になります
ttp://www.itmedia.co.jp/author/174171/
0434デフォルトの名無しさん (ワッチョイ 0be3-yTT2)
垢版 |
2017/06/10(土) 20:24:27.55ID:WN3QcUIY0
>>432
バーチャルホストへの対応は http 1.1からなので、リクエストヘッダーを作成し
その中にどのホストへの要求かをサーバーに伝える必要があります。
このページを参考にしてみて。

http://tomosoft.jp/design/?p=3636

サンプルソースはローカルネットワークでやっているので、
変数 httphost にはIPアドレスが指定していますが、
ここに求めるホスト名を指定すれば良いはずです。
0437デフォルトの名無しさん (ワッチョイ 0daa-kmoq)
垢版 |
2017/06/10(土) 23:40:32.38ID:IgPZpOJ50
誰が誰を煽ってるのかは分かりませんが
リクエストヘッダの記述をHTTP1.1にして
1.1の必須ヘッダのHostを設定して試してみたら
無事動作しました
ありがとうございました
0440デフォルトの名無しさん (ワッチョイ 0bc0-6OcZ)
垢版 |
2017/06/11(日) 11:01:28.44ID:jDqQVEke0
C99の識別子について質問です。
構造体のメンバ命を「アンダーバー + 小文字アルファベット」で始まるものにするのは
仕様上、予約語と名前衝突しないことになっていますか?

「アンダーバー + 大文字アルファベット」で始まる識別子は予約されてるという記事がいくつかありましたが、小文字の場合に言及している情報は見つけられませんでした。
0441デフォルトの名無しさん (ワッチョイ d59f-zqzl)
垢版 |
2017/06/11(日) 11:12:15.08ID:8e5gqfxU0
>グローバル スコープを持ち、_ で始まる名前
>_ で始まり、その次が大文字の名前
>__ で始まる名前
この3つだけなんで、アンダースコア+小文字かつメンバ名なら大丈夫
まぁ個人的には2連アンダースコアと先頭アンダースコアは避けるけど
0442440 (ワッチョイ 0bc0-6OcZ)
垢版 |
2017/06/11(日) 11:58:31.34ID:jDqQVEke0
>>441
素早い回答有難うございます。
安心しました。

でも、ご指摘の通り使用は最小限にとどめたいと思います。
ありがとうございました
0447デフォルトの名無しさん (ワッチョイ 85aa-vEzb)
垢版 |
2017/06/12(月) 11:46:58.72ID:gcWGi0lu0
QZをNGにすりゃいいんじゃない?
0451デフォルトの名無しさん (ワッチョイ e511-yTT2)
垢版 |
2017/06/12(月) 19:34:00.50ID:5L3xq22d0
%%%MC+7,8%%%

}

000-"M","LES","TUV=0.13325&/0\7&%&",

001-"23","1","0","2","7.14",[\b%7/1444*%812%2.3%7&6111\end\\]{%3%12%\br
0452デフォルトの名無しさん (ワッチョイ 0bcb-Fz1p)
垢版 |
2017/06/13(火) 17:20:53.30ID:kTA8yB7D0
よくいろいろなホームページにinlineは付けなくてもコンパイラーが最適化で自動で決めるので
付けなくていいと見かけるけれど、重要なのはinlineを書くかどうかじゃなくて
定義をヘッダーファイルにかいてinlineに出来るかソースファイルに書いて
出来ないようにするのかってことでしょ。
inlineが出来るようにするのか出来ないようにするのかの話を
inlineを書くか書かないかの話にすり替えている汚いやり方だと思いませんか?
0456デフォルトの名無しさん (スププ Sd43-BT4T)
垢版 |
2017/06/13(火) 19:45:37.31ID:+kV5cJp9d
Cって関数オブジェクト的な動作ってできるっけ?
0457デフォルトの名無しさん (ワッチョイ 236f-aKgA)
垢版 |
2017/06/13(火) 20:05:20.23ID:co8+PZUE0
第一級関数
https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E9%96%A2%E6%95%B0

>CやC++、Pascalなどのプログラミング言語は関数ポインタをサポートしており、データ構造に含めたり他の関数に引数として渡したりすることができる。
>しかし、それらの関数は一般にリフレクションなしではプログラムの実行時に動的に生成することができないため、第一級関数をサポートしているとは見なされていない。
0459デフォルトの名無しさん (ワンミングク MMa3-vEzb)
垢版 |
2017/06/13(火) 22:14:31.00ID:fqqtkiftM
registerとか、メジャーなコンパイラで同じオプティマイザーを使用するC++では無くなっちゃったしな。
0460デフォルトの名無しさん (スププ Sd43-BT4T)
垢版 |
2017/06/13(火) 22:26:08.47ID:+kV5cJp9d
>>457
ないってことか。ありがとうございます
0462デフォルトの名無しさん (ワッチョイ 9511-LnFi)
垢版 |
2017/06/14(水) 02:09:06.53ID:cctIdNvV0
http://i.imgur.com/b3A3YWl.jpg
この(お)がよく分からん
最初の段階でi=j=0だからswapさせても意味なくね?
だったら(お)でiとjずらすのか?
とも思ったが反応なし
教えてくれると嬉しい
0464デフォルトの名無しさん (スップ Sd03-+jJi)
垢版 |
2017/06/14(水) 10:41:57.78ID:xDw396a4d
出力変換指定子について教えてください

printf("16進のffを10進に変換すると%dです\n", 0xff);

実行結果→16進のffを10進に変換すると15です

%dなどの出力変換指定子というのは、数値を文字列に変換して出力している、という理解でよろしいのでしょうか?
それとも数値を数値のまま、文字列の間に挟み込んで出力してくれている、という理解の方が合っていますでしょうか?
0472デフォルトの名無しさん (ワッチョイ 850d-OlK+)
垢版 |
2017/06/14(水) 12:58:00.19ID:cB3KRwiX0
符号付で -1 とみなし、そこから符号を維持したまま拡張して引数に詰む
引数を引っ張り出して 符号付評価で値を文字化の結果 "-1 "
(char 型変数に 0xff を入れてて、それを printf に渡したケース)


ところでリテラルの 0xff が符号付か否かは何か規定あったっけ?
0481デフォルトの名無しさん (ワッチョイ 859a-ryUj)
垢版 |
2017/06/14(水) 21:51:54.69ID:ROBFB8K40
リテラルが無条件でintなわけじゃない

intで表現出来る範囲はint
intを越えた場合には基本的には表現出来る最小の型になる
u, l, ul, ll, ullなどのサフィックスで明示的に変更も可能
サフィックスで作れない型はキャストして作る
0492デフォルトの名無しさん (ワッチョイ 8b9a-FPX1)
垢版 |
2017/06/16(金) 19:13:28.04ID:exN5gWxV0
お好きなように

caseはbreakする事がほとんどなので、コードを読むときにbreakがあると勘違いしないように、ほにゃららの後とcase no:の後の両方にコメントを忘れずに
0495デフォルトの名無しさん (ワッチョイ 8b9a-FPX1)
垢版 |
2017/06/16(金) 23:09:12.38ID:exN5gWxV0
>>493
scanfの方は、&a を charへのポインタとして処理をする
結果は環境依存

printfも基本的には書式と引数が合っている必要があるが、intより小さい引数は全ていったんintに変換されてからコールされるので、この場合は問題なし
0505デフォルトの名無しさん (オイコラミネオ MMe6-yBMi)
垢版 |
2017/06/20(火) 17:20:58.36ID:En99E4tcM
自作関数でファイルオープンする際に、ファイルが存在しなかったらその関数を強制終了したいのですが、どうすればいいんですか?
exit(0)を使うとプログラムごと強制終了されてしまいますよね?
0513デフォルトの名無しさん (ワッチョイ b311-2WTa)
垢版 |
2017/06/20(火) 18:48:54.06ID:RHsT5Eol0
>>508
目的が変わっている
自作関数でファイルオープンする際に、ファイルが存在しなかったらその関数を強制終了したい
                    ↓↓↓↓↓↓↓↓↓↓
自作関数でファイルオープンする際に、ファイルが存在しなかったらその旨を通達して抜けたい


戻りの型を int にして 成功は 0 失敗はそれ以外のエラーコードにして戻る
ポインタでエラーコードを指す引数受けて、その指し先に値を渡す
(errorno 等のグローバル変数でエラーを伝える)

呼び出し元のほうでエラーの有無で分岐
0514デフォルトの名無しさん (アウアウイー Saeb-yC+1)
垢版 |
2017/06/20(火) 22:46:25.81ID:bX2tlMgna
ちょっと直接C言語に関係ない話なのですが、

コマンドプロンプトから、標準入力からデータを受け取る必要のある
Cのプログラムを実行する際、「<」を使ってファイルから入力しています。

あるデータファイルのショートカットファイルから「<」を使って
データファイルのデータを入力するにはどうしたらいいでしょうか?
0517デフォルトの名無しさん (ワッチョイ 8b0d-VgqF)
垢版 |
2017/06/21(水) 12:03:23.32ID:P8lmP+eo0
ショートカットファイルということは windows の話かねぇ?

渡ってきてる .lnk ファイルの中身から本当のパス文字列を知って
さらにその指し先のファイルを標準入力に流す なんてことが
コンマンドラインシェルはやらんだろうな
0525デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 16:34:33.27ID:6ZKlzltP0
すいません初学者ですが質問です

#include<stdio.h>
double add(double i,double j){return i+j;}
double sub(double i,double j){return i-j;}
double mul(double i,double j){return i*j;}
double div(double i,double j)
{if(j!=0.0) return i/j; else return 0.0;}
int main(void){
double a=39.0,b=12.0;
double (*func)(double x,double y);
func=add;
printf("add:%f\n",(*func)(a,b));
func=sub;
printf("sub:%f\n",(*func)(a,b));
func=mul;
printf("mul:%f\n",(*func)(a,b));
func=div;
printf("div:%f\n",(*func)(a,b));
return 0;
}

8行目の(*fanc)の意味が解りません
例えばfunc=addで代入すると(double *add(double i,double j){return i+j;})(a,b)になるんですか?
(double add(double i,double j){return i+j;})(a,b)になってadd(double i,double j){return i+j;}の部分で
プロトタイプ宣言が呼び出されるからおkなんですか?そうなると(*fanc)の*の意味が解らなくなります。
ちょっと、頭が混乱してて訳の解らない文章になってるかもしれませんが上記プログラムで何故スムーズに行くのかがいまいちよく解りません
0527デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 16:40:28.01ID:6ZKlzltP0
もうちょっと言うと8行目の*がポインタ宣言として何でfuncにaddとかmulとか代入すると関数を参照できるのかよく解りません
*が無いとコンパイラからエラーを指摘されるんですが*がなくても関数のプロトタイプ宣言と同じ形になるのに関数が呼び出されないのが納得いきません
0528デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 16:42:15.27ID:6ZKlzltP0
>>526
うーん、なんていうか普通だとしてもなんか納得できないって言うか理屈の順序がわからないというか
0529デフォルトの名無しさん (ワッチョイ 170d-NIhq)
垢版 |
2017/06/22(木) 16:45:03.29ID:LDtj9GzU0
double (*func)(double,doube);
[double を 2つ受けて double を返す関数] の場所を覚えるための変数 が func
プロトタイプ宣言ではなく 長ったらしいけど変数宣言 int *func; と本質的に同じ
0530デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 17:05:19.55ID:6ZKlzltP0
>>529
でもint *fancの場合だとfanc=&a見たいに&をつけてアドレスを入れるんじゃないですか?
この場合&が省略されてもいいのは何でですか?
代入もaddとかsubと短くなってますけど
いつadd=double add(double i,double j){return i+j;}になったんでしょうか?
理解力や理解度が低いのもあると思いますがいまいちよく解りません・・・
0531デフォルトの名無しさん (ワッチョイ 170d-NIhq)
垢版 |
2017/06/22(木) 17:19:00.14ID:LDtj9GzU0
>>530
前半の疑問
関数へのポインタ変数 func に 関数を代入する際の記述に限り & を省略できる
という文法にしちゃった そしてそう記述するのが古くからの慣わし

関数宣言 double add(double i, double j);
関数の実装 double add(double i, double j) { return i+j; }
宣言した関数の呼び出し add(i,j);
宣言した関数のポインタを得る add (もしくは &add でも同じ)
0532デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 17:46:27.25ID:6ZKlzltP0
>>531
> 関数へのポインタ変数 func に 関数を代入する際の記述に限り & を省略できる
> 宣言した関数のポインタを得る add (もしくは &add でも同じ)
凄く頭がすっきりしました。コンパイルで実行してみてもaddと%addどちらでも通りました。
printfの(*fanc)も&addの実態を参照してるわけですね。
ありがとうございました
0533デフォルトの名無しさん (ワッチョイ 9fd7-M5hL)
垢版 |
2017/06/22(木) 17:46:30.59ID:dMWz8j2D0
>>530
8行目 double (*func)(double x,double y); は変数funcの宣言
型は double(*)(double,double) の関数ポインタ
変数funcに各関数のアドレスを代入して呼び出してる
代入される関数には&を付けても付けなくても動作は同じ
0534デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 17:47:38.20ID:6ZKlzltP0
>>533
ありがとうございます!ここ数日悩んでたんですがすっきりしました。
0536デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 18:33:38.45ID:6ZKlzltP0
>>535
それは
1。ポインタ側から見たら*fancになってfancの実体をみている
2.fanc=addと代入されているんだからfancと書かれていてもaddという変数(代入済み)に読み替えて実体を見ている
という意味で同じだという捉え方で大丈夫でしょうか?
0537デフォルトの名無しさん (ワッチョイ d711-NIhq)
垢版 |
2017/06/22(木) 18:39:12.10ID:9RPI8PPS0
関数へのポインタを得るのに & を省略できるのと同じように

ポインタの指し先の関数を呼び出すのに
(*func)(引数) と書いても func(引数) と書いても同じ という文法にしちゃった


Cは短く書けるならそっちを使う って歴史なので func(引数) って書くことが多い
0538デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/22(木) 18:42:56.92ID:6ZKlzltP0
>>537
ほへー
勉強になります
ありがとうございます
そういうところがみんながポインタが難しいというゆえんなのかもですね
0540デフォルトの名無しさん (ドコグロ MMbf-Stqb)
垢版 |
2017/06/22(木) 19:20:58.14ID:n4zvfmL3M
>>531
> 関数へのポインタ変数 func に 関数を代入する際の記述に限り & を省略できる
しれっと嘘書くなよ
代入関係なく関数名だけ(後ろにカッコをつけない)なら関数へのポインタとして扱う
比較とかでも使える
0548デフォルトの名無しさん (ラクッペ MMcb-bZFw)
垢版 |
2017/06/23(金) 09:28:01.22ID:7CKItQkCM
柴田さんの本でアルゴリズム勉強したいんだけど、c言語とjavaどっちがいいんですか?
目的は基本情報技術者試験午後対策と競技プログラミング用です
どっちも読むのがいいのでしょうか?
0555デフォルトの名無しさん (アウーイモ MM9b-+bbG)
垢版 |
2017/06/23(金) 17:25:39.99ID:zs9t5gljM
>>552
Javaは難しいものを作り込む言語ではないからね。
0557デフォルトの名無しさん (ワッチョイ 179a-VrB2)
垢版 |
2017/06/23(金) 18:43:11.28ID:cLuj8vNR0
Infの演算決めたヤツアホだよな
せっかくの異常値検出が糞仕様のせいで出来ない

InfなんてほとんどNaN扱いでいいんだよ
1/(1-1) > 0 > 1/-(1-1)
とか決めたヤツ、頭おかしい
0560デフォルトの名無しさん (ワッチョイ 9711-LvKX)
垢版 |
2017/06/23(金) 19:27:42.95ID:vbPiU/7d0
%%%5,7$$$
}
000-[[[%ER,D,A%%~
0563デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/23(金) 21:30:08.71ID:DRFAk1dca
>>548
十数年挫折してやっと分かってきたおいらに言わせれば、アルゴリズムは何でも良いから関数型言語で勉強した方がいい。
アルゴリズムの殆どがリストを基本にしてるけど、CもJavaも配列が基本だから挫折しやすい。
一旦リストが基本の言語でアルゴリズム勉強して、それを配列で実現するには?って考えた方がいい。
0564デフォルトの名無しさん (ラクッペ MMcb-bZFw)
垢版 |
2017/06/23(金) 22:03:37.03ID:gW02JZGeM
>>563
基本情報技術者試験を受かりたいので、関数型言語では無くcかJavaで覚えたいんです
仕事で他の言語覚えなきゃいけないので、関数型言語を覚える時間が無いです
すみません
0565デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/23(金) 22:57:40.45ID:DRFAk1dca
>>7
エクセルのだとエクセル立ち上げないとだからな。。。
WSHのVBSでエクセル操作するのを呼び出すとかならSystem関数で一発だろ。
0566デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/23(金) 22:59:45.35ID:DRFAk1dca
>>18
改行するならputsだが、改行したくないならprintfしかあるまい。
ある意味立派なフォーマットだ。
0567デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/23(金) 23:04:15.20ID:DRFAk1dca
>>564
うん。
文法は覚えられるけど、コードがどう言うことしてるのか理解出来ないと思うんだよね。。。
その為の関数型言語なんだが。。。

まあ、CやJavaでコード読めないってなったら関数型言語においで。
そしたら読めるようになるから。
0568スッキリ厨 (ワッチョイ ffaa-4OJu)
垢版 |
2017/06/23(金) 23:16:54.40ID:tdHTYauf0
スッキリわかる Java入門 第2版、2014

Cは、ポインタがあるので、ややこしい。
この本を3回読んで、オブジェクト指向をみっちりと学ぶ
0571デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/24(土) 05:52:05.44ID:AiSsJYjg0
>>570
そのアルゴリズムがどんな高度なものかによるから答えにくいんだろうが。

基本情報技術者試験用の言語というあたりでたいしたことをしないのはわかるが。

まだどの言語もまともに使えないレベルなんだろう。CとJavaならCをやってからJavaをやった方がコンピュータの理解にはいいけど。
0573デフォルトの名無しさん (アウアウエー Sadf-h10b)
垢版 |
2017/06/24(土) 07:50:04.53ID:TrIYg7wba
Cだとリスト必要な時リストそのものを作らないといけないけど、Javaだとリストクラスのインスタンス作ればいいだけだしね。
0574デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/24(土) 07:54:12.89ID:AiSsJYjg0
>>572
アルゴリズムというのがどこまで高度なものを言ってるのかわからないが、Cは適度なところで抑えないと時間切れで他のことができなくなるぞ。
0579デフォルトの名無しさん (ワッチョイ 178e-Lvcy)
垢版 |
2017/06/24(土) 17:35:51.09ID:GiFMFqzr0
アルゴリズムを勉強することが目的なら、言語は何でもいいに一票。
使い慣れたやつじゃないと、言語自体の使い方とかに気を取られて、アルゴリズムの勉強がはかどらない。

ただ、C言語はいろいろと手順が多い傾向があるので、「言語初心者」には適さないと思う。
0581デフォルトの名無しさん (ワッチョイ ffaa-4OJu)
垢版 |
2017/06/24(土) 23:21:27.81ID:BBTzLwWV0
アルゴリズムは、Ruby で説明する。
型の記述が無いから、Rubyが圧倒的に楽

競技プログラミングでは、Java, C++

基本情報技術者は、Java でいい。
C にはポインタがある分、時間を食うから損
0582デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/24(土) 23:33:11.12ID:AiSsJYjg0
>>581
競技プログラミングは仕様をみたすプログラム作りだから言語は関係ない。

Cについてはキミがポインタを理解してないだけじゃないか。

基本情報技術者試験ではなぜかC言語が一番難しい問題になっているのは謎だが。
0584デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/25(日) 09:33:58.41ID:wnVI7vr50
>>583
問題をみればわかるでしょ?
0585デフォルトの名無しさん (スププ Sdbf-VLv6)
垢版 |
2017/06/25(日) 09:53:15.23ID:LyAyGbQ7d
Cは一番単純明快でわかりやすいでしょ
0588デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/25(日) 11:14:35.21ID:wnVI7vr50
>>586
そうかCもまだよくわからないレベルだったな。
0592デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/25(日) 15:21:31.61ID:wnVI7vr50
一番簡単なのは昔からアセンブラなんだよな。
0595デフォルトの名無しさん (アウアウエー Sadf-h10b)
垢版 |
2017/06/25(日) 18:04:37.90ID:pYBZiqDJa
>>593
言語の難易度と問題の難しさでバランス取ってたりして。。。
0601デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/26(月) 20:58:03.95ID:Ntea+VQr0
>>600
なんの話かまったく読まずにレスw
0603デフォルトの名無しさん (ワッチョイ b797-+bbG)
垢版 |
2017/06/26(月) 21:47:17.10ID:Ntea+VQr0
>>602
CASLUではないとしてもあの程度のコンピュータのアセンブラなら言語としては単純。
0605デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/26(月) 23:19:06.55ID:31mN8SV/0
Visual Studio community 2017をC言語のコンパイラとして使えないんでしょうか?
0608デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/26(月) 23:47:45.66ID:31mN8SV/0
>>607
コンパイラとしてどうやって使っていいのかわかりません。
コードを書いてもどうやって実行すればいいのか解りません・・・
今は勉強用にEasyIDECって言うのを使ってますがこれはプログラムの実行はできるんですが
ファイルを読み込むタイプのプログラムを実行できないしexeファイルも作れません。
勉強しながら早いうちからexeファイルとか作れる環境で慣れたいんですがやりかたがわからなくて・・・
よければ教えてください
0611デフォルトの名無しさん (ワッチョイ 376c-dFnT)
垢版 |
2017/06/27(火) 08:53:16.46ID:ucAV+SpP0
>>564
試験対策ならJavaだろうなぁ
俺はJavaで合格した。

派遣のプログラマーで仕事もらうには、合格必要だぜ。
今は、派遣はヤメたけど、派遣の経験は良い勉強になったわぁ。
0613デフォルトの名無しさん (ワッチョイ 376c-dFnT)
垢版 |
2017/06/27(火) 10:00:06.40ID:ucAV+SpP0
>>609
トグル・スイッチをパチパチやってプログラミングするところからやる?
パチパチやってBoot Loaderを打ち込むのからやると、全てが判るよ。
0614デフォルトの名無しさん (ワッチョイ 376c-dFnT)
垢版 |
2017/06/27(火) 10:03:11.75ID:ucAV+SpP0
十進カウンタや、JKフリップ・フロップをNANDを組み合わせて作る事は今でもやるんだろ?大学で。

学生実験とか?最近の大学では無いの?
0616デフォルトの名無しさん (ワッチョイ 376c-dFnT)
垢版 |
2017/06/27(火) 10:57:18.19ID:ucAV+SpP0
>>615
それ、なんちゅう授業?授業のタイトルは?
0619デフォルトの名無しさん (ワッチョイ 176f-f4dT)
垢版 |
2017/06/27(火) 13:05:58.64ID:IF4g2E0D0
演算器の設計 - 加算器(Adder)
http://news.mynavi.jp/column/architecture/070/
演算器の設計 - キャリールックアヘッドアダー
http://news.mynavi.jp/column/architecture/071/
演算器の設計 - キャリールックアヘッドアダー(2)
http://news.mynavi.jp/column/architecture/072/
パラレルプリフィックスアダー
http://news.mynavi.jp/column/architecture/073/
パラレルプリフィックスアダー(2)
http://news.mynavi.jp/column/architecture/074/
パラレルプリフィックスアダー(3)
http://news.mynavi.jp/column/architecture/075/
Lingアダー
http://news.mynavi.jp/column/architecture/076/
アダーの実装に関して
http://news.mynavi.jp/column/architecture/077/
0620デフォルトの名無しさん (ワッチョイ 9fc1-NIhq)
垢版 |
2017/06/27(火) 17:08:46.44ID:HjxjU0LK0
exeの作り方は結局わかりませんでしたが
textファイルを読み込んで結果を吐き出すプログラムはvisual stadioで何とか実行できました
スレ汚しすみませんでした
0623デフォルトの名無しさん (ワッチョイ 9fc1-NIhq)
垢版 |
2017/06/27(火) 18:21:29.40ID:HjxjU0LK0
>>621
よく見たらdebugフォルダの中にアプリケーションって言うのがありました
これがexeファイルなんですね(*´ェ`*)
0630デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/28(水) 07:58:22.81ID:na5KYPACa
>>608
コマンドラインからコンパイルしたいならVCは何かバッチ実行したらclでコンパイル出来たはず。
面倒だったらbccに乗り換えて見ては。
setbccってツールも併せて検索して使えばパス通しまでしてくれる。
0632デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/28(水) 17:26:43.67ID:duiTP6800
>>629
自分ではtxtファイルの読み込み方が解りませんでした・・・
あとこんな感じで使えたらいいんですけど
http://9cguide.appspot.com/easyidec7.jpg
自分の環境(win7)だと立ち上げた後
http://light.dotup.org/uploda/light.dotup.org459505.jpg
こんな感じでスクリプトエラーが9個ぐらい出るし理想の使い方ができないんです・・・

>>630
Borland C++ Compiler 5.5がもう配布されてなくて代わりに
https://www.embarcadero.com/jp/free-tools?redirect=http://www.codegear.com/jp/downloads/free/cppbuilder
こんなのが配布されていてこれのC++Compilerをダウンロードしてみたんですがなんか違う気がします。
http://forest.watch.impress.co.jp/article/2002/10/24/cwohajimeyou.html
これもBorland C++ Compiler 5.5を要求されますが参考サイトと同じような設定ができなくてあきらめた経緯もあります。

今はvisual studio community 2017を使っていますがエラーを山のように吐いてくれて勉強になるしテキストファイルを読み込んだり吐き出したりする
プログラムも作れたりととりあえず初心者として目指すレベルには十分やりたい事ができるのでこれでいいかなと思っています。

レスありがとうございました。
0634デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/28(水) 20:06:32.41ID:AA6Kh2Ana
>>632
setbcc新しい方に対応してないんか。
フォルダ名書き換えるだけやから対応すりゃ良いのにね。
gccとかは-oファイル名ってしないとa.exeになっちゃうけど、確かインストール時にパス通してくれるはず。
(最悪、binだけ自分でパス通せば行けたはず。ライブラリのパスをコンパイラの設定ファイルに通すとか、そういう面倒はなかった)
0635デフォルトの名無しさん (ワッチョイ d723-ZLad)
垢版 |
2017/06/28(水) 22:11:54.96ID:SRIFWNkc0
>>633
ずぶの素人なんだろ?
だったら、そういうのはチュートリアルを一つずつやっていくもんだ。
https://msdn.microsoft.com/ja-jp/library/szatc41e(v=vs.110).aspx
https://msdn.microsoft.com/ja-jp/library/zftbwa2b(v=vs.110).aspx

ただしMSはVC++にはやる気を出してない(基本あれはプロ用)なので、
チュートリアルが整備されているC#等を使ってIDEの使い方を学んだ方がいい。
https://msdn.microsoft.com/ja-jp/library/jj153219.aspx
https://msdn.microsoft.com/ja-jp/library/dd492135.aspx
https://msdn.microsoft.com/ja-jp/library/dd492171.aspx

IDEに関してはVSがかなりいいから、そんな古いマイナーIDEなんて使わずに、
最初からVSでやったほうがいい。

ただ、環境整備をずぶの素人がやるのは辛い。
というか、周りに誰かいないのか?居るのなら拝み倒してやってもらえ。
そんなところで苦労しても何の足しにもならない。
とっとと実行環境を整備して、ガンガンコード書いて動かして試さないと意味が無い。

周りに誰も居ないのなら、マジでチュートリアルを頭から全部一つずつやっていけ。
そしたらいつか、ああもういいか、って思うときが来るから、
その時にチュートリアルを卒業し、自分のプロジェクトの開発を始めろ。
0636デフォルトの名無しさん (ワッチョイ d723-ZLad)
垢版 |
2017/06/28(水) 22:28:47.16ID:SRIFWNkc0
>>633
ああごめん、VC++もチュートリアルあったわ。
いつもどおりハロワだが。
https://msdn.microsoft.com/ja-jp/library/jj620919.aspx

C++だからstdafx.hになっているが、
VC++はそこらへんごちゃ混ぜに出来るので(この意味は今は分からなくていい)
#include "stdio.h" すれば printf とかも普通に使えるはず。
まあがんばれ。
0637デフォルトの名無しさん (ワッチョイ d7c1-NIhq)
垢版 |
2017/06/28(水) 23:04:41.12ID:duiTP6800
>>636
ありがとうございます
チュートリアル読みました。
エラーが出るとはいえEasyIDECを使ってある程度流れがわかっていたのとvisualstudioを何時間か弄っていたので
チュートリアルは多分理解できたと思います
今はwin32コンソールアプリケーションの空のプロジェクトを作ってソースファイルのところに.cファイルやtextファイルを追加する感じで使っていて
それなりに自分の目的にあうようには使えてるとは思います・・・多分
だからコードをひたすら書いて、理解を深めようと思っているところです。
また解らないことがあったら質問させてください!!
0638デフォルトの名無しさん (ワッチョイ d723-ZLad)
垢版 |
2017/06/28(水) 23:55:03.72ID:SRIFWNkc0
>>637
いや見りゃ分かるが君はこのスレで質問すべきレベルに達してない。
つっても他に聞く相手が居ないのならどうしようもないが、
質問されてもさすがに相手するのが嫌になるレベルだというのは自覚しろ。
だから質問したところで回答があるかどうかはまた別の話だ。

君は分かっていないだろうが、
レベルの低い奴(今回は君)に対して回答することはスレに悪影響を及ぼす。
単純には、そういうレベルの奴が集まる方向に圧力がかかり、結果的に上級者が逃げ出す。
俺はこのスレの常連ではないから、俺がこのスレに対して影響を及ぼすのは本意ではない。
だから今後は俺は君の質問は無視する。
それでも君が質問するのも自由だし、それに対して回答するのも他住民の自由だが、
見たとおり、適当にあしらわれて終わりになるはずだ。
それがスレのレベルを下げないための適切な行動だからだ。

ところが君はどうやら本気で学びたいようだ。
だからとりあえず回答したが、今後は俺は回答しない。自分で勝手に学べ。
今はそれが出来るだけのリソースがWeb上にある。
最新IDEとWebを使うのが一番無駄に引っかからなくていいからそうしろ。

IDE自体の質問なら、VSならスレがある。
というかバージョン毎に12スレもあるからそっちで聞け。
http://mevius.2ch.net/test/read.cgi/tech/1491618774/

> win32コンソールアプリケーション
多分、1-100まで足してみようとか、そういうのからやってるんだろ?
それならこれで合ってるから、まあがんばれ。
とりあえずブレークポイント/ステップ実行/ウオッチが使えれば何とかなるだろう。
後は適当に弄繰り回していれば分かるようになる。
IDEなんて基本的に使い方は同じだから、最初から高機能IDE(今回はVS)に慣れたほうがいい。
0640デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/29(木) 08:26:00.68ID:7eb8fA4L0
>>635
すげぇなぁ、Microsoft.
日本語チュートが充実じゃん。
0641デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/29(木) 08:43:40.13ID:7eb8fA4L0
stdafx.hをみて恐れをなしてVisual Basicを選択したのを思い出した。
その後、Obj-C -> Swiftに流れたが、今VC++さわれば楽しめるかもしれん。

ただし、Microsoft仕様のC++が今どうなってるのか?不安。
それと、Windows環境ってAPI Referenceを気軽に検索する方法があるのか?

俺がVC++触っていた時は、msdn developer’s networkっていう重いAPI Viewerがインストールされて、ちょっと検索するにもエライ待たされて閉口したんだが。
0642デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/29(木) 08:48:30.60ID:7eb8fA4L0
VC++って、C++11/14/17に準拠してるんだって。部分的に。
VC++も進化してるんだ。知らんかった。
0644デフォルトの名無しさん (アウアウエー Sa4a-kiAr)
垢版 |
2017/06/29(木) 09:07:42.11ID:OIGMpkDEa
その辺の準拠率はg++かclangだな。
c99対応コンパイラは皆無だっけ?
0647デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/29(木) 09:20:48.70ID:7eb8fA4L0
CCmdTarget UIResponder
CWnd UIWindow
CView UIView
CEditView UITextView
CButton UIButton
CWinApp UIApplication

MFCとUIKitの対応関係はこんな感じか?

クラス階層図はかなり違うなぁ。継承を使ってカスタマイズしていく設計と、デリゲートを使ってカスタマイズしていく設計との違いから来るのかな?
0648デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/29(木) 09:26:19.20ID:7eb8fA4L0
VC++がプロ仕様と言うのだったら、Xcodeも同じ様なもんだな。
String構造体が、
Conforms To

Comparable
CustomDebugStringConvertible
CustomPlaygroundQuickLookable
CustomReflectable
CustomStringConvertible
CVarArg
Equatable
ExpressibleByExtendedGraphemeClusterLiteral
ExpressibleByStringLiteral
ExpressibleByUnicodeScalarLiteral
Hashable
LosslessStringConvertible
TextOutputStream
TextOutputStreamable
こんだけのプロトコルに準拠しているって、仕様を見て、どれだけのヤツがピントくるかな?
おまけに山ほどイニシャライザがあって、初心者はびっくりするだろなぁ。
C++から来た奴は、構造体にイニシャライザ?って思うのかな!
0650デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/29(木) 10:36:02.44ID:7eb8fA4L0
>>649
あのぉー。Visual Studioのリファレンスって、offlineでも引く事できますか?
例えば、4Gの携帯回線が細い場所でも、リファレンスを閲覧出来るのでしょうか?

リファレンスをローカルの開発機へインストールできますか?
0652デフォルトの名無しさん (ワッチョイ 1911-CicO)
垢版 |
2017/06/29(木) 17:10:15.78ID:wGgfLCtF0
***SLAMO***

}

000-"F","TAP","0","1M","L","E-07"/0B"[9BA%]"^"2*73B"="0"/"9GA"
001-"Do"[[[%9DE=HUF%%!%$0B1OTU"NE"]]]<\b>
002-<<%!!!HNDEL%!0DAI@$7[1B]!0#!@>>
3000-{{1\B%HUF!0$$\%6/0Q\%6/GA[[7BU]]%9TE!%$en$}}


---

[[[C%%]]]
}

000-"5802"/"α"="0.1888412376155482"%en{
0653デフォルトの名無しさん (ワッチョイ e23d-t7cX)
垢版 |
2017/06/30(金) 00:41:38.72ID:OFeLP1+80
以下のコードように、呼び出し先の関数で作った配列をポインタとしてmain関数に返すプログラムでwarningが出るので、調べてみたところ
・呼び出し先の変数は一時的に保管される領域に入っている
・一時的に保管される領域はmain関数に戻ると消える
・main関数にリターンされるのはあくまで配列の開始位置なので、この書き方では配列が消える恐れがある
という情報を目にしました。
以下のようなコードであればどのように改善すればいいでしょうか。
宜しくお願いします。

/*main.c*/
int main()
{
int *hoge=sub();
}

/*sub.c*/
int *sub()
{
int b[10];
return b;
}
0666デフォルトの名無しさん (ワッチョイ c90d-nP2k)
垢版 |
2017/06/30(金) 12:52:04.96ID:X/gd7WZi0
可変引数関数を記述するだけなら stdarg.h で事足りるけど

printf のフォーマット文字列解釈して 文字に置き換える部分を
そのまま利用したいとなると、vsprintf の有無次第だよな・・・
0668デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/30(金) 17:07:02.99ID:BBkM2EA10
>>667
コスト高いの?本当に!

高いのはSystem Callのこれじゃぁ?
sbrk/mmap/VirtualAlloc等
0671デフォルトの名無しさん (ワッチョイ c123-wjSU)
垢版 |
2017/06/30(金) 20:10:41.26ID:caqhD/Ov0
int b[10]とmallocではmallocの方が常にコストは高いけどな。
前者は最適化無しで1命令、最適化後は0命令。
後者はK&R的軽量実装でも10〜1000命令は必要になる。
10%ってのは他含めてコミコミの計測結果だろ。確保のみなら喧嘩にならん。
0676デフォルトの名無しさん (スップ Sd62-HpRm)
垢版 |
2017/07/01(土) 02:56:34.34ID:PLwoIwzod
Windows環境のMINGWです
\nをASCII文字コードにするとASCII表の通り10になりますが、
Windowsの改行コードCR+LFですよね?
UNIX環境ならLFつまり10になるのはわかりますが、何故Windows環境でも10なのでしょうか?
0683デフォルトの名無しさん (ワッチョイ 6997-hy1C)
垢版 |
2017/07/04(火) 23:36:19.93ID:ydrc2aV60
テキストファイルは、CR + LFでも読み込んだらLFだけになる。書き込むときCR + LFになる
バイナリファイルは、そんなことにならない

テキストエリアで改行するなど、ファイルとは関係ない場合、CRが必要になる場合がある
0685デフォルトの名無しさん (ワッチョイ 6e1c-4/kT)
垢版 |
2017/07/05(水) 15:35:27.26ID:4h6UtxrL0
ファイルの属性じゃねえもんな
0686デフォルトの名無しさん (ワッチョイ 7723-Y2Kr)
垢版 |
2017/07/06(木) 04:58:28.75ID:pM9IP2NJ0
教えて下さいm(_ _"m)

size_t n;
n = (int)n < 0 ? -n : n; /* quick absolute value check */

"<" や "? :" の演算子は調べて分かったのですが、(int)n の部分は
どういう処理を行いますか?
intって宣言するものが、かっこで囲まれていて、なんだこれ!
っていう状態です。
0687デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 05:47:36.98ID:CwAIhoRS0
キャストだよ
本来size_t型のnを、その場だけintてことにしてくれって要求

ただし本当にintになっちまうわけじゃないから
(int)n = n < 0 ? -n : n; みたいに
代入先にしようとするとエラーだ
コンパイラによっては通るのがあるけどそれは非標準
0691デフォルトの名無しさん (ワッチョイ 9f8f-gRQY)
垢版 |
2017/07/06(木) 08:30:53.10ID:KLsItAo20
ssize_t が標準に欲しいところだよね。
0695デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 09:45:19.82ID:CwAIhoRS0
>>694
いや組み込まれているが
それが具体的に何型なのかを
コンパイラの実装者が明らかにせよと
規格が要求しているということだ
0697デフォルトの名無しさん (ドコグロ MMdf-d65a)
垢版 |
2017/07/06(木) 12:41:49.84ID:kIxohS2+M
>>695
> いや組み込まれているが
「コンパイラ(プリプロセッサじゃなくて)」には組み込まれてないだろ

> それが具体的に何型なのかを
> コンパイラの実装者が明らかにせよと
> 規格が要求しているということだ
だからなに?
0698デフォルトの名無しさん (ワッチョイ f76c-QYYo)
垢版 |
2017/07/06(木) 12:58:54.02ID:Ot0nxXPI0
size_tは__darwin_size_tでトドのつまり、unsighed longだって。
0701デフォルトの名無しさん (アウアウウー Sa5b-pw7F)
垢版 |
2017/07/06(木) 15:09:30.84ID:F+RVqvnpa
【環境】
CS+ + RX62N + E1エミュレータ
【言語】
C言語

上記にてprintf()でCS+のデバッグウィンドウに出力するにはどうすればいいですか?
0705デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 17:11:22.36ID:CwAIhoRS0
>>697
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ

# cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
0708デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
垢版 |
2017/07/06(木) 21:53:15.95ID:GBHzG+Z/0
何も入力されずにenterが押されたらループを終了する方法が分かりません・・・
誰か教えてください・・・
やはりscanfでは出来ませんかね
fgetsだったらできますか?
誰か教えてください、お願いします
0709片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdbf-R88v)
垢版 |
2017/07/06(木) 22:01:35.45ID:TwV4dW80d
プロとしては、scanf単独で使うのではなく、fgetsとsscanfの組み合わせをオススメする。
Enterキーのみが入力されたときは、fgetsのバッファには\nが入る。
0710デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 22:02:15.40ID:CwAIhoRS0
>>706
ああ、わりいな
拡張子が.cppの場合だw

で、それがおまえの理想か?
0711デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 22:03:10.59ID:CwAIhoRS0
つーか+Mはメインの質問に答えてないんだが
0712デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 22:04:47.65ID:CwAIhoRS0
>>709
すげえのオススメしてんなw
へーえ、それがプロの仕事か
0713デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
垢版 |
2017/07/06(木) 22:08:15.36ID:GBHzG+Z/0
>>709
ありがとうございます
参考になります
0716デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
垢版 |
2017/07/06(木) 22:18:05.33ID:GBHzG+Z/0
>>714
ありがとうございます!
0721デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/07(金) 04:21:12.07ID:WdR7zyOW0
>>718
スレタイに沿って聞いている>>705に答えられないゴミがドヤってんじゃねええよ
0722デフォルトの名無しさん (アウアウエー Sadf-X9Wr)
垢版 |
2017/07/07(金) 05:29:44.02ID:1OiH67XQa
>>708
環境依存ならgetchってのがあったな。
VS使ってんなら使えると思う。
0724デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/07(金) 08:07:53.36ID:WdR7zyOW0
>>723
誰だよそれ
実在しない人物を罵倒することこそ
このスレですることじゃねえだろクズ
0727デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/07(金) 09:38:36.86ID:WdR7zyOW0
>>725
アンカーつけられた人物と
おまえさんの説明が一致しない
と言っているんだよ
ニホンゴワカリマスカ?
0728デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 19:49:06.92ID:9n40FStT0
質問です。
http://fast-uploader.com/file/7054979858432/
このプラグラムで関数
void InsertList(struct LIST **ptr ,char *newname,char *newpref,double newdistance);
の部分のポインタのポインタ**ptrを普通のポインタ*ptrにするとコンパイラが通らないのは何故でしょうか?
*ptrに直してコンパイラがエラーとして指摘する場所は
newcell->nextptr=*ptr; /* いままでの先頭ポインタを次ポインタに変更 */
*ptr=newcell; /* 新しいデータ領域を先頭ポインタに変更 */
で、「「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」とのことです。
自分の頭の中では**ptrを*ptrにしてもアドレスを渡すという役目はできそうに思うのですがよく解りません。
**ptrと*ptrで型が違うとは具体的にどういう意味で**ptrと*ptrでは何がどう違うんでしょうか?
0730デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 20:42:03.04ID:9n40FStT0
>>729
今回のプログラムに当てはめたらどうなるんでしょうか?
int a, *b, **c;
a = 728; = ?
b = &a; = root=NULL
c = &b; = ?
int d, *e, **f;
f = c; = ?
e = *c; = newcell
d = **c; = ?

それとも

a = 728; = ?
b = &a; = ?
c = &b; = root=NULL
int d, *e, **f;
f = c; = ?
e = *c; = newcell
d = **c; = ?

なのでしょうか?
根本的な回答を戴いたようで嬉しいのですが、なにぶん頭が悪くて理解が追いつきません・・・
*1つで型が変わる概念がいまいち理解できません
0731デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/07(金) 20:59:30.90ID:w6YiLhhJM
ごめん、今回のプログラムとやらを一回も見てない
ポインタなんてのはCやる上で基礎の基礎
かつ、ポインタは一生大事に使っていけるお友達なんで
一時間でも二時間でも集中して時間とって
いろいろ調べるなり試すなりして一気に理解してほしい

あと、変数のポインタを渡すっていうのは定番
void foo() {
int x = 100;
bar(&x); // ここで&をつけて…
// ここでxが200になってる
}
void bar(int *p) {
*p = 200; // こっちで*付きで左辺に置いて代入する
}
こうやって呼び出し元の変数の中身を触るのはCでは定番(?)
今回は元のがint xとしたけど、
これがint x, *y, **zでも全部やることは同じ
&yしておいて*y = する
&zしておいて*z = する
0732デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 21:03:22.53ID:9n40FStT0
もう1週間ぐらいこのプログラムとにらめっこしててそれなりに思いついたワードでググったりはしてるんですが
状況にあってると思えるものが見つからないんです
0733デフォルトの名無しさん (アウアウエー Sadf-X9Wr)
垢版 |
2017/07/07(金) 21:35:03.37ID:eVPhxI3Pa
一週間って。。。
才能無いか最低限の文法も理解してない気がする。
一回腰を据えて入門サイトなり入門書読んだ方がいい。
猫でもわかるC言語とかサンプル多くて良いぞ。
0734デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/07(金) 21:36:13.31ID:w6YiLhhJM
void InsertList(struct LIST **ptr); // ←このとき
newcell->nextptr=*ptr; // struct LIST *にstruct LIST *を代入している
*ptr=newcell; // struct LIST *にstruct LIST *を代入している

void InsertList(struct LIST *ptr); // ←こうしちゃったとき
newcell->nextptr=*ptr; // struct LIST *にstruct LISTを代入しようとしてエラー
*ptr=newcell; // struct LIST *にstruct LISTを代入しようとしてエラー

int a, *b, **c; // int, int *, int **
a = 728; // int
b = &a; // int *
c = &b; // int **
int d, *e, **f; // int, int *, int **
f = c; // int **
e = *c; // int *
d = **c; // int

変数の宣言と、式の中で*つけたり&つけたりする挙動については
自分でいろいろいじってみて納得いくまで確かめてみてほしい
0737デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 22:02:46.24ID:9n40FStT0
型を合わせるために**ptrにしなければいけないところまでは解ったんですが
頭が悪いものですみません
**ptrだとstruct LIST *になって
*ptrだとstruct LIST になるところがよく解りません・・・
0738デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/07(金) 22:11:27.39ID:w6YiLhhJM
void foo(struct LIST **ptr) {
struct LIST **a = ptr; // struct LIST **型の変数aを宣言して、struct LIST **型の値を代入
struct LIST *b = *ptr; // struct LIST *型の変数bを宣言して、struct LIST *型の値を代入
struct LIST c = **ptr; // struct LIST 型の変数cを宣言して、struct LIST 型の値を代入
}
へんすーの宣言時にくっついてる*と、
へんすーが式の中にでてきてるときにくっついてる*は役割がべつだよ!
分けて考えたほうが多分理解しやすいよ!
0740デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/07(金) 22:30:21.67ID:a0p8X5TA0
>>737
マジレスするとお前はCをあきらめたほうがいい。

C言語においてハマりポイントはポインタだと言われてはいるが、
実際は10秒で通過する奴と、永久にはまる奴という感じだ。スクリーニングに近い。
昔みたいにC言語しか選択肢がないのならともかく、現在は他の言語もある。
そこをすんなり理解出来ない奴がCにこだわってもどうせ付いていけない。

てか、あんまり真面目に話を聞いたことはないんだが、
ポインタが分からないって言う奴らは、こいつがはまっているケースじゃないよな?


ちなみに俺が疑問なのは関数ポインタの表記方法で、
俺の感覚は以下ブログ主と全く同じ。
http://fa11enprince.hatenablog.com/entry/2015/11/15/135056
内容は要するに以下。

現行:void (*signal(int sig, void (*func)(int))) (int);
希望:(void (*)(int)) signal(int sig, void (*func)(int));

何で現行の文法になってるのか分かる人いる?
昔、「入れ子だとマクロでも対応できる(キリッ」って聞いたんだけど、
以前考えたら上記「希望」でもマクロ対応出来る感じだったので、謎になってる。
0741デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/07(金) 22:47:31.37ID:a0p8X5TA0
一応ポインタ周りについてググってみた。

> C言語のポインタが難解とされる理由
> https://teratail.com/questions/9058

以前から言われており、上記URL内でも散見されるが、
アセンブラをCよりも先にやった連中は誰一人としてポインタで躓かない。
だからポインタで引っかかる奴は

・ポインタの物理イメージがつかめないから

だと俺は理解していて、そいつが引っかかっているデリファレンス周りではないはず。
ただ、共用体がない言語なら物理イメージを持たずにプログラミングできるから、
それで問題ないとも思う。だから他言語にしろって話にしてる。
0742デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 22:51:15.64ID:9n40FStT0
>>738
void foo(struct LIST *ptr)だとどうなるんですか?
0745デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/07(金) 22:58:53.18ID:w6YiLhhJM
>>742
void foo(struct LIST *ptr) {
struct LIST **a = &ptr; // struct LIST **型の変数aを宣言して、struct LIST **型の値を代入
struct LIST *b = ptr; // struct LIST *型の変数bを宣言して、struct LIST *型の値を代入
struct LIST c = *ptr; // struct LIST 型の変数cを宣言して、struct LIST 型の値を代入
}
これでなんとなくわかった?
0746デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 23:01:13.47ID:9n40FStT0
>>745
いえあまり・・・すみません・・・
0747デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 23:02:33.34ID:9n40FStT0
>>745
あ、すみません>>738の引用かと思いました
ちょっとよく読んで考えて見ますすみません
0749デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 23:13:41.64ID:9n40FStT0
>>748
型が違って代入できないのは指摘して頂いたのでわかるんですがどこで型が違ったのかがいまいちよく解らなくて
まぁもちろん関数の**ptrを*ptrにしたところで変わったんだと思うんですがどうして*をつけると型が変わったといえるのかがいまいちよく解らないんです
0750デフォルトの名無しさん (ワッチョイ 97ea-okny)
垢版 |
2017/07/07(金) 23:16:17.01ID:q3zfwuJv0
最近VBAを勉強したんだけど、動作が遅く感じるわ
0752デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/07(金) 23:24:40.63ID:a0p8X5TA0
>>745
多分君なりのポリシーがあるのだと思うのだけど、

struct LIST **a = &ptr; // (A)

よりも

struct LIST** a = &ptr; // (B)

の方が一般的には分かりやすいのではないかと。
そして宣言 int* i, j, k; でシンタックスエラーを出すまでが様式美。
と思ったけど、K&R確認したら全部(A)だったw
0753デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/07(金) 23:25:06.38ID:w6YiLhhJM
うんうん…うん?

int a; // int
int *b; // intへのポインタ 型
int **c; // intへのポインタへのポインタ 型
ここまでわかる?
ここまで変数宣言時に*くっつくと型が変わる例

(こっち側考えないで) = c; // intへのポインタへのポインタ 型
(こっち側考えないで) = *c; // intへのポインタ 型
(こっち側考えないで) = **c; // int 型
ここまでわかる?
ここまで、式の途中で変数に*くっついてると型が変わる例

これだけのこと
0755デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/07(金) 23:34:50.66ID:a0p8X5TA0
>>754
いや、マジでCの文法は直感的じゃないんだよ。(プログラミング時の論理イメージとずれる)
俺的には(既に書いたが)以下のほうが良かったと思うよ。

(void (*)(int)) signal(int sig, void (*func)(int)); // これで関数ポインタ宣言させろ
int* p, q, r; // これは全部ポインタ宣言にさせろ

とはいえ限られた記号を使って上手くそれなりに整合性良く纏めてあるとは思うが。
0757デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 23:38:35.07ID:9n40FStT0
>>753
多分その基本は理解できてると思います
ただstruct LIST *newcellがどうして**ptrと同格に扱われてるのかよく解らないというか・・・
*ptrでアドレスのやり取りできるんじゃないのって思ってしまうんです
でも実際は型が違う
どうして?っという感じです。
0758デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/07(金) 23:45:37.17ID:w6YiLhhJM
>>757
ポインタのことをアドレスだと考えるのはやめたほうが良い
ポインタは単なるアドレスなんかじゃないからね
そこには必ず型ってもんがあるの「〜へのポインタ」
ってなるからこそ色々できるんだけどその話は今は省略

> struct LIST *newcellがどうして**ptrと同格に扱われてる

同格に扱うってどういうこと?
0759デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 23:49:58.38ID:9n40FStT0
>>758
**ptrで対応しないといけないなら当然struct LIST *newcellも**型ということですよね?
struct LIST *newcellが**型というのが理解できません
0760デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/07(金) 23:53:32.79ID:a0p8X5TA0
>>759
君が分かってないのは以下。

void foo0(struct LIST **ptr) {struct LIST *b = *ptr;} // >>738
void foo1(struct LIST *ptr) {struct LIST *b = ptr;} // >>745
void foo2(struct LIST ptr) {struct LIST *b = &ptr;}

関数内のptrは関数宣言時(仮引数)の型を受け継ぐ。
つかここで引っかかっているようではマジでお先真っ暗だぞ。
0761デフォルトの名無しさん (ワッチョイ 9711-1B52)
垢版 |
2017/07/07(金) 23:59:10.17ID:EA9An3gB0
みてないけど >>728 の第一引数は 引数の書き換え結果を呼び出し元に伝えたいケースなんじゃないの?

int の値を受けて その値の1大きい値を返す

引数で受けて書き換え結果を戻り値で返すなら
 int func0(int arg) { return arg + 1; }

引数で受けて、引数の指し先を書き換えることで書き換え結果を呼び出し元に伝える
 void func1(int* arg) { *arg = (*arg)+1; }

※ なお Cには参照型というのがないので
※ void func2(int arg) { arg = arg+1; } としても呼び出し元には 1増えた値が伝わらない
int a = 1;
a = func0(a); printf("%d\n", a); // a = 2 となる
func1(&a); printf("%d\n", a); // a = 3 となる
func2(a);  printf("%d\n", a); // a = 3 のまま
0762デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/08(土) 00:09:59.34ID:cmJEhNfHM
>>759
> struct LIST *newcellも**型ということですよね?

違います

> struct LIST *newcellが**型というのが理解できません

違います

struct LIST *newcell の型は struct LIST * です
struct LIST **ptr の型は struct LIST ** です

*ptr=newcell

これは、左側の*に注目
何をしているかは、もうわかるよね?
>>757で分かってるって言ったよね自分で
0763デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/08(土) 00:21:10.89ID:t7BT1SeM0
誰も見てないのが笑える。俺もだがw

質問者は分かってないようだが、
> 「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」 (>>728)
ってのは要するに & か * を忘れたときの典型的なエラーで、
隣に人がいたら「サーセンwwwww」とか言って誤魔化して10秒で修正して再コンパイルする、
ただのtypo。
みんなこれを知ってるから誰もソースなんて見に行きません。

newcell?知らんがな。ソース?見るまでもなく & か * 忘れてるだけだろ、さっさと直せ、って感じ。
とはいえ、エアプがいないのはいいことだね。
0764デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/08(土) 00:30:18.82ID:P0Vqm6hU0
もしかしてvoid foo1(struct LIST *ptr) {struct LIST *b = ptr;}の場合に*ptrを使うとそれはアドレスを渡すのではなく
実数として渡してしまうから論理破綻しているということですか?
0765デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/08(土) 00:40:47.53ID:cmJEhNfHM
やっぱ>>756さんの言ってることが問題な気がする
そういえば俺も最初はそこで混乱あったような気がする

int a = 100;
int *b = &a; // 1) intへのポインタ型のbに、intへのポインタを代入している
*b = 200; // 2) bが指してたint型の領域に、200を代入
printf("%d %d", a, *b);

ここなんだよなぁ
1)と2)が見た目似てるくせにやってることがテラ違うという
なんか懐かしいわ
0766デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/08(土) 00:41:41.51ID:t7BT1SeM0
>>761
× > ※ なお Cには参照型というのがないので
○ 参照が必要な場合は、ポインタを使って明示的に参照を渡す

だね。そしてC++の「参照」とJava等の「参照型」の物理的意味が異なるから
余計に話がおかしくなり、辻褄を合わせるために
「参照の値渡し(キリッ」とか言い出すという。

とりあえず生Cで「参照」という言葉は使われてないでしょ。
それを持ち出すのは余計に混乱するだけ。
K&R確認してみたが、
「Fortranのようなcall by referenceとは違い」のところでしか出て来ない。
これのおかげかFortranは再帰できない糞言語だった。(と聞いている)
そんな糞とは違う、まさに「ザクとは違うのだよ、ザクとは」の文脈で使われてる。

見た目だけ参照型が欲しければtypedefすればいいだけ。
(普通は余計に分かりにくくなるからしないが)
それをここで持ち出す意味が分からんね。
0769デフォルトの名無しさん (ワッチョイ 976f-qSys)
垢版 |
2017/07/08(土) 00:50:34.05ID:YHFGbdic0
>>764
関数の引数で渡されるのは"同値のコピー"なのよ

void func1(int b) {...}
void func2(void) {
int a = 100;
func1(a);
}

func2からaを引数として関数func1に渡すと、func1では「aと同じ内容のコピーb」が用意される
func1内でどれだけbを書き換えようが所詮コピーなのでfunc1を抜ければbは破棄されaにはなんら影響がない
a自体を書き換えさせたいならaの内容ではなくaの場所を教える必要がある
それを実現するのがポインタで上の例なら

void func1(int *b) {...}
void func2(void) {
int a = 100;
func1(&a);
}

となりキミの当初の質問にも同じことが言える
*が何個重なろうが理由は同じ
0770デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/08(土) 01:02:46.45ID:t7BT1SeM0
つか質問者はC言語以外には何ができるんだ?

>>768
なんか噛み付いた感じになってすまんかった。
他言語ができれば「参照」の説明は意味はある。
この可能性を忘れていた。

ただまあ、Cはやっぱりその辺のところが古くて、
現実的に構造体の値渡しなんてほぼやらないし、(つか、必要性がない)
他言語みたいに「構造体は参照渡し」で固定してよかったと思うよ。
まだ黎明期でその辺のプログラミング作法自体がなかった時代だから無理ではあるが。
0771デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/08(土) 01:26:26.98ID:P0Vqm6hU0
>>770
C言語が最初の言語です

>>760
>>762
>>767
>>769
ありがとうございます
なんとなくですが解ってきたような気がします
頭悪くてすみません
教えていただいたことをよく噛み砕けるまで考えてみようと思います
0773デフォルトの名無しさん (ワッチョイ 9fd7-Srbl)
垢版 |
2017/07/08(土) 01:43:27.53ID:zuW254gH0
>>728
俺もまだ見てないのだがw
**ptrを*ptrにしてもアドレスを渡すという役目はできます。その通りです。
void *ptrでもいいです。コンパイルエラーになるのはその後なのです。

あくまで処理に必要なのは struct LIST ** なので、キャストするなどすればコンパイルは通ります。
void *ptrで受けて struct LIST **_ptr = ptr; と代入して、以降_ptrを使うという方法もあります。
0774デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/08(土) 01:57:31.44ID:t7BT1SeM0
>>756
>>765
一応それは違うというほど違わなくて、だからって共通でいいのか?とも思うが、
そこを共通にしてしまっているから宗教論争になってる。
同様なものに「配列と配列へのポインタ」がある。

俺はやっぱり、

int* b = &a; // int*型(=intへのポインタ型)の変数 b に a のアドレスを代入

の方が好きだし、実際こう書く奴の方が多い。(と俺は思っている)
ただ、Cの文法的には765の記述が正しく、*はintではなくbと結合する。
ただし解釈は異なり、それはあくまでデリファレンスであり「宣言のときだけは別」ではない。

int a = 100;
int *b = &a; // 1回デリファレンスすると int になる b という変数に a のアドレスを代入
*b = 200; // bを1回デリファレンスしたもの(つまり100)に200を上書き

K&Rには*は逆参照演算子としか書いておらず、説明文は
> int *ip;
> は記号表現として、*ipという表現がintであることを表す。
となっている。
0775デフォルトの名無しさん (ワッチョイ 97b6-zXdO)
垢版 |
2017/07/08(土) 06:16:14.83ID:utlt5XjQ0
>>774
自分もC言語覚えたての頃は、「int *」型という風に見ていた。
ポインタがあるんだからポインタを表す型がある方がわかりやすかった

イントロダクションとしてはポインタ型があるとみなしていいと思う。
でも言語仕様はK&Rのとおりで、初心者になる頃には正しく
理解できるほうがいい
0776デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/08(土) 07:24:02.64ID:t7BT1SeM0
>>775
確認してみたが、ほとんどのサイトは int* p; ではなく int *p; だった。
有名どころではロベールが前者だが、他はほぼ全部後者。
C#は前者に仕様変更されている。
> int* p1, p2, p3; // Ok
> int *p1, *p2, *p3; // Invalid in C#
> https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types

特にint*型という理解で苦労した覚えはないが、(int *p, *q, *r;のみ例外)
文法的にはどうしても上記が引っかかるので説明サイトはほぼ全部後者になったのかな?
で、ヘルスバーグは糞だと判断して変更したと。
0781デフォルトの名無しさん (ワッチョイ 9723-KuRC)
垢版 |
2017/07/08(土) 09:53:29.46ID:t7BT1SeM0
>>772
>>780
ちなみにそれは何が分かりやすくなるんだ?

というか俺にはそれでどう勘違いしている奴を正しく導けるのか分からない。
ただし以下サイトでもそう言っているから、一部の人間に効果があるのは確実だとは思うが。
> ポインタの文法を説明するときに大切なことは、変数の宣言時初期化構文を見せないことです。
> http://pg-kura.hatenablog.com/entry/20120611/1339376977
0788デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/08(土) 18:26:01.68ID:znuCL+sZ0
>>697は逃げたかw

# 俺はしつこい
0789デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/08(土) 18:47:08.89ID:znuCL+sZ0
>>787
わざわざ同じでなくす必要はもっとない
0791デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/08(土) 19:20:19.10ID:UbbmKSpA0
昨晩はレスありがとうございました
戴いたレスを読み直しながらいろいろ考えていたら>>738>>745>>760の意味を理解できました
void foo(struct LIST *ptr) のとき*ptrを使うのは型が違うという意味もやっと理解できました
代入するときの型が合ってないという事がちゃんと理解できてなかったと思います
丁寧に説明していただいていたのにピントのズレたこと言っててすみませんでした
重ねてありがとうございました
0793デフォルトの名無しさん (ワッチョイ 9f8f-gRQY)
垢版 |
2017/07/08(土) 19:47:16.06ID:HDF4cM220
>>792
Cに全く関係ないってのは言いすぎだけど、ポインタには関係ないのはその通り。
0794デフォルトの名無しさん (ワッチョイ 9f8f-gRQY)
垢版 |
2017/07/08(土) 19:50:13.79ID:HDF4cM220
ん?
ああ、でもコンストラクタシステムがない以上、気にするところではないのか。
失礼、Cには確かに関係ないね。
0795デフォルトの名無しさん (ワイモマー MMbf-VsG/)
垢版 |
2017/07/08(土) 20:40:01.20ID:cmJEhNfHM
>>791
       |
    / ̄ ̄ ̄\
  /       .\
 .|    .∧    |
 .|  ./川\  |
  \/┏┷┓\/
     。┃お┃。
  ゙ # ゚┃め┃; 。
   ; 。 ・┃で┃・ #
  。 ;゙ #┃と┃# 。
  ゙・# : ┃う┃。 ; 。
 .;:# ゙。゚┃!┃゚ 。 #
 ; 。;; ゙.:。┗┯┛。 # : #
  ∧_∧ │
. ( ´・ω・)│
 :/   つΦ
0797デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/08(土) 21:31:33.01ID:znuCL+sZ0
>>796
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ

さあ答えろ
0799デフォルトの名無しさん (ワッチョイ b7db-TZYB)
垢版 |
2017/07/09(日) 05:03:16.31ID:W7Itegl80
組み込まれていない:stddef.hで定義されてるんだから組み込み型ではない
組み込まれてる:unsigned intかunsigned longかunsigned long longか知らんけど組み込まれてるだろ
ってことかすぃら?
0800デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 05:59:52.53ID:DwPx7o2S0
>>798
ああ、そこにしか答えられないわけね
立派な答えだ

799がごく当たり前の答えを代わりに書いてくれているが
それすら答えられないようなゴミはCスレに出しゃばってくんな
0802デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 07:40:42.30ID:DwPx7o2S0
>>801
おまえさ、コードの意味が読めませんだなんて
このスレにおいて死ぬより恥ずかしいことを
わざわざ自己紹介しなくていいよ

799に助けて貰ってもその意味すらわかんねえんだろバーカ
0805デフォルトの名無しさん (ワッチョイ 9f6e-4BC7)
垢版 |
2017/07/09(日) 15:09:59.91ID:ZJXpL8k20
見苦しい喧嘩して何になるんだ?
0807デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 18:27:56.89ID:DwPx7o2S0
>>803
いーや、おまえは意味がわかってない
だから、あんな簡単な問いにぐうの音も出なかった
誰が見ても明らかだよ
0809デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 19:05:13.48ID:DwPx7o2S0
>>808
>>807
0810デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 19:06:47.55ID:DwPx7o2S0
俺はしつこい

おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ
0812デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 19:09:15.82ID:DwPx7o2S0
動作の実装と識別子の導入の区別もつかないアホが
どでかいブーメランほってやがるぜw
0814デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 19:42:37.88ID:DwPx7o2S0
>>813
いいだろう、少しだけ相手してやる
どこでもいいから>>695に突っ込めることを噛みついてみな

国会で審議妨害ばかりしているクズ野党みたいな戯れ言じゃなく
技術的に意味のある内容で来い
0815デフォルトの名無しさん (ワッチョイ 9f11-d65a)
垢版 |
2017/07/09(日) 19:52:27.11ID:bCABOrL10
日本語が理解できてないんだろうな...
出してきた「意図」もわからんものにどう突っ込めと w
sizeof が size_t 型の値を返すのは当たり前で float とかワケわからんこと言われても困惑するだけ
0817デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/09(日) 21:16:46.06ID:DwPx7o2S0
>>815
日本語が理解できてないのはおまえ
>>695におまえが意図不明という「コード」は含まれていない

空疎な言い訳で逃げ回るザマはたっぷり見せてもらったからもういいぜ
こっちも腹筋がそろそろヤバい
0820デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/10(月) 05:25:51.74ID:JKtUlR/N0
>>819
技術的に意味のある話ができず
空疎な言い訳に終始しかできねえのを
人のせいにしてんじゃねえよゴミクズ
0822デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/10(月) 08:34:02.15ID:JKtUlR/N0
>>821
おまえも同類だ
0826デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/10(月) 09:46:21.35ID:JKtUlR/N0
>>823
技術的に意味のある話ができず
空疎な言い訳に終始しかできねえ
ゴミクズのお仲間、それがおまえだ
誰であろうがその特徴に違いはない
0828デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/10(月) 11:38:17.15ID:JKtUlR/N0
>>827
おまえが>>815>>816を書いたとでも言うのか?
他人の言葉を借りていきがっても、しょせんその程度だおまえは
0830デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/10(月) 12:06:39.12ID:JKtUlR/N0
国会にもよく似たゴミが来てるぞ
http://snjpn.net/archives/24782
0832デフォルトの名無しさん (ワッチョイ 2a6c-S4qQ)
垢版 |
2017/07/13(木) 11:06:39.28ID:BCHZTwvD0
Makefileで、
.PHONY: doc
doc:
  doxygen
みたいに毎回.PHONY書くのあほっぽいんだけど、1行にならん?
0833デフォルトの名無しさん (ワッチョイ 4a69-1jjp)
垢版 |
2017/07/13(木) 12:01:26.06ID:LenxTGcs0
C言語でインラインアセンブラが使える文法の違いってどこかに解説ありますか?
asm{}文の表記のしかたが違う
0835デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/13(木) 16:20:17.23ID:PWiSD9vP0
ISO/IEC9899:2011で、asmについて書かれているのは、全文中でたったのこれだけ
J. 5.10 The asm keyword
The asm keyword may be used to insert assembly language directly into the translator output (6.8). The most common implementation is via a statement of the form:
asm ( character-string-literal );

asmはたぶんコンパイル結果にアセンブラを生中出しするために使われる
たいていこうなっている
asm(文字列リテラル);

つまりこれ以上はGNUやM$に聞けってこと
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
https://msdn.microsoft.com/ja-jp/library/4ks26t93.aspx
0836デフォルトの名無しさん (ワッチョイ 5c7a-KmKO)
垢版 |
2017/07/13(木) 17:03:33.50ID:32wk5maY0
そもそもの仕様として、
構造体のメンバーの参照に '.' と '->' を
使い分ける必要性がわからないんだけど、なぜ?

間接参照だと意識しろっていう教育的な意味以外思い付かん
0838デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/13(木) 18:47:04.29ID:PWiSD9vP0
そういうことじゃなく
Javaの参照ドットみたいなことに
なぜしなかったのか、だろ

ポインタを参照だと言い張るだけでいいのにと
0839デフォルトの名無しさん (JP 0H99-QjT/)
垢版 |
2017/07/13(木) 20:54:14.63ID:VVeozCkKH
構造体は全部参照だということにしたいの?
それすると、宣言するときに領域確保して、
いらなくなったらガベコレするっていう機構を組み込んどく必要があって、
Cのシンプルさにまったく合わなくなる。
0844デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/13(木) 22:09:19.10ID:PWiSD9vP0
>>843
ドヤ顔で話の前提になってることをデバッグ出力してんじゃねえ
バグってる可能性があるのはおまえだけだ
0846デフォルトの名無しさん (ワッチョイ 3f11-1CH6)
垢版 |
2017/07/13(木) 22:11:58.75ID:LTIPW4bg0
-> で書いているのを . でも許したとして、コンパイラに不都合が出てくるんだろうか?

((struct foo*)0)->member ⇒ ((struct foo*)0).member

キャストの後の括弧がなくても通すと リテラルと繋がるから面倒をおこしそうだけども
(struct foo*)0->member ⇒ (struct foo*)0.member
そういうわけでもなさそうだし
0849デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/13(木) 22:48:52.06ID:ZRvPs5t50
>>846
思想としてそこまで意識して書き、ソース上にもその痕跡を残せってことでしょ。
他言語で言うプロパティの良し悪しと同じ議論だよ。
好き嫌いはあれども、正しい or 間違いの結論はでない。

コンパイラはエラーを検出できてるんだから、
その場合は . を -> と読み替えろ、というルーチンを入れれば君が欲しいものは簡単に作れる。
でも誰も用意しなかった。それが事実だね。
0850デフォルトの名無しさん (ワッチョイ f16a-KmKO)
垢版 |
2017/07/13(木) 23:28:37.17ID:EExJF9140
>>844
勝手に前提にするな〜
836は俺だ

>>846
そうそう、仕様として何か不都合があるのかという話がしたかったんだ

>>849
だから836で「教育的な意味」と書いている
結局言語仕様としてこうしないと問題がある訳じゃなくて
「教育的な意味」だけのことでいいんだな

>>847
きっかけはまさにそれ
書き換えめんどくせーから始まって、
コンパイラが困るのかと
色々なパターンを考えてみたんだけど
困るパターンを見つけられなかったんで
こんな話を始めたんだよ
0851デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/14(金) 00:02:31.73ID:jsZNOhnp0
>>850
> 「教育的な意味」だけのことでいいんだな
>>839に答えは既に書いてあるだろ。アホなのか?
具体的にはスタック上に構造体を取って高速化する手法が使えなくなるんだよ。

(大抵の他言語では記述方法自体が用意されていない。
VC++/CLIではvalue型が用意されていて効果があることになっている。
が、ろくな説明が見当たらないorz)
古いが以下。
http://www.eonet.ne.jp/~maeda/cpp/value.htm
MS公式は以下。全く説明する気が無いw
https://msdn.microsoft.com/ja-jp/library/ke3a209d.aspx

というか、そこらへんが面倒だというのならJavaやC#使えって話でしかなく、
今の時代にC使うのならそこまで含めてチューニングする気で書け、でしかない。
0852デフォルトの名無しさん (ブーイモ MMfd-QjT/)
垢版 |
2017/07/14(金) 00:16:04.99ID:1+0wIQjnM
839だけど >>851 は周回遅れ。
構造体へのポインタでも、構造体でも、. を使う文法にできるんじゃねっていう主張。
今のところ俺もそれへの具体的な反論を用意できていない。
「教育的」っていうのは違うと思うがな。
0853デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/14(金) 00:35:26.21ID:jsZNOhnp0
>>852
いやみりゃ分かるが 851=849で、俺もそれは否定しない。
ただ、確かに851は間違いだったわ。
確保時の文法が異なっていて、それで十分だから、その後は区別する必要はないね。

見た目、直接か間接か分かるようにしろってことだろ。
0854デフォルトの名無しさん (ワッチョイ 4ed7-H2gN)
垢版 |
2017/07/14(金) 05:37:38.18ID:JCM3Qqhn0
ポインタなら(*foo).member と書くべきのところ->で書けるようにしたってことだけじゃないの?
糖衣構文的なオプションだろう

つうか、どちらもドット演算子に統一した場合、
ポインタなのにデリファレンスしないで値にアクセスできる仕様はCの文法としておかしくね?
0858デフォルトの名無しさん (ドコグロ MM46-OTuW)
垢版 |
2017/07/14(金) 07:00:49.03ID:8xomc53MM
>>843
struct s { int *a; };
void f(struct s *sp){
int b = 1;
sp.a = &b; /* 今の文法なら sp->a = &b; */
x = sp.a;
って書かれたら x には b へのポインタが入るの?
それとも 1 が入るの?
まさか右辺の型に依存して変わるとか?
0862デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/14(金) 08:05:49.17ID:ZvHE7cBu0
>>854が最後にいいこと言った
>>856の指摘が読めてない>>857はIQで30くらい差があるんだろうな
0865デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/14(金) 10:09:02.17ID:ZvHE7cBu0
>>863
ミスってるぞ

>>864
sizeof func != sizeof *func
0866デフォルトの名無しさん (ワッチョイ ce88-JuPl)
垢版 |
2017/07/14(金) 10:36:06.28ID:7SJq6nEP0
字下げスタイルについて質問です
現在職業訓練校で習っているのですがそこの先生が
「プロはみんなこっち(K&R)だから。最近の教科書はこういうの(オールマン)増えてるけど、初心者向けの本書いてる人はそもそもプログラマじゃないから……」と。
自分がオールマン好きなのと、本を書いてくれる人たちをばかにするような言い方でちょっとむっとしたのですが、実際にK&Rばかりなんでしょうか
0867デフォルトの名無しさん (JP 0H99-QjT/)
垢版 |
2017/07/14(金) 10:58:17.61ID:XOCK9tWfH
>>866
自分一人で書くならプロだろうが何だろうが自分の好みを貫けばいい。
チームならそのチームのスタイルに合わせるのがプロ。
多数派は多分K&R。俺の好みもそう。
0870デフォルトの名無しさん (ドコグロ MM36-Aifm)
垢版 |
2017/07/14(金) 13:06:11.17ID:XJoggiB0M
>>866
今は他言語含めてK&Rが主流。昔の初心者本にオールマンスタイルで書かれてるのがあって
自分も最初は括弧の対応が分かりやすいからそれを使ってたけど
今は使わなくなった。括弧の対応なんて見れば分かるので重要じゃなくなる
0872デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/14(金) 14:28:28.54ID:ZvHE7cBu0
>>869
void (**f)();
f(); //error
0874デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/14(金) 15:04:40.25ID:ZvHE7cBu0
>>866
その「先生」もプログラマじゃなさそうに聞こえる
どこのチームに入っても「こいつのクセうぜえ」と思われたらあかん
K&Rだのオールマンだのと言うが純粋なK&Rや純粋なオールマンはむしろ少数派で
たいていなにがしか方言があり、それを無視して原理主義に走ると
標準語を使っているはずの自分のほうが訛っていることにされてしまう
保護色ができないやつがプログラマの世間を知っているのか疑わしい
もしくは、元プログラマでも引退してからずいぶん長いとかな


プログラマ以外の世間でも「前の会社では」が口癖の新入りが干されるのと同じで
狭い世界の狭い正義にとらわれたスッパマンに居場所はない
0881デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/14(金) 21:40:14.77ID:ZvHE7cBu0
汚物は消毒だ〜!!
0882デフォルトの名無しさん (エーイモ SE9e-RQIi)
垢版 |
2017/07/15(土) 15:35:51.02ID:mwrVMnVyE
clangにはソースコードを解析してコードを補完する機能がありますけど
gccにはこういう機能はないのでしょうか?
0883デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/15(土) 16:17:52.28ID:4RmHy8z30
>>858
> x には b へのポインタが入るの?
> それとも 1 が入るの?
その仕様にした場合は、 x の型によって決まる。
多分、結局のところは、float->doubleのような暗黙のキャスト、
structPtr* -> *structPtr を許すかどうかだろう。
許しても大した問題はないように思えるが。

ポインタを使える最近の言語はGoとRustか?
詳しい奴がいれば聞いてみればいいのではないかな。
C言語で問題だった点は当然改修されているだろうし。
0884デフォルトの名無しさん (ドコグロ MM2e-OTuW)
垢版 |
2017/07/15(土) 16:57:34.95ID:hu77KrcYM
>>883
> その仕様にした場合は、 x の型によって決まる
struct s { size_t *a; size_t *b; };
void f(struct s *sp){
size_t c[] = {1, 2};
sp.a = &c[0];
sp.b = &c[1];
x = sp.b - sp.a;
ってされたらどうするおつもり?
デリファレンスしてもしなくても結果は size_t だよ
0886デフォルトの名無しさん (ワッチョイ f146-I8+U)
垢版 |
2017/07/15(土) 17:16:20.81ID:pcaRmStc0
>>881
聞いたことのあるセリフだなあ?
何だっけ?
北斗の拳?
0890デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/15(土) 17:57:08.70ID:4RmHy8z30
>>889
違うね。
>>888は「右辺を評価する際、 . を . とみなすか -> とみなすか区別できない。なぜならば結果が同じだからだキリッ」
という論理らしいが、そもそもそんな仕様の言語なんて無い。スクリプト言語ですらも。
そもそも着想の仕方がおかしいだろ。エアプだからだよ。

エアプはマジで死ね。
0894デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/15(土) 20:28:46.13ID:4RmHy8z30
>>891
-> を廃止して . に統一するのならその手の型チェックは緩くなる。
これは結局のところ、他言語でもなされている議論と同じで、
「静的チェックのための記述をどこまで許容するか」でしかない。
俺はCなら厳しい方が似合っていると思うが。

それはさておき、具体的にそのケースならnull許容型、って奴だろう。
他言語でも死ぬほど議論されているからググれ。
0897デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/16(日) 01:49:05.19ID:AkX0kyqa0
>>896
> NULL許容で書けたところで、実行時にはNULLチェックするわけだから
いや、そうじゃない。
というかそっちの議論も多いようだから、誤解するのも分かるんだが。
以下を読むのがいいだろう。
> null許容参照型
> http://www.buildinsider.net/column/iwanaga-nobuyuki/012

Cに対して導入するとしたら以下か。
1. 「null非許容のポインタ」を文法的に用意する。
2. 「null非許容のポインタ」にはNULLは代入できない。(SyntaxError)
3. 「null非許容のポインタ」に「従来のポインタ」の値を代入するには明示的なキャストが必要。
これでヌルポを静的に検出できるようになる。
「null非許容のポインタ」に関しては実行時のNULLチェックは必要ない。

問題は3で、C++ならdynamic_castのみとして例外を投げればいいのだが、
Cの場合これは無理なので、
・リンター等でキャスト直前にNULLチェックしているかを検出する
・明示的キャストをマクロ等でNULLチェックのインライン関数等に置き換える
等の対策が必要にはなるが、
それでもNULLに対してクリーン/ダーティな区画を文法的に分離できるようになるので、
今よりはだいぶマシにはなる。

とはいえこれはbetterCとしてC++を使うのなら現行のC++でも似たようなことは十分できる。
だからわざわざ新文法が必要か?というのと、他と同様に、
静的チェック「だけ」のための新文法を導入する価値があるのか?
という話にはなる。
そして . と -> の話に戻すなら、
「『null非許容型の』struct* から *structへの暗黙的キャストを認める」
という仕様なら、そちらの危惧している部分については回避できることになる。
0898デフォルトの名無しさん (ドコグロ MM40-OTuW)
垢版 |
2017/07/16(日) 07:21:30.62ID:xeCnao79M
>>889
だから . 演算子を適用した結果がポインタならどうするんだ?
って指摘されてるだろ
ID:4RmHy8z30 はレスできなくなって
> エアプはマジで死ね。
とか恥ずかしい捨て台詞で逃げてるけど w
0899デフォルトの名無しさん (ドコグロ MM40-OTuW)
垢版 |
2017/07/16(日) 07:28:16.81ID:xeCnao79M
>>897
> 問題は3で、C++ならdynamic_castのみとして例外を投げればいいのだが、
> Cの場合これは無理なので、
> ・リンター等でキャスト直前にNULLチェックしているかを検出する
> ・明示的キャストをマクロ等でNULLチェックのインライン関数等に置き換える
> 等の対策が必要にはなるが、
そんなアホな対策は要らんわ
キャストまでしてNULL非許容の変数にNULL入れる奴はわかってやってるんだからそのまま入れてくれればいい
それに起因するエラーはプログラマの責任
C言語ってそう言う言語だろ
0900デフォルトの名無しさん (ワッチョイ ce7f-z+eH)
垢版 |
2017/07/16(日) 07:41:24.58ID:H6W6/XNn0
>>898
>だから . 演算子を適用した結果がポインタならどうするんだ?

. 演算の対象がポインタかそうでないかで分かれるだけで、演算の結果は
それがポインタならポインタとして扱えばいいだけだろ。何か問題あるのか?
0904デフォルトの名無しさん (ドコグロ MM40-OTuW)
垢版 |
2017/07/16(日) 09:37:42.33ID:xeCnao79M
>>902-903
要するに構造体へのポインタに対する . 演算子は今の -> 演算子と見なせってことね
>>883みたいな奴がいるから念のために確認しただけ
仕様として矛盾はないと思うけど
struct s sl;
struct s *sp;
x = *sl.a;
x = *sp.a;
と統一的に書けるから便利と思うか
x = *sl.a;
x = *sp->a;
とたいして変わらんと思うかは人それぞれだと思う
0906デフォルトの名無しさん (ワッチョイ 4ed7-H2gN)
垢版 |
2017/07/16(日) 09:59:26.34ID:JuGvxIE40
要するに、(*p).m を p.m と書けるということ
つまりデリファレンスの階層を一個省略しようってことで、
格段便利ってわけでもないし、かえってややこしいかもなw

これ、ポインタが何段になっても p.m って書いて整合性取れるかい?
0907デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/16(日) 10:06:14.91ID:AkX0kyqa0
>>902-903
だからエアプなんだって。話の通じなさ具合がおかしいだろ。

>>899もそうだ。
> キャストまでしてNULL非許容の変数にNULL入れる奴はわかってやってるんだからそのまま入れてくれればいい
Cの場合はmallocの失敗がNULLになるんだから、これとかありえないだろ。
Cはnullありき、キャストありきで世界が構築されているから、
ヌルポ対策を静的にやりたいのならキャストも含めないと使い物にならない。
しかしエアプだからこれが分からない。マジでウザいから死ね。

> C言語ってそう言う言語だろ
これも違う。
C言語は静的な対策を拒否してない。動的な対策は全面拒否だが。
つっても通じないとは思うが。

>>904
> struct s sl;
> x = *sl.a;
エアプマジ死ねよ

というか、エアプがここに来る意味が俺には分からないのだが。
こいつらどの種のキチガイなの?
0912デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/16(日) 10:33:31.23ID:AkX0kyqa0
>>906
> これ、ポインタが何段になっても p.m って書いて整合性取れるかい?
実体になるまでデリファレンスしろ、というだけだから、出来なくはないと思うが。

> 格段便利ってわけでもないし、かえってややこしいかもなw
まあCがほぼ完成しているからな。導入する価値があるか微妙というのは同意。
> Cが見事にこなしていることは、全く"出来るだけシンプルにせよ、
> しかし、それ以上シンプルにするな"をしていることだ。
> そして、そのことがCを素晴らしいものにしている。言語はパワフルでありながら、ほぼ最小である。
> by Linus Torvalds
> https://srad.jp/~taro-nishino/journal/509450/


俺が思うに、Cに必要なのは階層(≒関数内関数)だよ。一部拡張されているようではあるが。
最近別言語だがCスタイルの記述(グローバル+関数、非オブジェクト指向)を読んだことがあって、
22K行のコードだが初見で簡単に目的のコードを探し当てられて、軽く衝撃だった。
Cが読みにくいのは100-500行のファイルで細切れになっているからであって、
あれ、設計者が分かりやすい順にcatしてくれていれば衝撃的に読みやすいことに気づいた。
0913デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/16(日) 10:47:18.34ID:AkX0kyqa0
あと、前方宣言必須というのも糞だ。
というか、今だにあれを放置している理由がよく分からない。

あれが無ければトップダウンで記述できるのでさらさら読める。
あれのおかげで下から構築しないといけないので、(include等つかって擬似的に回避できるが)
詳細まで確認する必要が無いときにも読まなくてもいい関数を読まされる事になる。

元々「世界の全てを把握して、絶対神として振舞え」という言語ではあるから、
「読みたくも無い関数を読まされたくねー」オブジェクト指向感性とは合わないが、
今更全てを把握できるほど世界は小さくないし、その必要が無いことも多い。
色々手抜きできる言語があることを知ってしまってからは、もっと手抜きさせてくれよーとは思う。
0914 ◆QZaw55cn4c (ワッチョイ 466d-RG79)
垢版 |
2017/07/16(日) 12:56:07.96ID:G64lD0g30
>>913
前方参照は確かにどうかと思うが、前方参照の制限が解消されたからといって読みやすさが改善するとは思えないね
現状でも底から読んでいけばいいだけなのではないか?
読みやすさは…識別子を日本語で書くのがよさそうだが
0915デフォルトの名無しさん (ワッチョイ d4db-B6bl)
垢版 |
2017/07/16(日) 18:30:50.90ID:dVrh8pbL0
typedet struct
{
    void ( *reset_func )( void );
    unsigned long initial_stack;
    void ( *divide_by_zero )( void );
    ・・・
}    intvec_t;

#define INTVEC  ( *( intvec_t* )0 )
0916デフォルトの名無しさん (ワッチョイ f146-I8+U)
垢版 |
2017/07/16(日) 21:14:38.36ID:TI5o59vg0
> 要するに、(*p).m を p.m と書けるということ

これ、できるできない以前に、初心者にきついな。
ルールを覚えるのは楽だけれど、例外事項が増えてくると、結局暗記になっちゃうからなあ。
0917デフォルトの名無しさん (ワッチョイ 7d33-RIgB)
垢版 |
2017/07/16(日) 21:46:19.69ID:aJG+vjk10
ts
0919デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/17(月) 03:39:18.28ID:woO8V6Ze0
>>918
だよな
トップダウンなだけでなく
関数の一覧ができているという点でも
>>913が書いていそうな糞コードのDBL_MAX倍マシ
0921デフォルトの名無しさん (ワッチョイ df23-S4qQ)
垢版 |
2017/07/17(月) 05:32:30.17ID:6JtF0HSC0
まあしかし俺は同じファイル内にあるにも関わらずプロトタイプ宣言入れないと
わかってくれないのが嫌で使われる個所よりも上に書いちゃうけどな。
同じファイル内なんだからわかって欲しいものではある。

そういや PASCAL なんかも前方参照しかなかったような気がするな。
あの当時の言語はこういうの当たり前だったのかな。
PASCALなんかだとわざわざそういう思想で作られたって感じもするが。
Cだと手抜いただけのように見える。w
0922デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/17(月) 06:51:56.93ID:woO8V6Ze0
うん、Cのバヤイは確信的な手抜きだな
0926デフォルトの名無しさん (ワッチョイ 4ed7-H2gN)
垢版 |
2017/07/17(月) 08:11:52.63ID:PKmAGp8M0
Cもワンパスのため前方宣言必須ということのようだが、
一回舐めて拾うだけでいいんだし、今時こだわる必要も無いだろう
ヘッダに出した公開インターフェースは先、モジュール内プライベートはその下がわかりやすいよな
0928デフォルトの名無しさん (ワッチョイ aa11-OTuW)
垢版 |
2017/07/17(月) 08:53:08.22ID:U2FIHXXv0
>>918
>>913がプロトタイプ宣言知ってるかどうかは知らんけど同じ情報を二ヵ所に書かないといけないのはいかがなものかと思う
言語仕様を決めた当時はI/Oも遅いので高々数回のパースでコンパイルする必要あったからしょうがないとは思うが

>>921
Pascalは1-Passでビルドできるように言語仕様を決めていた
なので当初はモジュールみたいな概念もなかった
0929デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 08:57:46.36ID:LYlgQVUQ0
>>920
さすがに知っているぞ。
俺は君と同様それはほぼ使わないというだけで。
というか、あの「事前に分かってないと使えない」事は正確には何と言うんだ?
「前方宣言必須」というのはどうも「前方宣言」自体が別の用語らしいのでまずかったようだ。

>>921
Cの場合、1パスコンパイルするためのものだ。
Cは紙テープ時代からある。
Wikiによると10文字/秒らしいので、1KBのファイルなら読み取りに1分40秒かかる。
これで2パスされると死ねるから、1パスでいけるように、
あらかじめ人間が順番を整えとけ(=機械に人間が合わせろ)というものだ。
どう考えても今はそんな時代じゃないだろ。
2パスに変更して「後方参照」(という用語でいいのか?)出来るようにすればいいだけだ。
紙テープの時代なら時代の要請だが、HDDの時代にこれを大事に守る理由は無い。
だから新しい全ての言語はこの制限は無い。必要ないからだ。
(ただしPythonを除く。この点だけでもPythonは糞だと断定できる)

ところがな、>>919みたいな老害は、
できる理由を見つけてきて頑なに現状維持しようとするものだ。
Cの場合は、確かに下から構築していけばプロトタイプ宣言は通常全く使わずに構築できる。
だからそれが作法になってしまってるだろ。
Pythonの場合はおそらくこれ、つまり、下からの構築を強制させるためにあえて採用してないのだと思う。

しかしな、他人のコードを一から読むとき、下から読む必要はなく、上から読んだほうが楽だ。
(正確には中レベルから。一番上のレベルも読む必要ないから)
お前らがそれに気づけてないのだとしたら、お前らはCしか読んでないからだ。
というか俺も最近までそうだったのだが。
0930デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 08:58:08.57ID:LYlgQVUQ0
既に書いたが、Cの読みにくさは、ファイルが細切れになっていることもある。
これはOOPも別の意味で同罪で、「で、その処理は具体的にはどこに書いてあるんですかね?」は常だ。
だからそんなものだと思っているのだと思う。

ところが最近、後方参照できる言語でCスタイルで書かれているコードを読んで戦慄した。
圧倒的に読みやすいのだ。(OOPよりも)
上からスクロールしていくだけで、読み飛ばしていいか、そうでないか、はっきりと分かった。
ところが肝心のCにはこの類のソースコードは存在しないんだよ。後方参照禁止だから。

後方参照が出来るようになれば、設計者が自由に関数を配置できるようになる。
当然、一番分かりやすいように並べることになる。
今のCにはその自由度が無いんだよ。人間が機械に合わせる仕様だから。
「プロトタイプ宣言」とかいう二度手間をやらないと、最もわかりやすい順に並べられない。
だから今のCソースは基本的に「分かりにくい」。
少なくとも後方参照できればもっとわかりやすくなる方向でしかない。
だからいまだにそれを放置しているのはマジで糞だって事。
老害的には「下から構築しろ」という教育効果を主張するのだろうが、そんなのは要らない。
0934デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 09:11:05.59ID:LYlgQVUQ0
>>932
というか今更その辺の用語は無いんだよ。理由は他言語では必要ないから。
「後方参照」も正規表現でしか使われてないし、
しかもあれって「後方」よりも「バッファ」と言え、という類のものであるし。

とりあえず俺の定義は、
前方宣言必須:どうやらこれは俺の誤用だったすまん。「事前に宣言しておかないと使えない」の意で使ってた
後方参照:後で定義されている関数を使うこと
だね。これが適切かは分からんが、Cやってる奴ならあーはいはい程度には通じるとは思う。
0935デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 09:14:46.40ID:LYlgQVUQ0
>>933
知らんね。
つかあれ、そうなのか。だとすると動的に構築するから致し方なし、って奴か。
JavaScriptが糞な点と同じだな。

まあどの道2パスすれば回避できるだけのことを、なぜやらん?ってのはある。
Pythonは聞けば聞くほど糞なので、俺はやってない。
0939デフォルトの名無しさん (ワッチョイ aa11-OTuW)
垢版 |
2017/07/17(月) 09:54:21.13ID:U2FIHXXv0
>>936
Pascalはラベルに数値が(と言うか数値しか)使えないこととコンパイラを単純にするためにlabel文で宣言が要るけど、コンパイラの実装としては必須じゃないでしょ
goto文の飛び先はラベル見つけた時点で入れればいいだけだし
0941デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 10:42:28.15ID:LYlgQVUQ0
>>938
お前はPython信者なのか?ならばもう一度言ってやるよ。Pythonはそこも糞だ。

Pythonはdefで関数宣言を行い、それがそのままオブジェクトになる仕様らしい。
つまりそこで暗黙の代入があるから、後方参照できないとの理由だ。まさに糞だ。

JavaScriptの場合は、これらの宣言を分けている。つまり、
function func0(){console.log('func0');} // (A) console.logはCでいうprintf
var func1 = function(){console.log('func1');}; // (B)
ここでfunc0は後方参照できる。つまりスコープに入っていればいつでも使える。
func1は関数ポインタであり、代入以降でしか使えない。
これが妥当な仕様だ。
関数ポインタは再代入可能だから、順に処理する必要があるからだ。

Cの場合、関数ポインタへの代入は自前で行うわけだから、
コンパイラの努力だけで後方参照できないという制限を解除することが出来る。
いまだにやってないのはただの手抜きというよりも確信犯だろうが。

なおJavaScriptでもPythonと同様に関数はオブジェクトになるのだが、
要するに「スコープ内で先に処理して再代入禁止にしておくべきfunction(A)」と
「順に処理するべき関数ポインタ(B)」を明示的に分離して記述できるだけだ。
みたところPythonには(A)しかなさそうなので、技術的に出来ない理由は無い。
この点についてはCも同様に糞だが、時代の要請があったという理由はある。
Pythonは本当に何の意味も無く制限をつけている、ただの糞だ。
0943デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 10:50:54.11ID:LYlgQVUQ0
>>937,940
俺もそれを知らんかった。
そしてそのページでそれを確認し、K&Rみたら確かに「プロトタイプ」となっている。
だからどうやら俺の誤用だった、とした。

ただまあ、その意味での「前方宣言」なんて見たことないんだけどね。
0944デフォルトの名無しさん (スププ Sd94-UFoF)
垢版 |
2017/07/17(月) 10:55:39.50ID:g3mBUieLd
Pythonはファイルの最後に
if __name__ == 'main':
main()

ってやる関係で、結局実行は最後になるからdefの順番とかで困ることはまずないな
せいぜい関数内関数定義で先に書くか後で書くかくらいか?
一体どんなコード書いてりゃそんなどうでもいいところで引っかかるんだ
0945デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 10:57:04.61ID:LYlgQVUQ0
>>942
Pythonのdefは941で言う(A)なんだよ。
だから後方参照できない技術的理由は無い、という見解だ。
お前には通じないようだが。

それとは別に(B)の記述はPythonでも出来る。
というかこれが出来ない新しい言語なんて無い(ただしJavaを除く)
0947デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/17(月) 11:55:17.77ID:woO8V6Ze0
>>929
あーそう、「ほぼ使わない」のか
チームメイトが(いれば)お気の毒だね

正規表現の「後方参照」はここでの話と全然関係ないぞ
コンパイラにとって初見の識別子があとで宣言されることを
MASMでは前方参照と言っていたが、
Cでは「undeclared identifier: 宣言されていない識別子」
となっているだけだ(もち violation of the syntax)
ちなみにISO/IEC9899には全然違う意味の
「forward declaration: 前方参照」という用語がある

老害を小馬鹿にしたいようだが、脇が甘すぎだぜおまえ
0948デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 12:33:21.67ID:LYlgQVUQ0
>>947
脇が甘いもなんも、お前も全員が妥当だと思う用語を持って来れないだろ。
だったらお前も俺と同レベルなんだが。
913の時点で「『宣言されていない識別子』は禁止」では何を言っているのか通じないだろ。
(「前方宣言必須」は厳密には間違っているが、C使いには意図は100%通じてるだろ)

というかお前は老害ではなく若いのか?その突っかかり方はガキっぽい。
2chは言葉の定義にやたらこだわる奴が多いが、それはただのクソガキで、
仕事してりゃ分かるはずだが、実は社内方言ってのはものすごく多くて、
社外だと全く通用しないことすら自覚できてない場合が殆どだ。
だからすれ違いを感じたら>>932のように確認するのが常で、
俺はそれを受けて>>934と応じた。
ここら辺は仕事をしたことがあればよく見かける光景ではあるはず。
もちろん方言ではなく共通語を使う努力をすべきなのは言うまでもないが、
問題は方言を使っている奴は方言だと認識してないことなんだよ。

だから俺が方言を使っていれば、お前が正しい共通語を示せばいいだけの話であって、
今現在は(需要が既に無いから)共通語自体が存在しない状態だろ。
それをいちいち勝った負けたされても知らんがな。

で、まあ、話を戻すと、
(俺はPython使いではないから間違っているかもしれんが)
俺の理解では、Pythonは「プロトタイプ宣言が出来ないC」だ。
この理解が正しければ、糞だということで割と賛同を得られると思うが。
>>944は糞を量産していることに気づいてないだけだ。

ただそれとは別に、プロトタイプ宣言は無くても通常は構築可能で、
Cはそれが作法になってるだろ。
例えばファイルの先頭でファイル内全関数をプロトタイプ宣言してるソースなんて見たことないだろ。
(コーディングルールとしてこれをやっている所があってもおかしくないが、誰か知ってるか?)
ただ、Cはこの手間をかければ順序は自由にはなるが、Pythonはそれすら認めてないだろ。
この辺、Pythonは無駄に教育的で実践的ではないんだよ。
0952デフォルトの名無しさん (オイコラミネオ MMb6-9jcw)
垢版 |
2017/07/17(月) 14:40:04.91ID:rKRQ/JsKM
forkで子プロセスから、子プロセスを終了させたあとに親プロセスを終了させる方法無いですかね?

親プロセスはwhile(1)で回していて、子プロセスで入力を受け取るのですが、ある入力が来たときだけ、プログラムを終了(子プロセス親プロセス両方共終了)させたいです
0956デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 15:09:00.52ID:LYlgQVUQ0
>>950
行かんよ。俺はPythonの文法もろくに知らないし、使う気もないし。
ただ、俺の理解
> Pythonは「プロトタイプ宣言が出来ないC」だ。
が間違っているのなら、指摘してくれよ。
これが間違いでないのなら、このスレの過半数は糞認定すると思うぞ。

上記が正しいとして、君が糞を量産していることを自覚できていないのは、
C専読者と同じで、Cスタイルで「上位から」書かれているコードを見たことがないからだ。
というか俺もつい先日までそうだったんだが。

とりあえず簡単に確認する方法として、循環参照がある。
例えばCなら、以下になる。

viod say_hello(count){
if (--count<0) return;
printf("hello");
say_world(count);
}
void say_world(count){
printf(" world!\n");
say_hello(count);
}

後方参照できるJavaScriptなら、これはベタで書いてそのまま動作する。
Cだとプロトタイプ宣言が必要だが、実体は上記の通りで動作する。
Pythonは余分な方法を使わないとこれが出来ないんだろ?

これとは別に、そもそも循環参照コードなんて書くなというのはあって、
これを教条的に強制しているのがPythonだろ。
下位からの記述を強制されている場合に、上位から読みたければファイル末尾から読め、
でしかないというのも事実だから、そんなに致命的でもないんだが。
0957デフォルトの名無しさん (ドコグロ MM36-OTuW)
垢版 |
2017/07/17(月) 15:25:01.26ID:iPE66y3WM
>>956
> Pythonは余分な方法を使わないとこれが出来ないんだろ?
普通になにもしなくてもできる
必要なのは>>944のが書いてる
> Pythonはファイルの最後に
> if __name__ == 'main':
> main()
だけ
て言うかPython知らないなららPython云々で語るなよ
アホの戯れ言をいちいち訂正するのが面倒すぎる
0959デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 15:32:56.88ID:LYlgQVUQ0
すまん、>>956は間違いのようで、Pythonでも関数間の参照自体は出来るらしい。
> 再帰関数の前方参照
> http://www.isc.meiji.ac.jp/~mizutani/python/recursive_call.html
だから関数定義を全部先にしてしまえばいいということになる。
それが見易いとは思わないが。

しかしCは関数内関数が無いのでそれ以前だ。
GCC拡張を利用するなら、
関数内関数を全部「頭」に配置しないといけないのがPython、
どこに配置しても自由に呼び出せるのがJavaScriptということになる。
GCCの場合はCと同様プロトタイプ宣言とかも関数内に使えて配置も同様、ということなのかな?

>>957
ああ悪い、こっちも確認した。上記の通り。
というかPythonの話は止めよう。俺はそっちには興味ない。


話を戻すと、俺が思うCに足りないのは「階層」と「後方参照」だ。
これら2つがあれば、今現在細切れになっているファイルを1つに束ね、
一番読みやすい順にソートできる。
お前らがピンと来ないのは、多分俺と同じで、見たことがないからだ。
後方参照できる言語でCスタイルで書かれた大規模コードを一度見れば分かると思うよ。
0961デフォルトの名無しさん (ワッチョイ 7e32-vfgv)
垢版 |
2017/07/17(月) 16:53:25.99ID:OvXGqJkd0
ctagsとか、タグジャンプつかおうな?

上から下にならべてあるから読みやすいですとか、眺めてるだけですと、宣言してるようなものだ。

トレースする気がないべ?
0962デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 17:26:09.82ID:LYlgQVUQ0
>>960
いや事実だぞ。

君は都合が悪い部分には回答しないようだが、プロトタイプ宣言が無いのは事実だろ。
それは下位関数も含めて全部上側で記述することを強制する。
C言語でプロトタイプ宣言が無い場合に似ている。
ただし関数内から別関数への参照は「動的」に行われるのでCより制約は緩くなるが、
本質的にはあまり変わらない。
そもそも、下位関数なんて名前を見たら実装なんて見ずとも結果が分かるべきものだし、
それがオブジェクト指向の思想だろ。下位関数は読む必要なんてないんだよ。

俺は「『君が無能だから』糞コードを量産している」と言っているわけではない。
Pythonの仕様が糞だから、「Pythonでは糞コードしか書けない」と俺は言っている。
そこを君は勘違いしている。

それはそうと、Pythonのスレ試しに見てみたが、相当酷いな。あれじゃマ板だよ。


>>961
IDEに使って本格的に読めばその辺も含めて改善するのだろうが、
設計者が分かりやすいようにソート済みなのと、
コンパイラに都合がいいようにソート済みなのでは、全然違うんだよ。
そしてCは「ファイル」を階層として使っているのだが、これがもう古い。
タグとか使って一発で飛べるのなら余計に1つのファイルにまとめてあったほうが好都合だろ。
(もっともタグ使えば複数ファイルでも飛べるのだとは思うが)

ただ、俺が求めている階層は関数内関数で十分で、
GCCで採用されているのでいいんだが、アレは何で標準にならないんだ?
0964デフォルトの名無しさん (ワッチョイ df23-S4qQ)
垢版 |
2017/07/17(月) 17:52:48.13ID:6JtF0HSC0
>>952
親プロセス while (1) で回してるって、その while (1) の中でやってる処理はなんだ?
wait() してないのか? wait() してるならそれで子プロセス側の exit() のステータス
受け取れるからそれで親側で判別すればいいんじゃない?

てか、これCはCでもUNIX系OS固有の話だよな。ここだとスレチにならんか?
0967デフォルトの名無しさん (ワッチョイ df23-S4qQ)
垢版 |
2017/07/17(月) 18:06:17.25ID:6JtF0HSC0
>>959
まあそれで見やすくなるだろうから、そういうCを拡張した新しい言語作れば良い。
しかし、問題はC(あるいはそこからちょっとしか拡張されていないような言語)を
人間が直接使う機会はおそらく減り続けることにある。今でもほとんどOSや
デバイスドライバを記述するアセンブラ代わり
0971デフォルトの名無しさん (ワッチョイ 4ed7-H2gN)
垢版 |
2017/07/17(月) 18:46:26.39ID:PKmAGp8M0
Objective-Cで全部可能ではある
C言語でもclangならblocks拡張(関数オブジェクト・クロージャ)が使える
関数内関数は単純に制御構造だと捉えれば、C言語でもgoto文で可能でしょう
0973デフォルトの名無しさん (ワッチョイ 8a1c-UU3S)
垢版 |
2017/07/17(月) 18:59:20.24ID:woO8V6Ze0
>>948
いやコンパイラにとって初見の識別子があとで宣言される
という形になっているコードについて話しているのは
みんなわかってるのに、頓珍漢な言葉遊びに持ち込もうと
している邪魔な奴がおまえだ

> Cはそれが作法になってるだろ
はあ? 聞いたこともねえぜ、寝言は寝てぬかせ
横着しねえでちゃんとプロトタイプ宣言すんだよ
正直たまにサボることがあるのを恥もせずに
それがスタンダードとか居直るおまえの態度が鼻持ちならん
0975デフォルトの名無しさん (ワッチョイ 4ed7-H2gN)
垢版 |
2017/07/17(月) 19:03:27.54ID:PKmAGp8M0
>>972
俺も非依存性重視なので、拡張なしの標準的なCでやってるよ
プロトタイプ宣言とクロージャは諦めなきゃならないが
クロージャはコールバック関数のポインタを渡すという伝統的なやり方でできる
0977デフォルトの名無しさん (ワッチョイ 4ed7-H2gN)
垢版 |
2017/07/17(月) 19:25:58.36ID:PKmAGp8M0
>>976
いやコールバック関数のポインタ渡しで代替だからw 別に関数書く必要はあるよ
blocksみたいに、同じスコープにコールバックの処理も書けちゃうっていう便利さは無い

環境のキャプチャもしたければ、値のコピーをヒープに確保してコールバック側でfreeとか、
工夫すればできるでしょう
0979デフォルトの名無しさん (ワッチョイ aa11-OTuW)
垢版 |
2017/07/17(月) 19:45:22.30ID:U2FIHXXv0
>>959
> というかPythonの話は止めよう。俺はそっちには興味ない。
はあ?
Python言い出したのはお前だぞ w

>>962
> Pythonの仕様が糞だから、「Pythonでは糞コードしか書けない」と俺は言っている。
だから知らないならPythonに触れるなよ
別にPythonサイコーって思ってる訳じゃないけどお前の指摘は全て的はずれすぎる
関数定義の順序に制限なんてない
あとローカル関数についてはJavascriptも似たようなもんだぞ
0980デフォルトの名無しさん (ワッチョイ aa11-OTuW)
垢版 |
2017/07/17(月) 19:47:31.91ID:U2FIHXXv0
>>970
> 関数内関数って要するに高階関数のことだろ
全然違う

> 関数型言語または関数型のマルチパラダイムの言語でないと無理だろ
Pascalでも使えるのに何を知ったかしてるんだよ w

>>971
> 関数内関数は単純に制御構造だと捉えれば、C言語でもgoto文で可能でしょう
これはさすがにアホすぎる...
0982デフォルトの名無しさん (ワッチョイ 386f-/Dy+)
垢版 |
2017/07/17(月) 20:24:44.55ID:IbKZMmLs0
関数の内部で関数を定義するようなイメージじゃないの?
C言語では不可能だけど
void functionA(void) {
 …
 void functionB(void) {
  …
  void functionC(void) {
   …
  }
 }
}
0984デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 21:01:30.74ID:LYlgQVUQ0
>>963
> トランポリンコード
なんだそりゃ?と思ったらこれか。
http://d.hatena.ne.jp/yupo5656/20040602/p1

なるほどGCCのは単なる階層ではなく、プチグローバル付きか。
この仕様なら上位階層(ファイル)を記述変更無しで取り込めるが、
これは確かに標準化には微妙だな。俺はGCCの仕様を詳しく知らんかった。すまんね。
しかしこれ、C++のメンバ関数ポインタみたいに、
普通の関数ポインタと相互運用することは諦めてしまっても良かった気もするが、
それだとレガシーとは相性が悪い。微妙なところだね。
0988デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 21:20:55.01ID:LYlgQVUQ0
>>967,969
チョイ拡張言語ってのはエコシステムが付いてこず勝手に死ぬ。
Dもだし、Objective-CはAppleに拾ってもらえたけど、もう確実に死ぬ運命だよね。
(あれらはチョイ拡張でもないが)
チョイ拡張だとわざわざCから移行する意味が無いんだよ。
理想的にはやっぱ標準に入ってくれないと辛いわ。

Cが死に行く、って指摘については、俺もそう思っていたのだが、
何度も言っているが最近Cスタイルの他言語コードを見てちょっと考えを改めつつある。
OOPのコードは結構真面目に追いかけないと辛くて、読みやすくはない。
これはCも同様だと思っていたのだが、実はCの読みにくさは「階層」と「後方参照」がないだけで、
(つまりファイルがバラバラで、しかもグダグダな順に書かれているからであって《=プチ難読化済》)
構造的に問題があるわけではなく、それなりに読みやすいことに気づいた。
だからこれらがある言語(Python以外の新しい言語全部)でCスタイル(手続き型)で書かれたコードは
実はかなり読みやすいのだと思う。
(問題は、そういうのにあまり遭遇しないことだが)

だからC自体は廃れるかもしれないけど、Cスタイルは多分廃れない。
そして今のところ手続き型万歳的な言語はCだけだ。
となると、Cに足りない上記、「階層」「後方参照」が入ればCってもう一回来るかも?とも思う。
(つか、namespaceすら入れないって何よ?とは思うよマジで)

>>986
0990デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 21:30:16.49ID:LYlgQVUQ0
>>973
全部書くのがお前のジャスティスならそうすりゃいいし、
実際そっちが主流かもしれん。

しかしヘッダファイルを用意するなんて完全に二度手間だし、
コンパイラが自動的にやれよマジで、と思ったことは無いのか?
コンパイル時間が気になるのなら、ヘッダファイルを用意しろ、
面倒ならなしでよし、その場合はコンパイラが勝手に探してくる、
その分コンパイル時間はかかるが手間が省ける、って仕様で何も問題ないだろ。
てか他言語は全部そうだし。(Python除く)

俺はあの仕様がいまだに残っており、
また、お前みたいに疑問を持ってない奴がいることがよく分からん。
0991デフォルトの名無しさん (ワッチョイ 0123-z+eH)
垢版 |
2017/07/17(月) 21:39:14.19ID:LYlgQVUQ0
>>989
× Pythonがプロトタイプ宣言の必要のない
○ Pythonはプロトタイプ宣言が出来ない
○ JavaScriptはプロトタイプ宣言が必要ない

何度も言っているがこれだけでPythonは糞だと断定できる。
一番わかりやすい順に記述出来ない時点で糞。
ただしPythonってのは元々そういう言語。ユーザの自由を認めていない。

で、俺はマジでPythonに関わるつもり無いからもう止めて。
Python信者が発狂しているし。俺自身Python知らんし。
0995デフォルトの名無しさん (アウアウカー Sa0a-S4qQ)
垢版 |
2017/07/17(月) 21:46:23.02ID:/QULOYxMa
>>990
いや、何も無理してC使う必要はないんだよ。なんだったら新言語作ればいい。
bison, flex (yacc, lex) があるわけだし。

で、比較的楽に言語を作る方法は、C言語へのコンバータにしてしまうことだ。
そうするとかなり多くの環境で動くものがいきなりできる。
C++も最初の頃はそうだった。
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 66日 23時間 31分 46秒
10021002
垢版 |
Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/

▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況