C言語なら俺に聞け 140 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
C言語からVBAで作ったエクセルマクロって実行できないの? C99からif,for,whileの後に続く括弧の中がブロックのなかという
認識になったらしいんですけど、for以外でどうやって
その中で変数を宣言できるというんですか?
だったらforだけブロックの中っていうことでいいんじゃないんですか? if ( char * p = malloc( N ) )
こういうのとか? >>7
VBA マクロのインタプリター書けば良くね?Cで。 おいQZゴミコードをここで書くなよ
ウンコードに投稿しろよ おいQZ
おまえってやればやるほど洗練された糞さを放ったコードが出来上がるから
自覚しとけ おいQZいろんなC系スレでクソコードばらまくのやめろよ
今時Cでクソなコード書いてるのはおまえしかいない printf("%s", string);
ではなくて
printf(string);
でエラーが出ないようにするにはどうしたらいいですか? #define printf(string) printf("%s", string)
とする stringがchar*なら、それでエラーは出ない
キミが間違っとる コンパイラーによってはセキュリティ警告でも出るんだろうな >>16
print「f」なのにフォーマットしないってなんか気持ち悪いな gcc使っているならコンパイル時のオプションに-wでコンパイルできたわ >>18
printf("Hello, world!/n”);
気持ち悪いか? string の中身に %s とか %d とかはいってると あわわわ >>23
ああ、そう言う事なら、静的な引数チェクが不可能な文字列は警告だすのもありかも知れんな
実例は見た事ないが format string attackって攻撃が実在するからな
C11で%nが廃止されたのも、それが原因だし >>27
どのコンパイラもオプションつければ動的に決まる文字列は警告出すぞ
遅い上に危険で利点がない
%nが消えてもメモリ内を読まれるのは脆弱性 >>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;
} int a=1;
a = a+++a;
これ、たいていの環境で 3 になるみたいだけど
内部ではどっちに構文解析されてるの? >>34
後置インクリメント演算子(a++)は+演算子や前置インクリメント演算子(++a)より優先順位高い >>34
VC++の場合
a = (a + a)++;
GCCの場合
a = ++(a + a);
int a = 10;
printf("%d\n", a); // a=10
printf("%d\n", a=a+++a); // a=20 (VC++の場合)、a=21 (GCCの場合)
printf("%d\n\n", a); // a=21 >>36
演算子の優先順位と構文解析は関係ねーよ
前方から最長になるように字句解釈するから、 a=a+++aは、a = a ++ + aになる >>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は素直に前方から評価すると思っていたが、
インクリメント演算がある項を先に評価するようだ。 >>39
なるほど先頭から最長一致か ありがとう
a = a+++a; // 21
a = a+ ++a; // 22
a = a++ +a; // 21
gccだとこんな感じになったわ >>40
関係ない
演算子の優先順位はトークンが確定した後の話
構文解釈とは一切関係ない 知ったかぶりしないで
副作用完了点を検索してからレスしようね さすがに、a=a+++a が未定義なことぐらいわかってるだろ
そのうえで、どう動作してるのだろうかって話じゃねーの? 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に代入 GCCは逆コンパイラが使える環境を持っていないので誰か頼みます >>45
未定義とされているものの実装を調べる意味は一片たりとも無い
b = a+++a; ならば文法どおりに解釈されてなければ、コンパイラのバグなので検証する意味はある >>53
そこだけで未定義
2つ目のaを別の変数に退避し上で加算しないとアウト >>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 レイアウト崩れたので修正
逆アセンブルコード
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 >>53
ああすまん、そのとおりだね
なに寝ぼけてたんだろう >>33
ありがとうございます!
すっきりしました! >>53
b = a++ +a ならギリギリセーフかなーと思ってた。
これもアウトなんか ざっくりだけど
C99以前だとaの変更とその変更と関係ないaの評価を行っているからアウト
C11だとa++でのaへの1加算と、2つ目のaの評価に順序性がないからアウト おいQZお前はC向いてないからやめろ
このスレを荒らすなクソマニア a = f(x) + g(x);
とした場合、f(x)とg(x)の関数呼び出しで
どちらが先になるのかは未定義ってこと? >>63
関数呼び出しの順序の問題ではなくて、インクリメント演算子を自分自身に適用した場合の副作用の問題
f(x)の副作用としてg(x)の状態を変化させ、g(x)の副作用としてf(x)の状態を変化させるような場合、(f(x) + g(x))の評価は未定義ということ 「インクリメント演算子を自分自身に適用した場合」は説明不足だった
「同じ式の中でインクリメント演算子を自分自身に繰り返し適用した場合」の方が適切だった >>63
a++ + a
右のaがどうなるか考えてみ 大学の講義でc言語やってるのですが、行き詰まってしまったので質問させていただきます
分割コンパイルしているのですが、全部書いてあります
コメント文で分割コンパイルの区切りを表しています
http://codepad.org/VplJG9tZ
これによって表示されるものを左に90度回転させたいのですが条件としてmain関数しかいじってはいけないというものがあります
2次元配列でいけるのかと思ったのですが、どうしたらいいかわからず手詰まりです
よろしくお願いします a = a----a;
ってコンパイルできないのね
a = a-- - -a;
にすればコンパイルはできるが >>69
エラーになるかどうかもわからない
それが未定義動作 >>74
問題はグローバル変数を使うからじゃないの? >>68
swiftだとa++は廃止された
分かりやすく書くってこと わからなかったの間違えだろ
正直に言えよ無職無能QZ 宿題スレはどこでしょうかw
おいQZこのスレまで宿題スレ化しようと企んでるのかよ 最近の宿題スレで質問者演じてるやつと口調が見事に一致 C言語って、機械に分かりやすい言語なんじゃないかな #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
にするにはどうすればいいの?おしえてエロい人 a = a + 1;
if (1 <= i && i <= 3 && 3 <= j && j <= 6) fprintf_s(fout, "%d ", a);
else fprintf_s(fout, "0 "); >>94
大学生です。
指定場所以外も数字が出てしまいます if (4 <= (a % 10) && (a % 10) <= 7) printf("%d ", a);
else printf("%d ", 0); >>95
ベン図的な考え方ですか......!!
ありがとうございます。
>>97
なぜか0〜50全て表示されてしまってます!
>>98
エロ魔人になるにはまだ早いです! >>99
キミがなるんじゃ無い
キミが質問したがってるエロい人の住処に移れと言っている >>93
どうでもいいけどコメント酷すぎ
> int i, j, a; //int 整数
> FILE *fout; //FILE ファイルの管理用 俺なら条件部分は↓のように書くかな。
if ((a >= 10) && (a < 40) && ((a % 10) >= 4) && ((a % 10) <= 7)) {
「表示する値、表示しない値を条件に判断」という雰囲気。
普段は表組みの行と列の番号(変数i, j)で制御するけど、
この問題だとaの1の桁の値とjの値が一致しないから何やら座りが悪い感じ。
a = 10*i + j + 1;
みたいに「行と列の表示位置から表示すべき値を算出」なら馴染むんだけど。 if(i==0&&j==9) printf(" 0¥n);
else if(i==1&&j==3) printf(" 14");
else if(i==1&&j==4) printf(" 15");
:
else printf(" 0"); >>105
> if ((a >= 10) && (a < 40) && ((a % 10) >= 4) && ((a % 10) <= 7)) {
なんかちょっとイラッとくる
if ((10 <= a) && (a < 40) && (4 <= (a % 10)) && ((a % 10) <= 7)) {
の方が分かりやすいじゃん
って思うのは俺だけかな
まあそもそも >>95 でいいと思うが 数直線的な並べかたやね
a が10〜40 を 10 <= a <= 40 と思考して
その並びを Cの文法に適合させて 10 <= a && a <= 40 int 変数 = 0;
do{
if(変数 != 0) printf("0〜100違う");
scanf("%d",&変数);
} while (変数 < 0 || 変数 > 100);
みたいな感じのやつどういう仕組み? if (10 <= a && a < 40 && 4 <= a % 10 && a % 10 <= 7) {
ほらすっきり。 if (a/10&3&&a%10&4) { ... 10で剰余したものをビットマスクって、おまえ何屋?
ビット演算子はB言語の名残で変な結合するから気をつけたほうがいいが
その話と>>111のコードは関係ないぞ >>110
(1) 入力
(2) 判定
範囲外の場合、警告表示して (1)に戻る
を並べ替えたもの
(1) 条件付(初回以外)は 警告表示
(2) 入力
(3) 範囲外なら (1)へ戻る きっちり優先順位をケアすれば合ってるんでないの?
10の位 & 3 (. 1 2 3 . 5 6 7 . 9
1の位 & 4 (. . . . 4 5 6 7 . . >>114
特定の値域でしか正常に動作しない欠陥コード晒して、何粋がってんの? え?
i と j が20兆でも動く必要があるの?
で、短くできた? >>119
if (a/10&3&&a%10&4&&(a<38)) { ...
これでいいか? 絶望的にセンスが悪い
> a=>10
比較一回を
> a/10&3
除算一回, 論理積一回に改悪
しかも文字数でも1文字増えている i,j で分離すべきなのか a で分離すべきなのか元質問からは読み取れんし・・・
a がたまたま正の整数で良かった (負数の剰余は考えたくないw) まあまあ。
動作に関係ない仕様を思い込みで追加するのは良くないな。
「今不要なら、今書くな」だっけか。 C言語ってEclipseの補完が動かないのがデフォなの? >>128
そうそう。ソフト屋なら知ってるもんかな?
"Keep it simple, stupid" まさに。 Cは、ライブラリがすくない。おぼえることがすくない 関数にinlineをつけて外部定義を無くせば
インライン展開されなければinline staticと違って
リンカエラーになるとおもってたんですけど、
inline staticを使ったときにはインライン展開される関数が
inlineをつけて外部定義の無くすとリンカエラーになります
なぜですか? >>131
野良ライブラリが多いのは多分Cが一番だろうけどな。
何かしらの言語の野良ライブラリの元はCの野良ライブラリが必要で〜とかで、Linuxじゃないと集めてられない。
Win32APIもC前提だけど、多分MSの中の人もいくつあるか把握出来てないんじゃないかな。 ISO/IECだってしょせんはブランドの1つでしかなく
別に数学的な公理とかじゃないからな 無矛盾な公理的集合論は自己そのものの無矛盾性を証明する事ができない ./a.outって入力すると'.'は認識されてないと言われました
何が問題でしょうか? >>136
コマンドプロンプトはMS-DOSのカルチャーで区切りはバックスラッシュで、MSYSやLinuxはbashのカルチャーで、スラッシュが区切りあるね。 >>136
区切りで「/」使いたいなら、パス全体を「"」で括る
「/」以降をオプション「.」をコマンドとして認識するから、全体で一つのコマンドと認識させる必要がある
「/」を区切りに使うのはunix
windowsでも一応使えるけど普通はバックスラッシュ使う >>136 >>137
バックスラッシュということは¥ですよね? bashではセキュリティ上の理由で、現在のディレクトリのプログラムを起動するのに、./が必要だが、Winのプロンプトでは不要。 >>139
日本語のwindowsならそう、円記号
コマンドプロンプトとかエクスプローラとかのパス表示には区切り文字に\使われてるでしょ 昔は.がデフォルトでPATHの先頭に入ってたな
ホームディレクトリにls置いたら面白いことになった #include <stdio.h>
int main(void){
char i[100];
printf("名前を入力してね。\n");
scanf("%s",i);
printf("%sさんですね。\n",i);
return 0;
}
7行目scanf関数で、&iでなくて、iでいけるのはなぜですか? >>143
i の型はポインタ,すなわち char *i だから >>142
&はアドレス演算子で、その変数がメモリ上のどのアドレスにあるかを示す
scanf関数で&を使うのは、つまり、「この変数のアドレスに読み取ったものを書き込め」という意味になる。
しかし文字列などの配列は、配列名自身が「配列の一番最初の要素へのアドレス」を示すものになっているので
配列には&が不必要 >>144
printf("%u", sizeof i);
これで4だか8だかになるとでも? クズの言い方だと
float a = 1.5f;
printf("%f", a);
これが問題なく動作するから、
よって a は double 型だと言っているようなものだ >>143
配列を関数に渡すと配列の先頭要素へのポインタになるから。
んで、&は参照なんだけど、参照ってざっくり言えば読み込み専用ポインタ。 あ、読み込み専用ってのは値が変えられないんじゃなくて、アドレスを変えられないって意味ね。
関数に渡された配列iをi++ってするとi[a++]と同じ意味になる。
(Cでi[a++]なんて書き方許されたかは忘れたが意図は組んでくれ) >>146
そりゃ配列とポインタは振る舞いがまったく同一というわけではなく,はっきりいって別物だから,言い分はわからんでもない.
>>143
訂正する,配列名を示す識別子は配列の先頭を示すポインタになる >>145 が丁寧な説明だ
>>147
そのたとえは意味不明,可変長引数の可変部は float->double に格上げされることを隠すなんでひどい物言いだね linuxでc言語開発したいんですが、IDE使わないのが一般的なんですか? はい。
CやJavaならEclipseが一般的かと。
Eclipseにサポートして貰ってないのはviやemacsカスタマイズしてIDEとして使う感じ。 >>157
質問文が酷すぎて、何を聞きたいのか理解されてないだけだぞ >>154
最近は yacc じゃなくて何か新しいのあるんだよね。 >>159
最近じゃないけど bison とかか? >>152
>訂正する,配列名を示す識別子は配列の先頭を示すポインタになる >>145 が丁寧な説明だ
なんねーよ カス
int a[10];
a++; // お前の主張が正しいならエラーにはならないはずだ >>149
コンパイルエラーって、どこが?
https://ideone.com/VpAiLB
>>152
147だが、最後ふじこってんじゃん
落ち着いてもっぺん日本語で書いてくれ >>162
横からと言うか流されてるんで。。。
飛び飛びになってるけど
>>148
>>150
>>151
は、おいらなりに結構正確に書いたつもり。
参照はC++用語だからCだと&はアドレス演算子が正確だけど。 はいはい,そりゃ配列とポインタは互換じゃないよ
分かりやすい説明はないものかね‥ >>164
>147だが、最後ふじこってんじゃん
ん? %f は 引数を double 仮定で引き出す
呼び出し側は (可変長引数の可変部なので) doubleに格上げしてから引数に詰んでる
詰んでるものと引き出すものの食い違いはおきてないんじゃないかね >>168
>積んでるものと引き出すものの食い違いはおきていない
そりゃ引数に積むときに float->double しているから,そうなって当然だが,その事実を隠したまま
>>147
を主張されても,そりゃないよ,としかいいようがない. >>166
無いなー。。。
ここが変だよC言語とかもう廃刊だっけ。
あれじゃないと説明しきれん。 配列型の"式"は、一部のケースを除いてポインタ型の式に"型変換"される、それは配列の先頭要素を指す、また左辺値でもない
関数の実引数での使用についてなら、>>147の既定の実引数拡張でfloatがdoubleに拡張(型変換)される例と同じような話だと思うんだけどな >>146
おいらはこれ、sizeofが関数じゃなくて演算子って呼ばれてるのが肝で、関数に配列渡しても何故かポインタのサイズじゃなくて配列サイズ返す謎な奴って解釈してるな。 んあ。
ごめん。
>>172は無し。
嘘付いた。
配列関数に渡す時、配列の大きさも別で関数に渡してたの思い出した。 >>146
これは配列宣言した場所と同じスコープなら配列のサイズ返すけど、配列を関数に渡した先(関数の中)でこれするとポインタのサイズが返ってくる。 >>174
int main(void)
{
char i[100];
wanker(&i);
return 0;
}
void wanker(char (*j)[100])
{
/* ここは、「配列を関数に渡した先(関数の中)」だが? */
printf("%u", sizeof *j);
} >>169
隠している? それは聞き捨てならんな
公文書に書かれていることを俺がどう隠したとぬかす? >>176
それ、文字配列だからヌル文字(0)で数えられるっしょ。
intの配列とか無理だから。 >>178
どう無理なんだ?
int main(void)
{
int i[100];
booger(&i);
return 0;
}
void booger(int (*j)[100])
{
printf("%u", sizeof *j);
} いやいや sizeof はコンパイル時に確定する演算だから
strlen みたいにポインタの指し先追っかけてデリミタ見つかるまでのバイト数とか 実行時依存じゃない >>179
ん?
出来てんの?
よく見たら宣言だけで初期化(確保)はしてないのな。
うーん。。。
ちょっとおいらの方でも書いて検証してみるわ。 だから sizeof は型さえ類推できれば、変数の実態なくてもいいんだって
なんなら () 付けて 型をかけばいい >>182
型をかけばいいって、こうか?
if (sizeof i != sizeof(char*)) puts("ahem!!"); >>184
ごめん、すべて ID:8VZiX6Z0a 君向け (>>178 他) >>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]);
}
こう言うコードだとポインタのサイズが返ってくる。 sizeof a[100]はタイポだけど許してね。
配列の変数名にiとか普通使わんのよ。
インデックス変数に使うからさ。
a[i] void f(void * v, int size, void * x){
*v=*x;
}
上のコードで x の指し示す値のサイズが size であるとき
どのようにvの指し示す場所にxが指し示す値を一度に代入できますか? for (i=0; i<size; i++) ((int8_t*)v)[i] = ((int8_t*)x)[i]; while(size--) *(char*)v++ = *(char*)x++; >>194
文法エラー (v, x のインクリメント操作は void * で評価されてる) 最近はCMakeを使うのが普通なの?
GNU Make覚える必要があるかな
話変わるけど、MakeFileってソース1つ追加するたびに、変更する必要がある? >>195
すまん、素でボケてたw
しかしこれ構文規則には違反してないぞ
意味論においてvoid*の増分が禁止されているって話で >>199
あー コンパイルエラーと言えばよかったかw Makefileを作らなくてもmake出来るケースがある事を最近は知らない奴が多い cc love.c じゃなく
make love でいい件か? makeのデフォルトルールだね
.c.o はよく使う 作って覚えるVisual C#のようなゴールを設定して色々学ぶC言語の書籍はありますか? 便利にゃ違いないけど
ロクに指示も与えずよきに計らえってスタンスで
何が出来てくるのかに受動的でいることに
俺は我慢できないな
無関心な大将を有能な部下がフォローして事なきを得たってことだろ だからスタックサイズのデフォも知らない馬鹿が大量発生するわけだし >>195
(void *)c++ は1だけインクリメントされる,c99 では規格で決まっている >>199
>意味論においてvoid*の増分が禁止されているって話で
そんな決まりはない,void * のインクリメントは正確に1だ *vがsize分確保されてないんじゃね?
普通こうだよな
void f(void ** v, int size, void * x) voidがサイズ持ってるとか無理やり過ぎ
便利だけど >>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規格違反ではない。 >>218
「void はサイズ1だけど、sizeof するなよ」ってことじゃね?
「適用してはならない」が何なのかわからんけど。 >>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.) おいQZ都合悪くなったら自演で叩きかよ
おまえもうム板に向いてないから一人でコードオナニーしてろよ この件、過去に私が書いたコードを元に議論されたんだよね、当時の書き込みが見つからない…
>>218
>>222
ありがとうございます。感謝です。うれしいです。
>>218
>void へのポインタは,文字型へのポインタと
>同じ表現及び同じ境界調整要求をもたなければならない。
というのだから
>>222
当然、(char *)++ と (void *)++ は同じだよね 配置アドレスのアライメント要求が等しいのと
アドレスの算術演算で同じ結果になるのは別じゃ? ideone の C99 でも(同じwarninngで)文句言ってるな
https://ideone.com/fDNXlH >>225
「同じ表現及び同じ境界調整要求」と同じ演算ができるかは別の話だ。
const変数は非const変数と「同じ表現及び同じ境界調整要求」だが変更できない。
>>222のJIS X 3010:2003該当部分は下記の通りだ。
voidはオブジェクト型ではなく不完全型だからvoid*に加減演算するのは規格外だ。
> 6.5.6 加減演算子
> 制約 加算の場合,両オペランドが算術型をもつか,又は一方のオペランドがオブジェクト型への
> ポインタで,もう一方のオペランドの型が整数型でなければならない。(増分は 1 の加算に等しい) 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] >>225
char型へのポインタ型のオブジェクトとvoid型へのポインタ型のオブジェクトが同じ境界調整を持つという規格が
なぜchar型のオブジェクトとvoid型のオブジェクトが同じサイズという話になるの? >>230
なるほど、感謝です。
この議論、以前にも(自分のコードを対象に)問題になって、そのときは
void *p;
に対して
p + 3
が意味をもつのか、というあたりだったのですが、当時の議論に誤りがあったのかもしれません。
なお手元のgcc5.3.0 では -ansi -Wall で警告を出してくれませんでした。
>>228
あなたにもとっても感謝してますよ
これからもどうかご教示ください :-)
>>233
えっ、そう読むのか… >>234
それ以外にどう読むの?
「同じ表現」はポインタ型のオブジェクトの内部表現の話だよね
並列で書いてある「同じ境界調整」もポインタ型のオブジェクトの境界調整の話と捉えるのが自然じゃないの >>234
あと、-Wpointer-arithって言われてるのに、なんでWallで確認してるの?
Wallを勘違いしてない? >>230
>(増分は 1 の加算に等しい)
++を増分演算って訳した上に「演算」を省略すると意味不明になるね >>235
該当部分を読むと
JIS 6.2.5
>void へのポインタは,文字型へのポインタと同じ表現及び同じ境界調整要求をもたなければならない ( 39 ) 。
>同様に,適合する型へのポインタ同士の場合,修飾版であるか又は非修飾版であるか(const とかのことby QZ) にかかわらず,
>同じ表現及び同じ境界調整要求をもたなければならない。
>構造体型へのポインタは,すべて同じ表現及び 同じ境界調整要求をもたなければならない。
>共用体型へのポインタは,すべて同じ表現及び同じ境界調整 要求をもたなければならない。
>これ以外の型へのポインタは,同じ表現又は同じ境界調整要求をもつ必要はない。
これを読んで感じるのは、つまりポインタ自身の表現やアラインメントを、いろいろ細分化する実装を思いつかない
far とか near とかでもなさそうだ。
細分化するとすればむしろポインタが指す先に関することではないだろうか?
>>236
え?-Wall って全部だすんじゃなかったんですかね。たぶん勘違いしていると思う。 汎用ポインタのインクリメントは、
エラーが出るか1進むかだろう。 >>235
境界調整が同じでもサイズの違うオブジェクトへのポインタはあるだろ
char *a, (*b)[2];
K&R C では char* でよかった用途に、
なぜ、わざわざ void* を持ち込んだのか考えてみれ
サイズが 1 なのが気持ち悪くて、
サイズが不明ということにするためだろうが
この期に及んで void* が指す先のサイズが 1 とか言い出す
どスカタンがもしいたら死刑でいい話だぞ >>240
安価先間違ってない?
ポインタの指すオブジェクトのサイズが一緒なんて一言も書いてないんだけど >>240
よくわかる、その意見
でも memcpy(), memmove() の引数が void * であることが、ちらりと頭に過ぎるんです
これらは C で実装できない、てことですかね? ID:F0rvxaiH0 = QZaw55cn4c >>241
IDで追ってみたら、おまえさんの疑いは晴れた
すまんかった >>244
void *memmove(void *dst, const void *src, unsigned n);
void *memcpy(void *dst, const void *src, unsigned n);
にて char * ではなく void * になっている理由はなにか? >>240
いや第一目的は、全ての型へのポインタと互換(キャストなしで変換できる)なポインタが欲しかったのだ >>246
汎用なのになんでstring.hかと思ったことはある >>238
Wallは全ての警告が有効になるわけではない
https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/Warning-Options.html#index-Wall
> これを読んで感じるのは、つまりポインタ自身の表現やアラインメントを、いろいろ細分化する実装を思いつかない
> far とか near とかでもなさそうだ。
> 細分化するとすればむしろポインタが指す先に関することではないだろうか?
思いつかないなら、同じにすれば良いだけでしょ
そこからなぜ「同じ表現」はポインタの話なのに、「同じ境界調整要求」はポインタの先のオブジェクトの話になるの?
>構造体型へのポインタは,すべて同じ表現及び 同じ境界調整要求をもたなければならない。
>共用体型へのポインタは,すべて同じ表現及び同じ境界調整 要求をもたなければならない。
構造体/共用体型のオブジェクトが等しい境界調整要求を持つほうが非現実的でしょ >>247
K&R C では char* をキャストなしで変換できてたが?
int *a = malloc(4); >>246
バス幅が8bitでないハードでもったいないことしないためだろ >>238の通りQZは「構造体型のオブジェクトが全て同じ境界調整要求をもつ」と主張してるからな
この世に存在する大多数のコンパイラが規格に準拠していないという新説を主張しているぐらいだら
QZの脳内には、余人には考えつかない理屈があるんだろ >>250
なんかトートロジーみたいになってきたけど、K&Rの何でもポインタとして使われてたchar *は
ANSI以降はvoid *になったってことでしょ すいませんこのスレにワッチョイを導入した経緯ってなんですか? >>254
言い忘れ
今のCだって void* を void* 以外のポインタに変換できるが
あくまで推奨としてキャストする慣習があるだけで、
キャストが義務化されたのは C++
なので >>247 はかなり斜め上
あることを言い忘れているのだろうと好意的に解釈しても
互換とは何かについて考察が甘いと言わざるを得ない cuda Cコンパイラーは
void*型からの代入にキャストが無いとエラーになる
多分MSのcl使ってるからそうなる >>257
そりゃ、管の方言だろ
cl, gcc, clang-cl どれもok PStructA pstA[10];
に対して
&pstA[1] と pstA+1 は同じ一番目のポインタを返すという認識で合ってるでしょうか?
ポインタ演算と配列の違いが腑に落ちてないです アドレス取得が後か先かの違いじゃない?
あんまり深く考えるとハゲるよ >>250
逆ができたか? できなかったと記憶してるが NVIDIAのOpenCLコンパイラはvoid*を演算するコードをコンパイルしようとすると落ちる。 >>261
できる/できないを、何を基準に言っている?
K&R 仕様の cc は死ぬほど寡黙なコンパイラで
だからこそ lint が別で用意されていたんだぜ for(int i=0;i<a+3;++i)
でaがループの中で使われなくても毎回計算されなおしますか? >>264
volatileなら必ずされなおす
volatileじゃなければされなおされない可能性がきわめて高い >>263
ああ、思い出して来た
K&R(コンパイラ)では代入でポインタの型検査を行わなかった
関数呼び出し関数プロトタイプがないのでできなかった
すなわち全てポインタ型は互換だった
ここにポインタの型検査を持ち込むんだからK&Rでの「互換」はANSI Cか必要とした「互換」ではなく当然に役にたたない
従って、>>250は的はずれな指摘 落ち着けよ
代入と関数原型は関係ないし
格助詞がふじこってるぞ わざとそのように誤読したがるのはわかるが
> 関数呼び出し時の検査は関数プロトタイプがないのでできなかった
だな、編集ミスだ いや、だから代入と関数原型は関係ねえってば
代入が関数なのはC++だぞ 代入と関数呼び出しで型検査が必要になった
関係大あり 代入には型検査がもともとあった
double a = 1.5;
int b;
b = a;
b には (int)a の値が正しく代入され
決して a の bit63-32 が切り裂きコピーされることはない >>273
ポインタの型の検査の話だが
お前の短期記憶には障害が発生してるぞ -Wshift-op-parentheses
これを守ろうとすると括弧だらけでコードが糞になるから切ることにするよ >>276
ifの条件節に代入を直接書けないのもうざいな >>274
char *a = "QZ";
int *b;
b = a;
で、これの何が関数呼び出しと関係があるんだ?
俺のページフォールトはいいから
おまえのラッチアップを何とかしようや >>278
ポインタの型検査の話だってなんども言ってんだろ
ポインタの型検査は代入と関数呼び出しで行われる
わかったかバーカ >>279
わかんねえよデフェクト野郎
代入での型の検査の話だが
お前の制御記憶にはショートモードの故障が発生してるぞ >>281
アホウはおまえ
>>240から始まって247-250と流れてるのが
おまえにはANSI-Cの話に見えるのか
どうでもいいがCの規格文書名はISO/IEC9899だろうが
未だにX3.159-1989を拠り所としている化石かおまえ? アホウ ポインタの型検査が規格になったのはANSI-Cだ
> K&R C では char* でよかった用途に、
> なぜ、わざわざ void* を持ち込んだのか考えてみれ
> サイズが 1 なのが気持ち悪くて、
> サイズが不明ということにするためだろうが
このバカ(お前?)が決定的に間違ってる
void*が必要になったのはポインタ型検査に伴い発生する不都合を解消するためだ
それがあらゆる型へのポインタと互角なポインタであり、その役割をvoid *に割り当てた >>283
> ふじこふじこ
>>250もっぺん読め
別に不都合なんか起きてなかったぜ
どうでもいいが、あらゆる型へのポインタと互角に戦えるポインタがあったとして
それ以外のポインタってつおい? compatibility を日本語では互換性だ
ボビーオロゴンみたいな日本語を素でやるな池沼 >>284
本当に頭悪いなお前
K&Rではポインタの型検査を行ってなかったので、char *(に限らず全てのポインタ)が互換だっただけだ ここの文脈では相互に変換できるポインタを「互換」と呼んだ
A pointer to void may be converted to or from a pointer to any incomplete or object type. >>285
で、どんな「不都合」が生じたというんだ?
空想論を一切含まない具体的な例示をしてみろ K&R1 なんて今となってはどうでもいい‥
>>287
やだよ K&R1はCの元々のコンセプトを純粋に美しく語っているもので
これに嫌悪感を持ったり無関心な者はCの本質を知らないのではなく解りたくない者で
去る者は拒まずの消極的破門でいい >>288
バーカ void *のように他のポインタと互換なポインタが無けりゃ
memcpyとか一々キャストしなきゃならないだろ
本当に頭が悪い >>292
戯れ言も、せめて事実に基づいてぬかせシャブ中野郎
キャストなんかいらねえのに
おまえが何か思い込んでるのは
コンパイラに警告されたからだろうが
警告って何かわかってねえのまる出しだな ANSI-CはK&Rで書かれたソースがそのままコンパイルできるように作られたので、エラーではなく警告にしたのは当たり前だ
バカすぎるぞ お前 >>285
>K&Rではポインタの型検査を行ってなかったので、char *(に限らず全てのポインタ)が互換だっただけだ
が事実だったら
>>292
>memcpyとか一々キャストしなきゃならないだろ >>285
>K&Rではポインタの型検査を行ってなかったので、char *(に限らず全てのポインタ)が互換だっただけだ
が事実だったら
>>292
>memcpyとか一々キャストしなきゃならないだろ
ではないのではないだろうか? >>294
ほらな、警告とは何かがわかってない
X3.159-1989ではエラーも警告も定義していない
それらは特定のコンパイラ製品の挙動だ
特定のコンパイラにdisられたら
自分が悪いんだろうとしか思えない
ど初心者の心理からいつまで経っても
卒業できないポンコツPG乙 K&Rにはvoidがなく返却値の型を省略すればintと見なされた
returnがないか空のreturn;は不定を返した
これだけ言えばわかるな? C言語はUNIXの仕様が前提だから、そこまで含めて移植しなかったから混乱した。 >>307
いや、freeが何返してたのか解らんけど。それをcastする理由も。
まぁ、一生使うことのない知識だからどうでも良いけどね。 >>307
でvoidもないのに何にキャストしてたって? w >>307
たびたび見受けられるけれど、『返却値』を使うのはやめて欲しい
関数に与えた値をそのまま返すとは限らないんだから
普通に返り血、戻り値じゃあかんの? 返却値と返り値で、何が違うの?
確かに返却値って言葉はあまり使わない気がするけど、そんなこだわるほどのもん? >>314
返却って人から借りた物をそのまま返すという印象が強い
個人の見解と言ってしまえばそれまでだけれども >>316
その君の言うところの意味が、「返す」と何が違うの?って話。
「返す」を大辞林で引いたら一番目の意味に「返却」と書いてある事実をどう考える?
所詮その程度の主観的な印象に過ぎない物を、人に押し付けられても…
まあ、2chだし、言うのも勝手か。 >>317
返すの意味の一つに返却があるというだけでイコールでは無いと思うけどね。
例えば”上げる”とか辞書引いたら色んな意味が載ってて一番目に載ってる意味と関連するわけではないということは解るよね。 >>317
返すって言うところを返却に置き換えることが出来るのは限定されるでしょうに
あなたは釣り銭を返却するって言うつもり?
受けた恩を返却するの? >>313
それは日本鉱業標準審査会に言え
俺に言うな、わかった? $$$4.3$$$
"V"="1.3335412","0","1","3Q", 釣り銭がでてくる所は返却口って呼称してることが多いが まぁ まさかと思って調べてみれば JIS X3010 では本当に返却値になっているんだな ここまで「却」という漢字の調べた者なしw
「却」の意味は答えると「返却値」はおかしいが、英語でReturnと言ってるので返却と翻訳したのだろう。 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ビットでは動作しています。) >>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ではたまたま動いてるだけ。 >>330
Windows SDKの話をここでするなというやつがいるから、Windows SDKスレを探したらないんだなw おいQZ下手に知識をひけらかそうとするなよ
無知がバレるぞ マイケルソフトは標準化を破壊し、混乱をもたらす者。 パソコンの中に主権があるとしたら、我々の主権はマイケルソフトに蹂躙され続けている。 ここの過半数が訳語「返却値」を知らないわけか
マジでアホの集まりだな returnは、他動詞だから、返す値だろ。返された値
シェーン、カムバック! >>332
ありがとうございました。
「たまたま動いているだけ」が妙に納得しました。 このスレきも!って思ったらQZが自演しまくてるのか >>343
知らないおまえは最悪に格好悪い
これだけは間違いない >>348
だれも「知らない」なんて言ってないんだが...
思い込みでバグ作り込むタイプやね w 異なる翻訳単位に存在するtypedefで定義された型を参照するには
どうやればできますか? typedef した部分を分離独立して、必要に応じて #include とかは普通にアリだけど。
この場合、#include した時点で同じ翻訳単位になってしまいそうだし。
A.できません(たぶん 参照する必要が出た時点で共有しなきゃならんでしょ
適当なヘッダで宣言して必要に応じてincludeだな
逆に、その型を公開できない理由があるの? プリプロセス終了後の1ソースの範囲が翻訳単位だし
ソース中の #include によって展開されたものは同じ単位内だべさ >>349
いや、おまえは知らない
そうでなければ343のような発言には至りえない 知ってても、このやりとりで知っただけのくせに
それ以上に訳知り顔すんじゃねえぞ >>356 > いや、おまえは知らない
って大見得切ったのに
>>357 > 知ってても
っていきなりトーンダウンするチキン乙 w 知ってたからといって、どうというものでもないものをよくここまで引っ張れるよね。 効いてる効いてるw
俺、別に言ってること変えてねえぜ
まあ、そういうことにしなきゃ立場ねえのはわかるが 自分だけが知ってるスッゴい知識
をバカにされた老害発狂 w 同じファイルをインクルードしたところで
.cが違えば翻訳単位も違うだろ 異なる翻訳単位に存在するtypedefで定義された型を参照するには
自分の翻訳単位に同じ定義を持ち込むしかない 関数側から見て返す値がリターン(Return)値
関数を呼び出した側が受け取る値をリザルト(Result)値
私はこの二つでしか理解しておりませぬ はあ?
無知をバカにされて発狂してんのはおまえだろw >>365
Pascal だと関数側が result だけどね。
Cしか知らないなら仕方ないけど。 「自分だけが知ってる」すっごい知識だっておバンバン
自分の国の公文書に書いてあることなんだが
あ、自分の国じゃなかったか
なるほどそのようで >>368
公文書に書いてあるんだ。それって何の公文書? >>369
JIS X3010:2003のことだろ
C99のISO規格(ISO/IEC 9899:1999)を翻訳して日本工業規格(JIS)に標準化したもの >>370
JIS規格票は公文書だったのか。それは知らなかった。 複写に費用や手数料取られるのは当たり前だろ。
図書館で借りれば無料なんだし。 公文書の無料と言うのは、国民全員の負担になるということなので、実はあまり良くない。
ほとんどの人が損をするという意味で、携帯の新規機種変無料とかと似たような問題。 0円携帯禁止したせいでケータイメーカ全滅したけどな。
エコポイントのせいかも知れんが。 >>377
ツートップなんてやったもんだから、
対象外のメーカー製造取りやめたしな >>377
それは0円なんて言う訳のわからんガラパゴス作戦に乗っからんと売れないようなゴミを作ってたからでしょ。 QZって無知を指摘されるとすぐ自演でかき消すよな
お前もう気持ち悪いだけだから消えろよム板から おいQZゴミ煽りはもうやめろ
おまえはさっさとウンコードマニア殿堂入り級のゴミコードを貼ってろよ 過去にすがるだけのゴミ無職がご高説垂れるなよ無職が >>367
resultはボーランドが始めた方言だろ お前ら書いたプログラムをaddressSantizerやThreadSantizer、valgrindとかでチェックしながらテスト実行してる? Cで書かれたプログラムがどのように機械語に翻訳され実行されるのかについて書いてある資料ってありませんか?
C言語の書き方的なWebサイトや本は腐るほどありますがCのコースコードがコンパイルされリンクされ実行可能なバイナリが出来上がり
そのバイナリ(必要なら関連する動的リンクライブラリも)がメモリにロードされ実行される過程をある程度詳しく解説している物はまず見かけません
この過程で良く使用されるファイルフォーマットの情報も欲しいです
当然実行環境や開発環境によって差異はあると思いますが基本的なところは変わらないはずですよね?
今のところターゲットはWindowsのPEと組み込み向けのバイナリファイル(メモリイメージ)で、開発環境はひとまずVC++とGNU系を考えています
最近C/C++を本格的に使わざるを得なくなり調べているのですがこのへんの情報が得られずに悩んでいます
スレ違いだったらすみません コンパイラの実装がどうなってるかを知りたいのか、
それとも機械語がどう実行されているのかを知りたいのか
後者ならアセンブリ言語を勉強すればいい気がする
参考書も探せばありそう >>388
本読むのが一番
おすすめは、コンピュータの構成と設計、パターソン他著 GNUだとx64もあるのかな?
まだやったことないや >>388
> 最近C/C++を本格的に使わざるを得なくなり調べているのですがこのへんの情報が得られずに悩んでいます
使うだけならそんな情報は要らんだろ
ネタでないならもっとピンポイントで聞かないと本読めと言うような回答しか返しようがない LLVM 言語マニュアル(Language Reference Manual) 日本語訳
http://www.h3.dion.ne.jp/~mu-ra/llvm/LangRefJ.html >>388
デバッガーの使い方かアセンブリ言語を調べたらいいんじゃない?
「C言語をアセンブリ言語に翻訳してどうやってコンピュータを動かすか見てみよう」
っていう企画はネットや紙面でたまに見かける
gccならオプションでアセンブリ言語を出力できたはず >>388
「ハロー"Hello, World"」っていう本が面白い
linuxでの話だがシステムコール呼び出しやmain関数の前に行われる処理、共有ライブラリの仕組み、elfフォーマットなどCプログラミングの裏にあるものについて詳しく書かれてる
まあ他の人も言ってるように普通にプログラミングするのにそんな情報は当分いらないけどな レスありがとうございます
C/C++コンパイラに与える物に関する情報は沢山あるのですが、その先で何をやっているかについて解説されている資料は一気に減る気がします
リンカについて解説されている資料もあまり見ませんし、ほとんどはリンカはコンパイラが勝手に呼び出す物とされているように思います
今のところやりたいのはAPIフックやラッパーDLLなどを利用した既成アプリケーションへの介入と、組み込み系のアセンブラとCを混合した開発です
後者の場合は純正の開発ツールを使う場合に限りそれなりの資料がありますがgccなどで開発する場合の情報は多くない上に錯綜していたりします
>>389
昔組み込み系のソフトウェアをアセンブラで書いたことがあるのでアセンブラは多少読めますがCとの繋がりが見えてきません
アセンブラは違っていなければ何でもOKな所があるというか、特に生で動かす場合はレジスタの使い方からコードの配置やジャンプの方法まで
好きに決められますけど、Cだとその辺は全てブラックボックスですよね
>>391,396
アセンブルリストを出せるのは知っていますが出てきたコードはそのまま実行出来る物ではないですよね?たとえば別のソースコードの関数を
呼ぶようなケースでは呼び出し元が呼び出し先のアドレスを把握できていないと動かないはずです
>>397
おぉ、探していた物一つはまさにそんな感じの情報です。Windows向けのがあれば理想的でしたがその本を探してみます 知りたいことは言語じゃなくてOSの仕様なのに
言語の延長だと思い込んでるから情報にたどり着けないんだろう ハロー“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/ >>399
> ほとんどはリンカはコンパイラが勝手に呼び出す物とされているように思います
コンパイラとコンパイラドライバの区別もついてないのに背伸びしすぎ w
そもそもgccでもアセンブラを混在させたきゃインラインアセンブラで充分だしドキュメントも揃ってる >>403
言ってることが嘘くさいよな。コンパイル、リンクの流れを知らないのは。 ヒカル 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年はやらないとここまではいかないだろうけど才能とアイデアと
企画力と継続力があればが大儲けできる可能性がなくもない
まだまだ他の職種に比べれば競争率は低いからオススメ
顔出したくないならラファエルみたいに仮面つければいい ヒカル 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年はやらないとここまではいかないだろうけど才能とアイデアと
企画力と継続力があればが大儲けできる可能性がなくもない
まだまだ他の職種に比べれば競争率は低いからオススメ
顔出したくないならラファエルみたいに仮面つければいい
ハロウィン用でいろいろな仮装マスク売ってるからオヌヌメ 一番使用経験があるのがインタプリタで、次がアセンブラです。この二つは一から実用になる物を作ったことがありますが
コンパイラは既存のコードを改造するのがせいぜいで何かを一から作ったことがありません
C/C++はVC++にプロジェクトを読み込んでビルドしたり、configure→makeやgccのコマンドを叩くくらいしかできないです
>>400,402,404
全部買える余裕はないのでまずは本屋で眺めてみます
>>403
組み込み系だとアセンブラからCで書かれたコードを呼び出す例も普通にあるようです
リセットベクタから最初に実行されるコードはアセンブラで書くのが一般的みたいですし
>>401
あ、なるほど。実行する部分はOSの仕事ですね >一から実用になる物を作ったことがあり
を指してるのは
(自作した)インタプリタと (自作した)アセンブラ じゃなく
既存のインタプリタと既存のアセンブラによって得られた生成物
だよな? 情報処理資格の組み込み・エンベッドのテキストに書いてある
宇宙産業・医療機器・産業機械などは、組み込みの高資格を持っていないと無理。
この領域では、すぐに人が死ぬから、MISRA-C に準拠していないと、使えない。
国際的に、MISRA-C 無しのCは、製品には使えない
各人が、個別のアセンブラで学ぶことは、
各人が個別の言語で話すことと同じになり、分断される
だから日本の情報処理資格では、CASL2 という抽象的なアセンブラで、議論する。
それをまねたのが、LLVM。
だから外国が、LLVMに飛びついた
>>395
を参照 >>408
大概の言語ならコンパイラもあるんじゃないの?py2cとかperl2cなんかもあるし。 鶴亀算のプログラムが違うと言われたのですが、どこが違うか教えてください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;
}
そもそも鶴亀算の計算方法がネットで調べてもよく分かりませんでした それだとd使ってないから正しいはずないよね
もはやC言語関係ないが
//亀の数
x=x/(d-c);
てか連立一次方程式解けないってガチな小学生? https://ideone.com/iVXO9e
上のコードのどこが間違っているのか分かりません
動くようにするにはどのようにしたらよろしいですか? おいQZゴミコード投下をこのスレでもやるのかよ
また臭くなったなこのスレ >>419
マクロの使い方じゃなくて定義の方を改変してほしいです >>424
ありがとうございます
それを求めてました まだ一冊も買っていませんが>>397,402両氏に感謝
坂井氏の記事は判りやすくて良いですね。別件でググっていたらITmedia系列で連載しているのを発見しまして
今読んでいるところですけど大変為になります
ttp://www.itmedia.co.jp/author/174171/ >>432
バーチャルホストへの対応は http 1.1からなので、リクエストヘッダーを作成し
その中にどのホストへの要求かをサーバーに伝える必要があります。
このページを参考にしてみて。
http://tomosoft.jp/design/?p=3636
サンプルソースはローカルネットワークでやっているので、
変数 httphost にはIPアドレスが指定していますが、
ここに求めるホスト名を指定すれば良いはずです。 ありがとうございます
ちょっと出てしまったので家に戻ったら
もらった情報を元に解決頑張ってみます ありがとうございますwww
QZの自演感謝芸は本当にわかりやすい 誰が誰を煽ってるのかは分かりませんが
リクエストヘッダの記述をHTTP1.1にして
1.1の必須ヘッダのHostを設定して試してみたら
無事動作しました
ありがとうございました C99の識別子について質問です。
構造体のメンバ命を「アンダーバー + 小文字アルファベット」で始まるものにするのは
仕様上、予約語と名前衝突しないことになっていますか?
「アンダーバー + 大文字アルファベット」で始まる識別子は予約されてるという記事がいくつかありましたが、小文字の場合に言及している情報は見つけられませんでした。 >グローバル スコープを持ち、_ で始まる名前
>_ で始まり、その次が大文字の名前
>__ で始まる名前
この3つだけなんで、アンダースコア+小文字かつメンバ名なら大丈夫
まぁ個人的には2連アンダースコアと先頭アンダースコアは避けるけど >>441
素早い回答有難うございます。
安心しました。
でも、ご指摘の通り使用は最小限にとどめたいと思います。
ありがとうございました でも、ご指摘の通り使用は最小限にとどめたいと思います。www
QZ落第のときのセリフがこれ おいQZ自演オナニーに飽き足らず
他スレで無知披露かよ
お前のような永久無職が議論できるような場所じゃないから %%%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 よくいろいろなホームページにinlineは付けなくてもコンパイラーが最適化で自動で決めるので
付けなくていいと見かけるけれど、重要なのはinlineを書くかどうかじゃなくて
定義をヘッダーファイルにかいてinlineに出来るかソースファイルに書いて
出来ないようにするのかってことでしょ。
inlineが出来るようにするのか出来ないようにするのかの話を
inlineを書くか書かないかの話にすり替えている汚いやり方だと思いませんか? >>452
翻訳単位という括りで見たらヘッダーファイルとかの区別は無意味だから
あなたの意見には同意しかねる register 変数だって、本当にレジスタに割り当ててるか怪しいもんだ。 第一級関数
https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E9%96%A2%E6%95%B0
>CやC++、Pascalなどのプログラミング言語は関数ポインタをサポートしており、データ構造に含めたり他の関数に引数として渡したりすることができる。
>しかし、それらの関数は一般にリフレクションなしではプログラムの実行時に動的に生成することができないため、第一級関数をサポートしているとは見なされていない。 registerとか、メジャーなコンパイラで同じオプティマイザーを使用するC++では無くなっちゃったしな。 http://i.imgur.com/b3A3YWl.jpg
この(お)がよく分からん
最初の段階でi=j=0だからswapさせても意味なくね?
だったら(お)でiとjずらすのか?
とも思ったが反応なし
教えてくれると嬉しい 出力変換指定子について教えてください
printf("16進のffを10進に変換すると%dです\n", 0xff);
実行結果→16進のffを10進に変換すると15です
%dなどの出力変換指定子というのは、数値を文字列に変換して出力している、という理解でよろしいのでしょうか?
それとも数値を数値のまま、文字列の間に挟み込んで出力してくれている、という理解の方が合っていますでしょうか? http://linuxjm.osdn.jp/html/LDP_man-pages/man3/printf.3.html
%dは文字列に変換する
15じゃなく255になるかと
数値のままってのがよくわからんけど
printf( "%c", 0x41);
ならほとんどの処理系で大文字Aが表示される
%cでcharのビット数より上位のビットが
立っていた場合の挙動は知らん >>464
前者。文字列にしないと文字として表示できない。
ちなみに15じゃないけどな >>468
補足すると、0xffは引数にした場合 0xffffffff に拡張される
(32bit機の場合) >>469
255 じゃなくて、4294967295 になるってこと?
変なの。 >>470
符合が付いているから255じゃない。で466のレスに繋がる(^_^)ノ 符号付で -1 とみなし、そこから符号を維持したまま拡張して引数に詰む
引数を引っ張り出して 符号付評価で値を文字化の結果 "-1 "
(char 型変数に 0xff を入れてて、それを printf に渡したケース)
ところでリテラルの 0xff が符号付か否かは何か規定あったっけ? >>471
どこに符号が付いてるの?
(符合と符号は違うの?)
255 にしかならないけど。
>>472
char が符号付きかどうかは処理系依存なはず。 >>473
リテラル文字列中の文字が signed か unsigned か とは別だっけか?
あんまり出くわさないのでルーズになってるわ・・・ int a = 255;
の時に、aが-1になったら不便でしょ? int a = (signed char)255;
の場合は-1になる >>464
本当に試したのか?
https://ideone.com/yMxt39
>>469
本当かね?int なんだけれども
>>472
リテラルは int なんじゃないかな?で int は別に符号拡張しない
>>479
>>469 は誤り リテラルが無条件でintなわけじゃない
intで表現出来る範囲はint
intを越えた場合には基本的には表現出来る最小の型になる
u, l, ul, ll, ullなどのサフィックスで明示的に変更も可能
サフィックスで作れない型はキャストして作る 数値リテラルはこの辺参照
www.bohyoh.com/CandCPP/FAQ/FAQ00074.html
あと、-100とかは数値リテラル100と単項-となることに注意 >>465>>466>>467>>468>>480をはじめとした皆様
ご解答していただきありがとうございました(_ _)
お礼遅くなりすみませんでした >>481
ulって書く人とluって書く人がいますがどちらが正しいのですか? switch(c)
case no:
これで、ケースnoに入った際に、もう一度switch文を繰り返す方法はありませんか?
goto文使わないと無理ですかね? >>489
do {
switch(c) {
case no: continue;
...
} while (0); >>490
ありがとうございます
case yes:
ほにゃらら
case no:
break;
yesの場合もbreakしたいのですが、noに流れさせてbreakするのと、yeaにbreakも書くのとどちらがいいんですかね? お好きなように
caseはbreakする事がほとんどなので、コードを読むときにbreakがあると勘違いしないように、ほにゃららの後とcase no:の後の両方にコメントを忘れずに 変換仕様とデータ型との関係について質問させてください
例
int a;
scanf("%c", &a);
printf("%c\n", a );
考え方として、intと%cのどちらが優先されるでしょうか? >>493
> scanf("%c", &a);
これは入力された文字の文字コードをaに入れる。
> printf("%c\n", a );
これは、aが表す文字コードの文字を出力する。 >>493
scanfの方は、&a を charへのポインタとして処理をする
結果は環境依存
printfも基本的には書式と引数が合っている必要があるが、intより小さい引数は全ていったんintに変換されてからコールされるので、この場合は問題なし >>494
>>495
すごい勉強になります
詳しい興味深く書いていただきありがとうございます >>497
私は自演とかはしてないです
スレの先輩方への感謝とともに申し添えます QZ怒りの自画自賛ww
本当はマ気取りの無職無能のおっさん
誰にも相手されないから自演で賞賛してる 自作関数でファイルオープンする際に、ファイルが存在しなかったらその関数を強制終了したいのですが、どうすればいいんですか?
exit(0)を使うとプログラムごと強制終了されてしまいますよね? 自作関数の戻りの型を void にしてるならしかるべき場所で
return ;
て書くだけ >>507
それでいいんですか?
void型の関数なんですが、エラーが発生した事を明示しなくていいんですかね? printf("エラーが発生したんだぜ、この野郎。やんのか?\n"); 紙のメモ用紙に書き込むサブルーチン作って、そいつにやらせたらどうだろう >>508
それでいいです
それで目的は達成出来ます >>508
目的が変わっている
自作関数でファイルオープンする際に、ファイルが存在しなかったらその関数を強制終了したい
↓↓↓↓↓↓↓↓↓↓
自作関数でファイルオープンする際に、ファイルが存在しなかったらその旨を通達して抜けたい
戻りの型を int にして 成功は 0 失敗はそれ以外のエラーコードにして戻る
ポインタでエラーコードを指す引数受けて、その指し先に値を渡す
(errorno 等のグローバル変数でエラーを伝える)
呼び出し元のほうでエラーの有無で分岐 ちょっと直接C言語に関係ない話なのですが、
コマンドプロンプトから、標準入力からデータを受け取る必要のある
Cのプログラムを実行する際、「<」を使ってファイルから入力しています。
あるデータファイルのショートカットファイルから「<」を使って
データファイルのデータを入力するにはどうしたらいいでしょうか? >>514
> ちょっと直接C言語に関係ない話なのですが、
ならよそに行けよ >>514
どこに誘導すればいいかわからんなw
filter(仮).exe < %1
ってバッチファイルじゃダメなのか? ショートカットファイルということは windows の話かねぇ?
渡ってきてる .lnk ファイルの中身から本当のパス文字列を知って
さらにその指し先のファイルを標準入力に流す なんてことが
コンマンドラインシェルはやらんだろうな ショートカットファイルをリダイレクトしても
単に中身を標準入力として読み取るだけで、
解釈するわけじゃない 初心者です
構造体の使い回しができないというのは、どういう意味ですか?
structがない場合です >>521
構造体の使い回しとは何のこと?
文脈がわからないと答えられない struct のない構造体は難しいな。
自分で実装するのかな? すいません初学者ですが質問です
#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)の*の意味が解らなくなります。
ちょっと、頭が混乱してて訳の解らない文章になってるかもしれませんが上記プログラムで何故スムーズに行くのかがいまいちよく解りません >>525
関数ポインタの普通の使い方やん。
それよりゼロで割った場合にゼロ帰すのは変だと思う。 もうちょっと言うと8行目の*がポインタ宣言として何でfuncにaddとかmulとか代入すると関数を参照できるのかよく解りません
*が無いとコンパイラからエラーを指摘されるんですが*がなくても関数のプロトタイプ宣言と同じ形になるのに関数が呼び出されないのが納得いきません >>526
うーん、なんていうか普通だとしてもなんか納得できないって言うか理屈の順序がわからないというか double (*func)(double,doube);
[double を 2つ受けて double を返す関数] の場所を覚えるための変数 が func
プロトタイプ宣言ではなく 長ったらしいけど変数宣言 int *func; と本質的に同じ >>529
でもint *fancの場合だとfanc=&a見たいに&をつけてアドレスを入れるんじゃないですか?
この場合&が省略されてもいいのは何でですか?
代入もaddとかsubと短くなってますけど
いつadd=double add(double i,double j){return i+j;}になったんでしょうか?
理解力や理解度が低いのもあると思いますがいまいちよく解りません・・・ >>530
前半の疑問
関数へのポインタ変数 func に 関数を代入する際の記述に限り & を省略できる
という文法にしちゃった そしてそう記述するのが古くからの慣わし
関数宣言 double add(double i, double j);
関数の実装 double add(double i, double j) { return i+j; }
宣言した関数の呼び出し add(i,j);
宣言した関数のポインタを得る add (もしくは &add でも同じ) >>531
> 関数へのポインタ変数 func に 関数を代入する際の記述に限り & を省略できる
> 宣言した関数のポインタを得る add (もしくは &add でも同じ)
凄く頭がすっきりしました。コンパイルで実行してみてもaddと%addどちらでも通りました。
printfの(*fanc)も&addの実態を参照してるわけですね。
ありがとうございました >>530
8行目 double (*func)(double x,double y); は変数funcの宣言
型は double(*)(double,double) の関数ポインタ
変数funcに各関数のアドレスを代入して呼び出してる
代入される関数には&を付けても付けなくても動作は同じ >>533
ありがとうございます!ここ数日悩んでたんですがすっきりしました。 >>534
呼び出すときのデリファレンスはいらないよ
これでいい
printf("add:%f¥n", func(a,b)); >>535
それは
1。ポインタ側から見たら*fancになってfancの実体をみている
2.fanc=addと代入されているんだからfancと書かれていてもaddという変数(代入済み)に読み替えて実体を見ている
という意味で同じだという捉え方で大丈夫でしょうか? 関数へのポインタを得るのに & を省略できるのと同じように
ポインタの指し先の関数を呼び出すのに
(*func)(引数) と書いても func(引数) と書いても同じ という文法にしちゃった
※
Cは短く書けるならそっちを使う って歴史なので func(引数) って書くことが多い >>537
ほへー
勉強になります
ありがとうございます
そういうところがみんながポインタが難しいというゆえんなのかもですね >>531
> 関数へのポインタ変数 func に 関数を代入する際の記述に限り & を省略できる
しれっと嘘書くなよ
代入関係なく関数名だけ(後ろにカッコをつけない)なら関数へのポインタとして扱う
比較とかでも使える >>539
俺も最初にそう思った。j != 0.0 て 浮動小数点の四則演算で例外が起きないようにするには、どこを注意したらいいんだろう 普通の設定なら0で割っても例外は起きないよ。Infになるだけ。
Infも計算できる。Inf/InfとかはNaNになったりするけど。 柴田さんの本でアルゴリズム勉強したいんだけど、c言語とjavaどっちがいいんですか?
目的は基本情報技術者試験午後対策と競技プログラミング用です
どっちも読むのがいいのでしょうか? アルゴリズムならC言語かなぁ
理由は、再帰があるから ?
再帰なんてほとんどの言語でできるだろ
できない言語探すほうが難しいのでは >>552
Javaは難しいものを作り込む言語ではないからね。 >>554
もちろん。
だから、普通ってかいた。
ところでデフォルトで例外になる環境教えて。 Infの演算決めたヤツアホだよな
せっかくの異常値検出が糞仕様のせいで出来ない
InfなんてほとんどNaN扱いでいいんだよ
1/(1-1) > 0 > 1/-(1-1)
とか決めたヤツ、頭おかしい 0 > -1/(1-1) ではなく 0 > 1/-(1-1) で? %%%5,7$$$
}
000-[[[%ER,D,A%%~ ん?整数?じゃないよね。
そりゃ、ieee754には正のゼロと負のゼロがあるからな。 >>548
十数年挫折してやっと分かってきたおいらに言わせれば、アルゴリズムは何でも良いから関数型言語で勉強した方がいい。
アルゴリズムの殆どがリストを基本にしてるけど、CもJavaも配列が基本だから挫折しやすい。
一旦リストが基本の言語でアルゴリズム勉強して、それを配列で実現するには?って考えた方がいい。 >>563
基本情報技術者試験を受かりたいので、関数型言語では無くcかJavaで覚えたいんです
仕事で他の言語覚えなきゃいけないので、関数型言語を覚える時間が無いです
すみません >>7
エクセルのだとエクセル立ち上げないとだからな。。。
WSHのVBSでエクセル操作するのを呼び出すとかならSystem関数で一発だろ。 >>18
改行するならputsだが、改行したくないならprintfしかあるまい。
ある意味立派なフォーマットだ。 >>564
うん。
文法は覚えられるけど、コードがどう言うことしてるのか理解出来ないと思うんだよね。。。
その為の関数型言語なんだが。。。
まあ、CやJavaでコード読めないってなったら関数型言語においで。
そしたら読めるようになるから。 スッキリわかる Java入門 第2版、2014
Cは、ポインタがあるので、ややこしい。
この本を3回読んで、オブジェクト指向をみっちりと学ぶ >>566
fputs("hoge",stdout) >>564
システム深く入り込んで、いろいろ弄りたいならC言語の方がいいと思うが
アルゴリズムを学ぶことが主要な目的なら、Javaの方がいいように思う >>570
そのアルゴリズムがどんな高度なものかによるから答えにくいんだろうが。
基本情報技術者試験用の言語というあたりでたいしたことをしないのはわかるが。
まだどの言語もまともに使えないレベルなんだろう。CとJavaならCをやってからJavaをやった方がコンピュータの理解にはいいけど。 >>570
今はC言語にしようかなって思ってます
>>571
C言語とJavaなら基本的なものは使えます
レベルとしては蟻本くらいです Cだとリスト必要な時リストそのものを作らないといけないけど、Javaだとリストクラスのインスタンス作ればいいだけだしね。 >>572
アルゴリズムというのがどこまで高度なものを言ってるのかわからないが、Cは適度なところで抑えないと時間切れで他のことができなくなるぞ。 ソートとか検索とか簡単な計算とか
超基本的なやつでしょ?
言語なんて何でもいいよ >>574
蟻本レベルを目指してます
>>575
一つの目標としては、そうです
あともう一つは、競技プログラミングにも参加したいです 基本情報技術者はC出行こうと思うんですけど、競技プログラミングもC言語でいいのでしょうか? >>570
ZDDとか展開出来る?
クヌース本とかJAVAで実装し直すの? アルゴリズムを勉強することが目的なら、言語は何でもいいに一票。
使い慣れたやつじゃないと、言語自体の使い方とかに気を取られて、アルゴリズムの勉強がはかどらない。
ただ、C言語はいろいろと手順が多い傾向があるので、「言語初心者」には適さないと思う。 昔はpascalだったが
oberonとかどうなってるんだろ アルゴリズムは、Ruby で説明する。
型の記述が無いから、Rubyが圧倒的に楽
競技プログラミングでは、Java, C++
基本情報技術者は、Java でいい。
C にはポインタがある分、時間を食うから損 >>581
競技プログラミングは仕様をみたすプログラム作りだから言語は関係ない。
Cについてはキミがポインタを理解してないだけじゃないか。
基本情報技術者試験ではなぜかC言語が一番難しい問題になっているのは謎だが。 >>582
C言語が一番難しいってどういう基準なのでしょうか >>586
そうかCもまだよくわからないレベルだったな。 >>588
Cは分かるんですけど、CとJavaの難しさの比較が出来ません 基本情報技術者試験の過去問見たけど、
COBOL でもいいんじゃね? 問題文に仕様書が付いてくるから暗記がいらない。あまり重箱の隅をつつくような問題が出ない。 >>593
言語の難易度と問題の難しさでバランス取ってたりして。。。 アセンブラが簡単というのは同意。アーキテクチャにもよるけど単純で罠も少ない 基本情報技術者試験のことだとすると「アーキテクスチャにもよるけど」っておかしくね?
>>599は一般にアセンブラが他の言語より簡単だと言ってるようにみえるんだが >>602
CASLUではないとしてもあの程度のコンピュータのアセンブラなら言語としては単純。 並列動作とか遅延ジャンプとか出てこないし
レジスタの塊みたいな奴に比べりゃ可愛いよな Visual Studio community 2017をC言語のコンパイラとして使えないんでしょうか? >>602
当然、COMP-XかCOMETかという話だろう。 >>605
C言語にしたいなら、拡張子を.cにしろよ。 >>607
コンパイラとしてどうやって使っていいのかわかりません。
コードを書いてもどうやって実行すればいいのか解りません・・・
今は勉強用にEasyIDECって言うのを使ってますがこれはプログラムの実行はできるんですが
ファイルを読み込むタイプのプログラムを実行できないしexeファイルも作れません。
勉強しながら早いうちからexeファイルとか作れる環境で慣れたいんですがやりかたがわからなくて・・・
よければ教えてください >>608
IDE使う前にMSYS2+MinGWのコマンドラインでhello would書いて特訓しろ。 またQZが自演してるな
たのむからゴミコードは出すなよ >>564
試験対策ならJavaだろうなぁ
俺はJavaで合格した。
派遣のプログラマーで仕事もらうには、合格必要だぜ。
今は、派遣はヤメたけど、派遣の経験は良い勉強になったわぁ。 >>609
トグル・スイッチをパチパチやってプログラミングするところからやる?
パチパチやってBoot Loaderを打ち込むのからやると、全てが判るよ。 十進カウンタや、JKフリップ・フロップをNANDを組み合わせて作る事は今でもやるんだろ?大学で。
学生実験とか?最近の大学では無いの? >>615
それ、なんちゅう授業?授業のタイトルは? exeの作り方は結局わかりませんでしたが
textファイルを読み込んで結果を吐き出すプログラムはvisual stadioで何とか実行できました
スレ汚しすみませんでした プロジェクトの下の debug か release の下に出来てるだろ。 >>621
よく見たらdebugフォルダの中にアプリケーションって言うのがありました
これがexeファイルなんですね(*´ェ`*) char *hoge にファイル名が入っていて、
printf("%s",hoge);とするとファイル名が表示されます
このファイル名を
http://dqn.sakusakutto.jp/2013/04/c_kr_stack.html
のpush()に引数として入れたいのですが、型が合いません
どなたか教えて下さい >>608
EasyIDEC ってこれのことだよな?
http://9cguide.appspot.com/p_9cide.html
だったらこれはコンパイラがtccだからちゃんとexe作った上で実行している筈だしファイルの読み書きも全く問題なくできる筈だぞ。 >>608
コマンドラインからコンパイルしたいならVCは何かバッチ実行したらclでコンパイル出来たはず。
面倒だったらbccに乗り換えて見ては。
setbccってツールも併せて検索して使えばパス通しまでしてくれる。 >>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を使っていますがエラーを山のように吐いてくれて勉強になるしテキストファイルを読み込んだり吐き出したりする
プログラムも作れたりととりあえず初心者として目指すレベルには十分やりたい事ができるのでこれでいいかなと思っています。
レスありがとうございました。 >>632
setbcc新しい方に対応してないんか。
フォルダ名書き換えるだけやから対応すりゃ良いのにね。
gccとかは-oファイル名ってしないとa.exeになっちゃうけど、確かインストール時にパス通してくれるはず。
(最悪、binだけ自分でパス通せば行けたはず。ライブラリのパスをコンパイラの設定ファイルに通すとか、そういう面倒はなかった) >>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でやったほうがいい。
ただ、環境整備をずぶの素人がやるのは辛い。
というか、周りに誰かいないのか?居るのなら拝み倒してやってもらえ。
そんなところで苦労しても何の足しにもならない。
とっとと実行環境を整備して、ガンガンコード書いて動かして試さないと意味が無い。
周りに誰も居ないのなら、マジでチュートリアルを頭から全部一つずつやっていけ。
そしたらいつか、ああもういいか、って思うときが来るから、
その時にチュートリアルを卒業し、自分のプロジェクトの開発を始めろ。 >>633
ああごめん、VC++もチュートリアルあったわ。
いつもどおりハロワだが。
https://msdn.microsoft.com/ja-jp/library/jj620919.aspx
C++だからstdafx.hになっているが、
VC++はそこらへんごちゃ混ぜに出来るので(この意味は今は分からなくていい)
#include "stdio.h" すれば printf とかも普通に使えるはず。
まあがんばれ。 >>636
ありがとうございます
チュートリアル読みました。
エラーが出るとはいえEasyIDECを使ってある程度流れがわかっていたのとvisualstudioを何時間か弄っていたので
チュートリアルは多分理解できたと思います
今はwin32コンソールアプリケーションの空のプロジェクトを作ってソースファイルのところに.cファイルやtextファイルを追加する感じで使っていて
それなりに自分の目的にあうようには使えてるとは思います・・・多分
だからコードをひたすら書いて、理解を深めようと思っているところです。
また解らないことがあったら質問させてください!! >>637
いや見りゃ分かるが君はこのスレで質問すべきレベルに達してない。
つっても他に聞く相手が居ないのならどうしようもないが、
質問されてもさすがに相手するのが嫌になるレベルだというのは自覚しろ。
だから質問したところで回答があるかどうかはまた別の話だ。
君は分かっていないだろうが、
レベルの低い奴(今回は君)に対して回答することはスレに悪影響を及ぼす。
単純には、そういうレベルの奴が集まる方向に圧力がかかり、結果的に上級者が逃げ出す。
俺はこのスレの常連ではないから、俺がこのスレに対して影響を及ぼすのは本意ではない。
だから今後は俺は君の質問は無視する。
それでも君が質問するのも自由だし、それに対して回答するのも他住民の自由だが、
見たとおり、適当にあしらわれて終わりになるはずだ。
それがスレのレベルを下げないための適切な行動だからだ。
ところが君はどうやら本気で学びたいようだ。
だからとりあえず回答したが、今後は俺は回答しない。自分で勝手に学べ。
今はそれが出来るだけのリソースがWeb上にある。
最新IDEとWebを使うのが一番無駄に引っかからなくていいからそうしろ。
IDE自体の質問なら、VSならスレがある。
というかバージョン毎に12スレもあるからそっちで聞け。
http://mevius.2ch.net/test/read.cgi/tech/1491618774/
> win32コンソールアプリケーション
多分、1-100まで足してみようとか、そういうのからやってるんだろ?
それならこれで合ってるから、まあがんばれ。
とりあえずブレークポイント/ステップ実行/ウオッチが使えれば何とかなるだろう。
後は適当に弄繰り回していれば分かるようになる。
IDEなんて基本的に使い方は同じだから、最初から高機能IDE(今回はVS)に慣れたほうがいい。 >>635
すげぇなぁ、Microsoft.
日本語チュートが充実じゃん。 stdafx.hをみて恐れをなしてVisual Basicを選択したのを思い出した。
その後、Obj-C -> Swiftに流れたが、今VC++さわれば楽しめるかもしれん。
ただし、Microsoft仕様のC++が今どうなってるのか?不安。
それと、Windows環境ってAPI Referenceを気軽に検索する方法があるのか?
俺がVC++触っていた時は、msdn developer’s networkっていう重いAPI Viewerがインストールされて、ちょっと検索するにもエライ待たされて閉口したんだが。 VC++って、C++11/14/17に準拠してるんだって。部分的に。
VC++も進化してるんだ。知らんかった。 その辺の準拠率はg++かclangだな。
c99対応コンパイラは皆無だっけ? CCmdTarget UIResponder
CWnd UIWindow
CView UIView
CEditView UITextView
CButton UIButton
CWinApp UIApplication
MFCとUIKitの対応関係はこんな感じか?
クラス階層図はかなり違うなぁ。継承を使ってカスタマイズしていく設計と、デリゲートを使ってカスタマイズしていく設計との違いから来るのかな? VC++がプロ仕様と言うのだったら、Xcodeも同じ様なもんだな。
String構造体が、
Conforms To
Comparable
CustomDebugStringConvertible
CustomPlaygroundQuickLookable
CustomReflectable
CustomStringConvertible
CVarArg
Equatable
ExpressibleByExtendedGraphemeClusterLiteral
ExpressibleByStringLiteral
ExpressibleByUnicodeScalarLiteral
Hashable
LosslessStringConvertible
TextOutputStream
TextOutputStreamable
こんだけのプロトコルに準拠しているって、仕様を見て、どれだけのヤツがピントくるかな?
おまけに山ほどイニシャライザがあって、初心者はびっくりするだろなぁ。
C++から来た奴は、構造体にイニシャライザ?って思うのかな! https://msdn.microsoft.com/ja-jp/library/system.string(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1 >>649
あのぉー。Visual Studioのリファレンスって、offlineでも引く事できますか?
例えば、4Gの携帯回線が細い場所でも、リファレンスを閲覧出来るのでしょうか?
リファレンスをローカルの開発機へインストールできますか? オフラインのヘルプビューアもあるけどコンテンツ内容が古い
オンラインでもそれほど重くはないので4G回線ならWebでも問題ないだろ ***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{ 以下のコードように、呼び出し先の関数で作った配列をポインタとしてmain関数に返すプログラムでwarningが出るので、調べてみたところ
・呼び出し先の変数は一時的に保管される領域に入っている
・一時的に保管される領域はmain関数に戻ると消える
・main関数にリターンされるのはあくまで配列の開始位置なので、この書き方では配列が消える恐れがある
という情報を目にしました。
以下のようなコードであればどのように改善すればいいでしょうか。
宜しくお願いします。
/*main.c*/
int main()
{
int *hoge=sub();
}
/*sub.c*/
int *sub()
{
int b[10];
return b;
} mainにbの配列を宣言してsubにポインタを渡し中身を書き換える
もしくは
sub内のbをstatic intにする もしくは
mallocで確保した領域を返し、freeするのは呼び出し元の責任にする 呼び出し元で寿命を管理すべきなので、
mainに int b[10]; と宣言してsubにbのポインタを渡す >>654 >>655 >>657
ありがとうございます!! 構造体で包んで値返し
typedef struct { int b[10]; } foo_t;
foo_t sub(void) { foo_t a; return a; } Cでprintfみたいな可変引数関数のラッパー
を可変引数で作りたいです。
コンパイラの実装に依存しない書き方って
有りますか? >>662
それができないからvprintfみたいなラップされる専用の関数ができた やっぱそうですか、残念。
ターゲットの関数はソース無いし、
vprintfみたいなのは用意されてないです。 可変引数関数を記述するだけなら stdarg.h で事足りるけど
printf のフォーマット文字列解釈して 文字に置き換える部分を
そのまま利用したいとなると、vsprintf の有無次第だよな・・・ >>661
状況によるけど、malloc/freeはコストが大きいので、使わなくて済むなら使わない >>667
コスト高いの?本当に!
高いのはSystem Callのこれじゃぁ?
sbrk/mmap/VirtualAlloc等 >>668
不必要なら避ける癖ついてたなあ
厳密に検証してないが、確保するサイズにもよるけど10%ぐらい違う
しかし関数コールは減らした方がいいのは明らか >>668
高い場合がある
と言う方がより正確かと
なので組み込みだと禁止してたり独自のルーチン組み込んでたりする int b[10]とmallocではmallocの方が常にコストは高いけどな。
前者は最適化無しで1命令、最適化後は0命令。
後者はK&R的軽量実装でも10〜1000命令は必要になる。
10%ってのは他含めてコミコミの計測結果だろ。確保のみなら喧嘩にならん。 ガベージコレクタだって高コストだしな。自分でメモリを管理するのが一番安いw Windows環境のMINGWです
\nをASCII文字コードにするとASCII表の通り10になりますが、
Windowsの改行コードCR+LFですよね?
UNIX環境ならLFつまり10になるのはわかりますが、何故Windows環境でも10なのでしょうか? \nをprintしたりした場合に改行になるだけであって、\nが10なのは変わらない。 >>677
ありがとうございます
\nが10になるのはCR+LFでもLFでも同じだということですか? \nは改行を表しその値は(ASCIIなら)10
printfとかの入出力するときにunixなら何もしないがwindowsではCR+LFと変換する 出力先のファイルポインタがクックドモードの時だけ変換される >>679
>>680
ありがとうごぞいます
クックドモードも調べてすっきりしました [[[C++]]]
}
001-GOM#\%71/#1,16,2,M,BL,SAJ%\*%U,615325,6,11,62,364,3,21,673,!\0.1,11.5,78,21,6%<<<\BSA\>0>>>%11.27,21,0,73.561,2,3,4,6,1,{\!end テキストファイルは、CR + LFでも読み込んだらLFだけになる。書き込むときCR + LFになる
バイナリファイルは、そんなことにならない
テキストエリアで改行するなど、ファイルとは関係ない場合、CRが必要になる場合がある 教えて下さいm(_ _"m)
size_t n;
n = (int)n < 0 ? -n : n; /* quick absolute value check */
"<" や "? :" の演算子は調べて分かったのですが、(int)n の部分は
どういう処理を行いますか?
intって宣言するものが、かっこで囲まれていて、なんだこれ!
っていう状態です。 キャストだよ
本来size_t型のnを、その場だけintてことにしてくれって要求
ただし本当にintになっちまうわけじゃないから
(int)n = n < 0 ? -n : n; みたいに
代入先にしようとするとエラーだ
コンパイラによっては通るのがあるけどそれは非標準 >>687
ありがとうです!
キャストですね。
size_tからintに一時的な変換ですね。
双方のメモリー上の大きさが違う気がするんですけど、僕の環境でどうなるのか調べてみます。 nが負になりうるならなんでsize_tで宣言するんだろ キャストを覚えろ
キャストしない事を覚えろ
キャストをすこしだけする事を覚えろ >>689-690
単なるサンプルコードだろ
そもそもそのまま実行したら未初期化のnを参照することになるし >>691
sizeof と言うコンパイラ組込演算子の戻り値の型がコンパイラに組み込まれていない違和感 >>694
いや組み込まれているが
それが具体的に何型なのかを
コンパイラの実装者が明らかにせよと
規格が要求しているということだ >>695
> いや組み込まれているが
「コンパイラ(プリプロセッサじゃなくて)」には組み込まれてないだろ
> それが具体的に何型なのかを
> コンパイラの実装者が明らかにせよと
> 規格が要求しているということだ
だからなに? size_tは__darwin_size_tでトドのつまり、unsighed longだって。 >>697
どうであれば組み込まれてることになるの
size_t n がコンパイルできることじゃないんだよね? 【環境】
CS+ + RX62N + E1エミュレータ
【言語】
C言語
上記にてprintf()でCS+のデバッグウィンドウに出力するにはどうすればいいですか? >>702
printf()ってCの標準関数でしょ?ここでいいのでは? ターゲットデバイス上でプログラムを実行するのであって、開発マシン上でプログラムを実行するのではない >>697
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ
# cl.exeではsize_tがいきなり使えるが、それがおまえの理想か >>705
> # cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
どこの cl.exe なのか知らんけど手元の Visual Studio 2015 Express では未定義の識別子だぞ >>700
size_tの差を記述したいんだろう。 何も入力されずにenterが押されたらループを終了する方法が分かりません・・・
誰か教えてください・・・
やはりscanfでは出来ませんかね
fgetsだったらできますか?
誰か教えてください、お願いします プロとしては、scanf単独で使うのではなく、fgetsとsscanfの組み合わせをオススメする。
Enterキーのみが入力されたときは、fgetsのバッファには\nが入る。 >>706
ああ、わりいな
拡張子が.cppの場合だw
で、それがおまえの理想か? >>709
すげえのオススメしてんなw
へーえ、それがプロの仕事か あ
確かにfgets(s, N, stdin)は改行を含めて読み取るな
じゃあ戻り値をsに格納したときにs[0] <= 0x1fのときループを終了させればいいか >>716
>>715(もう読んでるかもしれないけど念のため) >>717
多分、
入力文字列の最後が '\n' の時は '\0' に置き換える。
入力文字列が空の時は、処理を終了する。
がいいと思う。 >>718
スレタイに沿って聞いている>>705に答えられないゴミがドヤってんじゃねええよ >>708
環境依存ならgetchってのがあったな。
VS使ってんなら使えると思う。 >>721
スレタイも話の流れも読めないアホは黙っとけ w >>723
誰だよそれ
実在しない人物を罵倒することこそ
このスレですることじゃねえだろクズ アンカーついてるのに誰だよとか
さらにアホさが増してるやん w 説明不足と読解不足の両方だおまえら
もういいからどっちも黙れ >>725
アンカーつけられた人物と
おまえさんの説明が一致しない
と言っているんだよ
ニホンゴワカリマスカ? 質問です。
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では何がどう違うんでしょうか? 単純に型が違うんどすえ
int a, *b, **c;
これ全部違うんどすえ
a = 728;
b = &a;
c = &b;
int d, *e, **f;
f = c;
e = *c;
d = **c;
どすえ >>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つで型が変わる概念がいまいち理解できません ごめん、今回のプログラムとやらを一回も見てない
ポインタなんてのは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 = する もう1週間ぐらいこのプログラムとにらめっこしててそれなりに思いついたワードでググったりはしてるんですが
状況にあってると思えるものが見つからないんです 一週間って。。。
才能無いか最低限の文法も理解してない気がする。
一回腰を据えて入門サイトなり入門書読んだ方がいい。
猫でもわかるC言語とかサンプル多くて良いぞ。 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
変数の宣言と、式の中で*つけたり&つけたりする挙動については
自分でいろいろいじってみて納得いくまで確かめてみてほしい 逆ぅ!
誤:*ptr=newcell; // struct LIST *にstruct LISTを代入しようとしてエラー
正:*ptr=newcell; // struct LISTにstruct LIST *を代入しようとしてエラー 型を合わせるために**ptrにしなければいけないところまでは解ったんですが
頭が悪いものですみません
**ptrだとstruct LIST *になって
*ptrだとstruct LIST になるところがよく解りません・・・ 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 型の値を代入
}
へんすーの宣言時にくっついてる*と、
へんすーが式の中にでてきてるときにくっついてる*は役割がべつだよ!
分けて考えたほうが多分理解しやすいよ! >>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));
何で現行の文法になってるのか分かる人いる?
昔、「入れ子だとマクロでも対応できる(キリッ」って聞いたんだけど、
以前考えたら上記「希望」でもマクロ対応出来る感じだったので、謎になってる。 一応ポインタ周りについてググってみた。
> C言語のポインタが難解とされる理由
> https://teratail.com/questions/9058
以前から言われており、上記URL内でも散見されるが、
アセンブラをCよりも先にやった連中は誰一人としてポインタで躓かない。
だからポインタで引っかかる奴は
・ポインタの物理イメージがつかめないから
だと俺は理解していて、そいつが引っかかっているデリファレンス周りではないはず。
ただ、共用体がない言語なら物理イメージを持たずにプログラミングできるから、
それで問題ないとも思う。だから他言語にしろって話にしてる。 >>738
void foo(struct LIST *ptr)だとどうなるんですか? >>707
そりゃsizediff_tじゃないか? >>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 型の値を代入
}
これでなんとなくわかった? >>745
あ、すみません>>738の引用かと思いました
ちょっとよく読んで考えて見ますすみません int aとint *bとint **cが別の型なのは分かる?
わからないよね?
b = cの代入がエラーになるのが分からないんだよね? >>748
型が違って代入できないのは指摘して頂いたのでわかるんですがどこで型が違ったのかがいまいちよく解らなくて
まぁもちろん関数の**ptrを*ptrにしたところで変わったんだと思うんですがどうして*をつけると型が変わったといえるのかがいまいちよく解らないんです >>745
多分君なりのポリシーがあるのだと思うのだけど、
struct LIST **a = &ptr; // (A)
よりも
struct LIST** a = &ptr; // (B)
の方が一般的には分かりやすいのではないかと。
そして宣言 int* i, j, k; でシンタックスエラーを出すまでが様式美。
と思ったけど、K&R確認したら全部(A)だったw うんうん…うん?
int a; // int
int *b; // intへのポインタ 型
int **c; // intへのポインタへのポインタ 型
ここまでわかる?
ここまで変数宣言時に*くっつくと型が変わる例
(こっち側考えないで) = c; // intへのポインタへのポインタ 型
(こっち側考えないで) = *c; // intへのポインタ 型
(こっち側考えないで) = **c; // int 型
ここまでわかる?
ここまで、式の途中で変数に*くっついてると型が変わる例
これだけのこと >>752
あー
そいうとこでもひっかかってるのかな彼は >>754
いや、マジでCの文法は直感的じゃないんだよ。(プログラミング時の論理イメージとずれる)
俺的には(既に書いたが)以下のほうが良かったと思うよ。
(void (*)(int)) signal(int sig, void (*func)(int)); // これで関数ポインタ宣言させろ
int* p, q, r; // これは全部ポインタ宣言にさせろ
とはいえ限られた記号を使って上手くそれなりに整合性良く纏めてあるとは思うが。 宣言で ポインタ型を示す時 *
ポインタの指し先の実体を求める時 *
変数のポインタを求める時 &
上2つが文法的にやっかいかな? 同じ記号使ってるし >>753
多分その基本は理解できてると思います
ただstruct LIST *newcellがどうして**ptrと同格に扱われてるのかよく解らないというか・・・
*ptrでアドレスのやり取りできるんじゃないのって思ってしまうんです
でも実際は型が違う
どうして?っという感じです。 >>757
ポインタのことをアドレスだと考えるのはやめたほうが良い
ポインタは単なるアドレスなんかじゃないからね
そこには必ず型ってもんがあるの「〜へのポインタ」
ってなるからこそ色々できるんだけどその話は今は省略
> struct LIST *newcellがどうして**ptrと同格に扱われてる
同格に扱うってどういうこと? >>758
**ptrで対応しないといけないなら当然struct LIST *newcellも**型ということですよね?
struct LIST *newcellが**型というのが理解できません >>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は関数宣言時(仮引数)の型を受け継ぐ。
つかここで引っかかっているようではマジでお先真っ暗だぞ。 みてないけど >>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 のまま >>759
> struct LIST *newcellも**型ということですよね?
違います
> struct LIST *newcellが**型というのが理解できません
違います
struct LIST *newcell の型は struct LIST * です
struct LIST **ptr の型は struct LIST ** です
*ptr=newcell
これは、左側の*に注目
何をしているかは、もうわかるよね?
>>757で分かってるって言ったよね自分で 誰も見てないのが笑える。俺もだがw
質問者は分かってないようだが、
> 「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」 (>>728)
ってのは要するに & か * を忘れたときの典型的なエラーで、
隣に人がいたら「サーセンwwwww」とか言って誤魔化して10秒で修正して再コンパイルする、
ただのtypo。
みんなこれを知ってるから誰もソースなんて見に行きません。
newcell?知らんがな。ソース?見るまでもなく & か * 忘れてるだけだろ、さっさと直せ、って感じ。
とはいえ、エアプがいないのはいいことだね。 もしかしてvoid foo1(struct LIST *ptr) {struct LIST *b = ptr;}の場合に*ptrを使うとそれはアドレスを渡すのではなく
実数として渡してしまうから論理破綻しているということですか? やっぱ>>756さんの言ってることが問題な気がする
そういえば俺も最初はそこで混乱あったような気がする
int a = 100;
int *b = &a; // 1) intへのポインタ型のbに、intへのポインタを代入している
*b = 200; // 2) bが指してたint型の領域に、200を代入
printf("%d %d", a, *b);
ここなんだよなぁ
1)と2)が見た目似てるくせにやってることがテラ違うという
なんか懐かしいわ >>761
× > ※ なお Cには参照型というのがないので
○ 参照が必要な場合は、ポインタを使って明示的に参照を渡す
だね。そしてC++の「参照」とJava等の「参照型」の物理的意味が異なるから
余計に話がおかしくなり、辻褄を合わせるために
「参照の値渡し(キリッ」とか言い出すという。
とりあえず生Cで「参照」という言葉は使われてないでしょ。
それを持ち出すのは余計に混乱するだけ。
K&R確認してみたが、
「Fortranのようなcall by referenceとは違い」のところでしか出て来ない。
これのおかげかFortranは再帰できない糞言語だった。(と聞いている)
そんな糞とは違う、まさに「ザクとは違うのだよ、ザクとは」の文脈で使われてる。
見た目だけ参照型が欲しければtypedefすればいいだけ。
(普通は余計に分かりにくくなるからしないが)
それをここで持ち出す意味が分からんね。 >>764
エスパーするとイエス。
「実数」ではなく「実体」な。 >>766
ちょっと横道
call by reference な引数型で デリファランスするのに特別な記号を必要としない
ってところに着目したかったのよー >>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);
}
となりキミの当初の質問にも同じことが言える
*が何個重なろうが理由は同じ つか質問者はC言語以外には何ができるんだ?
>>768
なんか噛み付いた感じになってすまんかった。
他言語ができれば「参照」の説明は意味はある。
この可能性を忘れていた。
ただまあ、Cはやっぱりその辺のところが古くて、
現実的に構造体の値渡しなんてほぼやらないし、(つか、必要性がない)
他言語みたいに「構造体は参照渡し」で固定してよかったと思うよ。
まだ黎明期でその辺のプログラミング作法自体がなかった時代だから無理ではあるが。 >>770
C言語が最初の言語です
>>760
>>762
>>767
>>769
ありがとうございます
なんとなくですが解ってきたような気がします
頭悪くてすみません
教えていただいたことをよく噛み砕けるまで考えてみようと思います >>765
ポインタは一気に初期化せず、宣言と代入に分離すれば、理解の為の見通しはよくなるかもね
int a=100;
int *b;
b = &a;
*b = 200; >>728
俺もまだ見てないのだがw
**ptrを*ptrにしてもアドレスを渡すという役目はできます。その通りです。
void *ptrでもいいです。コンパイルエラーになるのはその後なのです。
あくまで処理に必要なのは struct LIST ** なので、キャストするなどすればコンパイルは通ります。
void *ptrで受けて struct LIST **_ptr = ptr; と代入して、以降_ptrを使うという方法もあります。 >>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であることを表す。
となっている。 >>774
自分もC言語覚えたての頃は、「int *」型という風に見ていた。
ポインタがあるんだからポインタを表す型がある方がわかりやすかった
イントロダクションとしてはポインタ型があるとみなしていいと思う。
でも言語仕様はK&Rのとおりで、初心者になる頃には正しく
理解できるほうがいい >>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;のみ例外)
文法的にはどうしても上記が引っかかるので説明サイトはほぼ全部後者になったのかな?
で、ヘルスバーグは糞だと判断して変更したと。 型に*を付けるのはC++の文化じゃないかな
Cだと識別子に付けるのが一般的だと思う >>777
それは言えてるかも。ロベールはC++だし。linuxカーネルは int *p;だったし。
C++はテンプレートがあるから、Array<int*>とか書かざるを得ないからね。 >>772
それそれ
俺もあとで思ったよ
なぜ最初にその書き方を使って教えてあげられなかったのかと
まずは分離ありきだよね >>772
>>780
ちなみにそれは何が分かりやすくなるんだ?
というか俺にはそれでどう勘違いしている奴を正しく導けるのか分からない。
ただし以下サイトでもそう言っているから、一部の人間に効果があるのは確実だとは思うが。
> ポインタの文法を説明するときに大切なことは、変数の宣言時初期化構文を見せないことです。
> http://pg-kura.hatenablog.com/entry/20120611/1339376977 右辺値、左辺値の違いの分からんやつに
ポインタの正確な理解、運用は永遠に出来んよ。 ポインタの話は別としても、
変数を宣言時に初期化するのは良い方法だと思うが int* a, b; が int *a, *b;と等価だと思ってるやつw
C++の流儀はこの誤解を助長する *がintにかかるか、aにかかるかだね
intにかかる方がシステマティックではあるよね >>785
宣言時と使用時で優先度が変わるのは好ましくない >>787
そうやって文法を増やすのは好ましくない 昨晩はレスありがとうございました
戴いたレスを読み直しながらいろいろ考えていたら>>738>>745>>760の意味を理解できました
void foo(struct LIST *ptr) のとき*ptrを使うのは型が違うという意味もやっと理解できました
代入するときの型が合ってないという事がちゃんと理解できてなかったと思います
丁寧に説明していただいていたのにピントのズレたこと言っててすみませんでした
重ねてありがとうございました >>782
右辺値左辺値ってC++が糞な部分にパッチ当てただけで、
Cやポインタには全く関係ないだろ。 >>792
Cに全く関係ないってのは言いすぎだけど、ポインタには関係ないのはその通り。 ん?
ああ、でもコンストラクタシステムがない以上、気にするところではないのか。
失礼、Cには確かに関係ないね。 >>791
|
/ ̄ ̄ ̄\
/ .\
.| .∧ |
.| ./川\ |
\/┏┷┓\/
。┃お┃。
゙ # ゚┃め┃; 。
; 。 ・┃で┃・ #
。 ;゙ #┃と┃# 。
゙・# : ┃う┃。 ; 。
.;:# ゙。゚┃!┃゚ 。 #
; 。;; ゙.:。┗┯┛。 # : #
∧_∧ │
. ( ´・ω・)│
:/ つΦ >>788
だから何?って聞いてるんだけど w
逃げてるのは君の方だろ >>796
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ
さあ答えろ >>797
> # cl.exeではsize_tがいきなり使えるが
ってどや顔して恥の上塗してた奴もいたけど? w 組み込まれていない:stddef.hで定義されてるんだから組み込み型ではない
組み込まれてる:unsigned intかunsigned longかunsigned long longか知らんけど組み込まれてるだろ
ってことかすぃら? >>798
ああ、そこにしか答えられないわけね
立派な答えだ
799がごく当たり前の答えを代わりに書いてくれているが
それすら答えられないようなゴミはCスレに出しゃばってくんな で結局 >>800 は何を言いたかったんだ?
意図不明なコードで規格ガーってどや顔してたら>>799に一蹴された
としか見えないけど w >>801
おまえさ、コードの意味が読めませんだなんて
このスレにおいて死ぬより恥ずかしいことを
わざわざ自己紹介しなくていいよ
799に助けて貰ってもその意味すらわかんねえんだろバーカ >>802
「意味」と「意図」の区別もつかないアホ w
チョロすぎるわ >>804-805
恥を上塗りまくってる >>788 に言えば? w >>803
いーや、おまえは意味がわかってない
だから、あんな簡単な問いにぐうの音も出なかった
誰が見ても明らかだよ 俺はしつこい
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ 動作の実装と識別子の導入の区別もつかないアホが
どでかいブーメランほってやがるぜw >>799が正解 ⇒ >>695が知ったかと言うのは誰の目にも明らかだしね >>813
いいだろう、少しだけ相手してやる
どこでもいいから>>695に突っ込めることを噛みついてみな
国会で審議妨害ばかりしているクズ野党みたいな戯れ言じゃなく
技術的に意味のある内容で来い 日本語が理解できてないんだろうな...
出してきた「意図」もわからんものにどう突っ込めと w
sizeof が size_t 型の値を返すのは当たり前で float とかワケわからんこと言われても困惑するだけ 仮に c++ の typeid のようなものが実装されてたら何を返すんだろう?
size_t に割あたってる整数の型であって size_t そのものは返さない気もするが >>815
日本語が理解できてないのはおまえ
>>695におまえが意図不明という「コード」は含まれていない
空疎な言い訳で逃げ回るザマはたっぷり見せてもらったからもういいぜ
こっちも腹筋がそろそろヤバい >>817
お前の意図が不明かどうかを判断するのは俺
マジで意図の意味がわかってないって言うオチかよ w >>819
技術的に意味のある話ができず
空疎な言い訳に終始しかできねえのを
人のせいにしてんじゃねえよゴミクズ >>823
技術的に意味のある話ができず
空疎な言い訳に終始しかできねえ
ゴミクズのお仲間、それがおまえだ
誰であろうがその特徴に違いはない 技術的にと言う割りには>>815の後半とか>>816にはレスしないんだな w
>>695を誤魔化すためにワケわからんこと書いてうやむやにしようとしてるのはみんなわかってるから >>827
おまえが>>815や>>816を書いたとでも言うのか?
他人の言葉を借りていきがっても、しょせんその程度だおまえは [][Tebla][]
}
000-"Yob*RtStrike"[%Kil\]MO,fla>%$9999VLTS
001-GYORLith"0\R"/"ESUBA"%$%
HADO-"EM","L","O","NU"###END Makefileで、
.PHONY: doc
doc:
doxygen
みたいに毎回.PHONY書くのあほっぽいんだけど、1行にならん? C言語でインラインアセンブラが使える文法の違いってどこかに解説ありますか?
asm{}文の表記のしかたが違う 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 そもそもの仕様として、
構造体のメンバーの参照に '.' と '->' を
使い分ける必要性がわからないんだけど、なぜ?
間接参照だと意識しろっていう教育的な意味以外思い付かん (*hoge).piyo
hoge->piyo
どっちでもいいけど後者の方が簡単というだけの話 そういうことじゃなく
Javaの参照ドットみたいなことに
なぜしなかったのか、だろ
ポインタを参照だと言い張るだけでいいのにと 構造体は全部参照だということにしたいの?
それすると、宣言するときに領域確保して、
いらなくなったらガベコレするっていう機構を組み込んどく必要があって、
Cのシンプルさにまったく合わなくなる。 >>838
>>839
参照云々はどーでもいいんだよ
左辺がポインタなら間接参照のコード吐いて
実体ならば直接参照のコード吐けばいいってだけのこと
すでに2つの演算子ありきの話になっていると思うぞ >>843
ドヤ顔で話の前提になってることをデバッグ出力してんじゃねえ
バグってる可能性があるのはおまえだけだ ポインタなら->の方が分かりやすいでしょ
もしかして矢印って分からない? -> で書いているのを . でも許したとして、コンパイラに不都合が出てくるんだろうか?
((struct foo*)0)->member ⇒ ((struct foo*)0).member
キャストの後の括弧がなくても通すと リテラルと繋がるから面倒をおこしそうだけども
(struct foo*)0->member ⇒ (struct foo*)0.member
そういうわけでもなさそうだし グローバル変数から関数の引数にしたりするときに、置換が面倒だと思うことはある
C++だと山椒があるんでそういうことも少ない >>846
思想としてそこまで意識して書き、ソース上にもその痕跡を残せってことでしょ。
他言語で言うプロパティの良し悪しと同じ議論だよ。
好き嫌いはあれども、正しい or 間違いの結論はでない。
コンパイラはエラーを検出できてるんだから、
その場合は . を -> と読み替えろ、というルーチンを入れれば君が欲しいものは簡単に作れる。
でも誰も用意しなかった。それが事実だね。 >>844
勝手に前提にするな〜
836は俺だ
>>846
そうそう、仕様として何か不都合があるのかという話がしたかったんだ
>>849
だから836で「教育的な意味」と書いている
結局言語仕様としてこうしないと問題がある訳じゃなくて
「教育的な意味」だけのことでいいんだな
>>847
きっかけはまさにそれ
書き換えめんどくせーから始まって、
コンパイラが困るのかと
色々なパターンを考えてみたんだけど
困るパターンを見つけられなかったんで
こんな話を始めたんだよ >>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使うのならそこまで含めてチューニングする気で書け、でしかない。 839だけど >>851 は周回遅れ。
構造体へのポインタでも、構造体でも、. を使う文法にできるんじゃねっていう主張。
今のところ俺もそれへの具体的な反論を用意できていない。
「教育的」っていうのは違うと思うがな。 >>852
いやみりゃ分かるが 851=849で、俺もそれは否定しない。
ただ、確かに851は間違いだったわ。
確保時の文法が異なっていて、それで十分だから、その後は区別する必要はないね。
見た目、直接か間接か分かるようにしろってことだろ。 ポインタなら(*foo).member と書くべきのところ->で書けるようにしたってことだけじゃないの?
糖衣構文的なオプションだろう
つうか、どちらもドット演算子に統一した場合、
ポインタなのにデリファレンスしないで値にアクセスできる仕様はCの文法としておかしくね? 逆にドット演算子の意味を考えてみると、これ変数からのオフセットだろ デリファレンスしてもしなくても意味が同じという仕様にした場合、
構造体のポインタのポインタだともっとおかしなことになる
やっぱりダメなんだよw >>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 が入るの?
まさか右辺の型に依存して変わるとか? 最初Cのソース見たとき -> って記述がなんのジョークかと思ったわ。 >>857
構造体Fooのポインタをメンバーに持つ構造体Fooのポインタで考えてみ
ドットでアクセスするのはどっちのメンバー? >>854が最後にいいこと言った
>>856の指摘が読めてない>>857はIQで30くらい差があるんだろうな (*pa).m と a->m
(*pa+i) と a[i]
お好きな方をどうぞ >>854
関数へのポインタは(*func)()とデリファレンスしなければいけないのに
func()と書けるようにしたのでおかしくはない >>863
ミスってるぞ
>>864
sizeof func != sizeof *func 字下げスタイルについて質問です
現在職業訓練校で習っているのですがそこの先生が
「プロはみんなこっち(K&R)だから。最近の教科書はこういうの(オールマン)増えてるけど、初心者向けの本書いてる人はそもそもプログラマじゃないから……」と。
自分がオールマン好きなのと、本を書いてくれる人たちをばかにするような言い方でちょっとむっとしたのですが、実際にK&Rばかりなんでしょうか >>866
自分一人で書くならプロだろうが何だろうが自分の好みを貫けばいい。
チームならそのチームのスタイルに合わせるのがプロ。
多数派は多分K&R。俺の好みもそう。 >>862
IQ180のお前さんならコード例一瞬で出せそうだからよろしく。 >>865
コンパイラが忖度してデリファレンスしてくれるって事じゃん >>866
今は他言語含めてK&Rが主流。昔の初心者本にオールマンスタイルで書かれてるのがあって
自分も最初は括弧の対応が分かりやすいからそれを使ってたけど
今は使わなくなった。括弧の対応なんて見れば分かるので重要じゃなくなる >>869
void (**f)();
f(); //error >>864
C FAQ 4.12
http://www.kouno.jp/home/c_faq/c4.html#12
配列名と関数名が特殊なのは、ポインタに成り下がるからなんだそうだ
構造体はどうだろうか? >>866
その「先生」もプログラマじゃなさそうに聞こえる
どこのチームに入っても「こいつのクセうぜえ」と思われたらあかん
K&Rだのオールマンだのと言うが純粋なK&Rや純粋なオールマンはむしろ少数派で
たいていなにがしか方言があり、それを無視して原理主義に走ると
標準語を使っているはずの自分のほうが訛っていることにされてしまう
保護色ができないやつがプログラマの世間を知っているのか疑わしい
もしくは、元プログラマでも引退してからずいぶん長いとかな
プログラマ以外の世間でも「前の会社では」が口癖の新入りが干されるのと同じで
狭い世界の狭い正義にとらわれたスッパマンに居場所はない そこのコーディング規約に従うまで
ただ、古典だけあってK&Rスタイルに近くなると話が早くなる コーディングスタイルなんて、GNUスタイルとかいう汚物じゃなければ何でもいいわ clangにはソースコードを解析してコードを補完する機能がありますけど
gccにはこういう機能はないのでしょうか? >>858
> x には b へのポインタが入るの?
> それとも 1 が入るの?
その仕様にした場合は、 x の型によって決まる。
多分、結局のところは、float->doubleのような暗黙のキャスト、
structPtr* -> *structPtr を許すかどうかだろう。
許しても大した問題はないように思えるが。
ポインタを使える最近の言語はGoとRustか?
詳しい奴がいれば聞いてみればいいのではないかな。
C言語で問題だった点は当然改修されているだろうし。 >>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 だよ >>884
だからxの宣言によって決まるだろ。
Cにはvarはないんだよアホ。
お前根本的に型を分かってないだろ。 >>881
聞いたことのあるセリフだなあ?
何だっけ?
北斗の拳? これだからなスクリプタは
スクリプタがプログラマ気取るなよと
トホホ >>885
アホなの?
size_t x;
って宣言されててもどっちの解釈もできるだろ
って話だぞ 大元の話で . 演算をポインタに対して適用したら ->とみなすという仕様なら矛盾はないと思うが、
>>843で「左辺が」とか書いたんで話がおかしくなっている気がする。 >>889
違うね。
>>888は「右辺を評価する際、 . を . とみなすか -> とみなすか区別できない。なぜならば結果が同じだからだキリッ」
という論理らしいが、そもそもそんな仕様の言語なんて無い。スクリプト言語ですらも。
そもそも着想の仕方がおかしいだろ。エアプだからだよ。
エアプはマジで死ね。 ドットに統一した場合、コードレビューでNULLチェックを見逃す可能性がある
こっちの問題の方が大きいかもしれんな 諸先輩方ご意見ありがとうございました
とりあえずその場所場所でのコーディングスタイルに合わせることが大事なのはわかりました >>890
> そもそもそんな仕様の言語なんて無い。
そりゃアホの子の>>843がない知恵絞って考えた言語仕様だし
今更何を言ってるんだよって話だが w >>891
-> を廃止して . に統一するのならその手の型チェックは緩くなる。
これは結局のところ、他言語でもなされている議論と同じで、
「静的チェックのための記述をどこまで許容するか」でしかない。
俺はCなら厳しい方が似合っていると思うが。
それはさておき、具体的にそのケースならnull許容型、って奴だろう。
他言語でも死ぬほど議論されているからググれ。 >>894
C言語とは水準が違いすぎる話なのでナンセンスというのが結論だろう
NULL許容で書けたところで、実行時にはNULLチェックするわけだから >>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への暗黙的キャストを認める」
という仕様なら、そちらの危惧している部分については回避できることになる。 >>889
だから . 演算子を適用した結果がポインタならどうするんだ?
って指摘されてるだろ
ID:4RmHy8z30 はレスできなくなって
> エアプはマジで死ね。
とか恥ずかしい捨て台詞で逃げてるけど w >>897
> 問題は3で、C++ならdynamic_castのみとして例外を投げればいいのだが、
> Cの場合これは無理なので、
> ・リンター等でキャスト直前にNULLチェックしているかを検出する
> ・明示的キャストをマクロ等でNULLチェックのインライン関数等に置き換える
> 等の対策が必要にはなるが、
そんなアホな対策は要らんわ
キャストまでしてNULL非許容の変数にNULL入れる奴はわかってやってるんだからそのまま入れてくれればいい
それに起因するエラーはプログラマの責任
C言語ってそう言う言語だろ >>898
>だから . 演算子を適用した結果がポインタならどうするんだ?
. 演算の対象がポインタかそうでないかで分かれるだけで、演算の結果は
それがポインタならポインタとして扱えばいいだけだろ。何か問題あるのか? >>900
なら>>858のケースで値が欲しいときはどうするんだい?
まあ新しい演算子を追加するのか? >>858で x に入るのはbへのポインタとしか解釈しようがないと思うが、値とはどれのことを言っている?
bの値の1が欲しいなら普通に x = *sp.a; でいいだろ。 >>902-903
要するに構造体へのポインタに対する . 演算子は今の -> 演算子と見なせってことね
>>883みたいな奴がいるから念のために確認しただけ
仕様として矛盾はないと思うけど
struct s sl;
struct s *sp;
x = *sl.a;
x = *sp.a;
と統一的に書けるから便利と思うか
x = *sl.a;
x = *sp->a;
とたいして変わらんと思うかは人それぞれだと思う 要するにも何も、>>889でそう書いているんだが。
で、>>898が「念のために確認しただけ」なわけ? 要するに、(*p).m を p.m と書けるということ
つまりデリファレンスの階層を一個省略しようってことで、
格段便利ってわけでもないし、かえってややこしいかもなw
これ、ポインタが何段になっても p.m って書いて整合性取れるかい? >>902-903
だからエアプなんだって。話の通じなさ具合がおかしいだろ。
>>899もそうだ。
> キャストまでしてNULL非許容の変数にNULL入れる奴はわかってやってるんだからそのまま入れてくれればいい
Cの場合はmallocの失敗がNULLになるんだから、これとかありえないだろ。
Cはnullありき、キャストありきで世界が構築されているから、
ヌルポ対策を静的にやりたいのならキャストも含めないと使い物にならない。
しかしエアプだからこれが分からない。マジでウザいから死ね。
> C言語ってそう言う言語だろ
これも違う。
C言語は静的な対策を拒否してない。動的な対策は全面拒否だが。
つっても通じないとは思うが。
>>904
> struct s sl;
> x = *sl.a;
エアプマジ死ねよ
というか、エアプがここに来る意味が俺には分からないのだが。
こいつらどの種のキチガイなの? >>905
だからアホがいるから蒸し返されないように念のための確認してるんだよ
匿名掲示板だから>>890みたいな奴すらいるんだぞ >>906
> これ、ポインタが何段になっても p.m って書いて整合性取れるかい?
それは大丈夫だと思う >>910
俺はまだそこがちょっとひっかかるんだよな
デリファレンスが一個ずれるだけなら意味ないと思うしね
時間ができたら検証してみるよ >>906
> これ、ポインタが何段になっても p.m って書いて整合性取れるかい?
実体になるまでデリファレンスしろ、というだけだから、出来なくはないと思うが。
> 格段便利ってわけでもないし、かえってややこしいかもなw
まあCがほぼ完成しているからな。導入する価値があるか微妙というのは同意。
> Cが見事にこなしていることは、全く"出来るだけシンプルにせよ、
> しかし、それ以上シンプルにするな"をしていることだ。
> そして、そのことがCを素晴らしいものにしている。言語はパワフルでありながら、ほぼ最小である。
> by Linus Torvalds
> https://srad.jp/~taro-nishino/journal/509450/
俺が思うに、Cに必要なのは階層(≒関数内関数)だよ。一部拡張されているようではあるが。
最近別言語だがCスタイルの記述(グローバル+関数、非オブジェクト指向)を読んだことがあって、
22K行のコードだが初見で簡単に目的のコードを探し当てられて、軽く衝撃だった。
Cが読みにくいのは100-500行のファイルで細切れになっているからであって、
あれ、設計者が分かりやすい順にcatしてくれていれば衝撃的に読みやすいことに気づいた。 あと、前方宣言必須というのも糞だ。
というか、今だにあれを放置している理由がよく分からない。
あれが無ければトップダウンで記述できるのでさらさら読める。
あれのおかげで下から構築しないといけないので、(include等つかって擬似的に回避できるが)
詳細まで確認する必要が無いときにも読まなくてもいい関数を読まされる事になる。
元々「世界の全てを把握して、絶対神として振舞え」という言語ではあるから、
「読みたくも無い関数を読まされたくねー」オブジェクト指向感性とは合わないが、
今更全てを把握できるほど世界は小さくないし、その必要が無いことも多い。
色々手抜きできる言語があることを知ってしまってからは、もっと手抜きさせてくれよーとは思う。 >>913
前方参照は確かにどうかと思うが、前方参照の制限が解消されたからといって読みやすさが改善するとは思えないね
現状でも底から読んでいけばいいだけなのではないか?
読みやすさは…識別子を日本語で書くのがよさそうだが typedet struct
{
void ( *reset_func )( void );
unsigned long initial_stack;
void ( *divide_by_zero )( void );
・・・
} intvec_t;
#define INTVEC ( *( intvec_t* )0 ) > 要するに、(*p).m を p.m と書けるということ
これ、できるできない以前に、初心者にきついな。
ルールを覚えるのは楽だけれど、例外事項が増えてくると、結局暗記になっちゃうからなあ。 >>913
プロトタイプ宣言というのがあってだね、それを宣言すればトップダウンで書ける。 >>918
だよな
トップダウンなだけでなく
関数の一覧ができているという点でも
>>913が書いていそうな糞コードのDBL_MAX倍マシ >>918
>>913はそれを知らないで書いてたのか?とするとかなりの初心者ということになるが。 まあしかし俺は同じファイル内にあるにも関わらずプロトタイプ宣言入れないと
わかってくれないのが嫌で使われる個所よりも上に書いちゃうけどな。
同じファイル内なんだからわかって欲しいものではある。
そういや PASCAL なんかも前方参照しかなかったような気がするな。
あの当時の言語はこういうの当たり前だったのかな。
PASCALなんかだとわざわざそういう思想で作られたって感じもするが。
Cだと手抜いただけのように見える。w ほー PASCALが前方参照しかないとか初めて聞いたわ
ID:kT8dsikx0とID:6JtF0HSC0の次の活躍に期待だな >>921
Pascal は LL(1)言語としてつくってあり、ワンパスでパースできる、その意地があるんだね Cもワンパスのため前方宣言必須ということのようだが、
一回舐めて拾うだけでいいんだし、今時こだわる必要も無いだろう
ヘッダに出した公開インターフェースは先、モジュール内プライベートはその下がわかりやすいよな >>926
C はプリプロを除いてもワンパスにはならないと思う >>918
>>913がプロトタイプ宣言知ってるかどうかは知らんけど同じ情報を二ヵ所に書かないといけないのはいかがなものかと思う
言語仕様を決めた当時はI/Oも遅いので高々数回のパースでコンパイルする必要あったからしょうがないとは思うが
>>921
Pascalは1-Passでビルドできるように言語仕様を決めていた
なので当初はモジュールみたいな概念もなかった >>920
さすがに知っているぞ。
俺は君と同様それはほぼ使わないというだけで。
というか、あの「事前に分かってないと使えない」事は正確には何と言うんだ?
「前方宣言必須」というのはどうも「前方宣言」自体が別の用語らしいのでまずかったようだ。
>>921
Cの場合、1パスコンパイルするためのものだ。
Cは紙テープ時代からある。
Wikiによると10文字/秒らしいので、1KBのファイルなら読み取りに1分40秒かかる。
これで2パスされると死ねるから、1パスでいけるように、
あらかじめ人間が順番を整えとけ(=機械に人間が合わせろ)というものだ。
どう考えても今はそんな時代じゃないだろ。
2パスに変更して「後方参照」(という用語でいいのか?)出来るようにすればいいだけだ。
紙テープの時代なら時代の要請だが、HDDの時代にこれを大事に守る理由は無い。
だから新しい全ての言語はこの制限は無い。必要ないからだ。
(ただしPythonを除く。この点だけでもPythonは糞だと断定できる)
ところがな、>>919みたいな老害は、
できる理由を見つけてきて頑なに現状維持しようとするものだ。
Cの場合は、確かに下から構築していけばプロトタイプ宣言は通常全く使わずに構築できる。
だからそれが作法になってしまってるだろ。
Pythonの場合はおそらくこれ、つまり、下からの構築を強制させるためにあえて採用してないのだと思う。
しかしな、他人のコードを一から読むとき、下から読む必要はなく、上から読んだほうが楽だ。
(正確には中レベルから。一番上のレベルも読む必要ないから)
お前らがそれに気づけてないのだとしたら、お前らはCしか読んでないからだ。
というか俺も最近までそうだったのだが。 既に書いたが、Cの読みにくさは、ファイルが細切れになっていることもある。
これはOOPも別の意味で同罪で、「で、その処理は具体的にはどこに書いてあるんですかね?」は常だ。
だからそんなものだと思っているのだと思う。
ところが最近、後方参照できる言語でCスタイルで書かれているコードを読んで戦慄した。
圧倒的に読みやすいのだ。(OOPよりも)
上からスクロールしていくだけで、読み飛ばしていいか、そうでないか、はっきりと分かった。
ところが肝心のCにはこの類のソースコードは存在しないんだよ。後方参照禁止だから。
後方参照が出来るようになれば、設計者が自由に関数を配置できるようになる。
当然、一番分かりやすいように並べることになる。
今のCにはその自由度が無いんだよ。人間が機械に合わせる仕様だから。
「プロトタイプ宣言」とかいう二度手間をやらないと、最もわかりやすい順に並べられない。
だから今のCソースは基本的に「分かりにくい」。
少なくとも後方参照できればもっとわかりやすくなる方向でしかない。
だからいまだにそれを放置しているのはマジで糞だって事。
老害的には「下から構築しろ」という教育効果を主張するのだろうが、そんなのは要らない。 ここで議論している人の 前方宣言 後方参照 の定義が一致しているのか気になる。 >>929
> (ただしPythonを除く。この点だけでもPythonは糞だと断定できる)
Python の def が「実行文」であることも知らんのだろうな w >>932
というか今更その辺の用語は無いんだよ。理由は他言語では必要ないから。
「後方参照」も正規表現でしか使われてないし、
しかもあれって「後方」よりも「バッファ」と言え、という類のものであるし。
とりあえず俺の定義は、
前方宣言必須:どうやらこれは俺の誤用だったすまん。「事前に宣言しておかないと使えない」の意で使ってた
後方参照:後で定義されている関数を使うこと
だね。これが適切かは分からんが、Cやってる奴ならあーはいはい程度には通じるとは思う。 >>933
知らんね。
つかあれ、そうなのか。だとすると動的に構築するから致し方なし、って奴か。
JavaScriptが糞な点と同じだな。
まあどの道2パスすれば回避できるだけのことを、なぜやらん?ってのはある。
Pythonは聞けば聞くほど糞なので、俺はやってない。 >>927,931
たとえばgotoのラベルは下でもいいよね
たかだか関数内限定ではあるけど
>>932,934
今話してる文脈は「Cの前方宣言必須について」でいいんじゃないの? 引数が無い宣言のこと特別に「前方宣言」と言うのか
知らんかったわw
http://wisdom.sak ura.ne.jp/programming/c/c27.html >>935
知らないなら黙ってりゃいいのに
知ったかはこれだから... >>936
Pascalはラベルに数値が(と言うか数値しか)使えないこととコンパイラを単純にするためにlabel文で宣言が要るけど、コンパイラの実装としては必須じゃないでしょ
goto文の飛び先はラベル見つけた時点で入れればいいだけだし K&Rの時代じゃあるまいし、前方宣言を原型形式でない関数宣言子と捉える奴なんていねーだろ
プロトタイプ宣言とか言い出した>>918は例外として >>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は本当に何の意味も無く制限をつけている、ただの糞だ。 知ったかが慌ててググって的はずれの長文乙
Python 関数ポインタ
辺りでググる程度の知恵もないのが残念だが w >>937,940
俺もそれを知らんかった。
そしてそのページでそれを確認し、K&Rみたら確かに「プロトタイプ」となっている。
だからどうやら俺の誤用だった、とした。
ただまあ、その意味での「前方宣言」なんて見たことないんだけどね。 Pythonはファイルの最後に
if __name__ == 'main':
main()
ってやる関係で、結局実行は最後になるからdefの順番とかで困ることはまずないな
せいぜい関数内関数定義で先に書くか後で書くかくらいか?
一体どんなコード書いてりゃそんなどうでもいいところで引っかかるんだ >>942
Pythonのdefは941で言う(A)なんだよ。
だから後方参照できない技術的理由は無い、という見解だ。
お前には通じないようだが。
それとは別に(B)の記述はPythonでも出来る。
というかこれが出来ない新しい言語なんて無い(ただしJavaを除く) >>941
> みたところPythonには(A)しかなさそう
>>945
> それとは別に(B)の記述はPythonでも出来る。
バカの上塗り w
そもそも>>944が言うように前方参照の話ですらないのに何を必死になってるんだか >>929
あーそう、「ほぼ使わない」のか
チームメイトが(いれば)お気の毒だね
正規表現の「後方参照」はここでの話と全然関係ないぞ
コンパイラにとって初見の識別子があとで宣言されることを
MASMでは前方参照と言っていたが、
Cでは「undeclared identifier: 宣言されていない識別子」
となっているだけだ(もち violation of the syntax)
ちなみにISO/IEC9899には全然違う意味の
「forward declaration: 前方参照」という用語がある
老害を小馬鹿にしたいようだが、脇が甘すぎだぜおまえ >>947
脇が甘いもなんも、お前も全員が妥当だと思う用語を持って来れないだろ。
だったらお前も俺と同レベルなんだが。
913の時点で「『宣言されていない識別子』は禁止」では何を言っているのか通じないだろ。
(「前方宣言必須」は厳密には間違っているが、C使いには意図は100%通じてるだろ)
というかお前は老害ではなく若いのか?その突っかかり方はガキっぽい。
2chは言葉の定義にやたらこだわる奴が多いが、それはただのクソガキで、
仕事してりゃ分かるはずだが、実は社内方言ってのはものすごく多くて、
社外だと全く通用しないことすら自覚できてない場合が殆どだ。
だからすれ違いを感じたら>>932のように確認するのが常で、
俺はそれを受けて>>934と応じた。
ここら辺は仕事をしたことがあればよく見かける光景ではあるはず。
もちろん方言ではなく共通語を使う努力をすべきなのは言うまでもないが、
問題は方言を使っている奴は方言だと認識してないことなんだよ。
だから俺が方言を使っていれば、お前が正しい共通語を示せばいいだけの話であって、
今現在は(需要が既に無いから)共通語自体が存在しない状態だろ。
それをいちいち勝った負けたされても知らんがな。
で、まあ、話を戻すと、
(俺はPython使いではないから間違っているかもしれんが)
俺の理解では、Pythonは「プロトタイプ宣言が出来ないC」だ。
この理解が正しければ、糞だということで割と賛同を得られると思うが。
>>944は糞を量産していることに気づいてないだけだ。
ただそれとは別に、プロトタイプ宣言は無くても通常は構築可能で、
Cはそれが作法になってるだろ。
例えばファイルの先頭でファイル内全関数をプロトタイプ宣言してるソースなんて見たことないだろ。
(コーディングルールとしてこれをやっている所があってもおかしくないが、誰か知ってるか?)
ただ、Cはこの手間をかければ順序は自由にはなるが、Pythonはそれすら認めてないだろ。
この辺、Pythonは無駄に教育的で実践的ではないんだよ。 俺が糞を量産しているというのは穏やかではないな
if __name__ == '__main__'が糞といいたいのか?
ちょっとPythonスレで議論しようよ forkで子プロセスから、子プロセスを終了させたあとに親プロセスを終了させる方法無いですかね?
親プロセスはwhile(1)で回していて、子プロセスで入力を受け取るのですが、ある入力が来たときだけ、プログラムを終了(子プロセス親プロセス両方共終了)させたいです 親プロセスでwaitpidして子プロセス終了してたら自分も終了すれば良いじゃん >>953
子プロセスは自動で死ぬこともあるんです
だから、子プロセスが自発的に親プロセスを終了させよつとしない限りは親プロセスは行き続けて欲しいです 終了ステータス変えるとか、共有メモリで適当なフラグもっとくとか、事前に適当なシグナル送るとか、いくらでもやりようあるだろ >>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だろ。
下位からの記述を強制されている場合に、上位から読みたければファイル末尾から読め、
でしかないというのも事実だから、そんなに致命的でもないんだが。 >>956
> Pythonは余分な方法を使わないとこれが出来ないんだろ?
普通になにもしなくてもできる
必要なのは>>944のが書いてる
> Pythonはファイルの最後に
> if __name__ == 'main':
> main()
だけ
て言うかPython知らないなららPython云々で語るなよ
アホの戯れ言をいちいち訂正するのが面倒すぎる すまん、>>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スタイルで書かれた大規模コードを一度見れば分かると思うよ。 俺ってばこんなこんなに何も分かってない奴に「糞コード量産してる」とか言われてたん?
失礼な奴だな本当に ctagsとか、タグジャンプつかおうな?
上から下にならべてあるから読みやすいですとか、眺めてるだけですと、宣言してるようなものだ。
トレースする気がないべ? >>960
いや事実だぞ。
君は都合が悪い部分には回答しないようだが、プロトタイプ宣言が無いのは事実だろ。
それは下位関数も含めて全部上側で記述することを強制する。
C言語でプロトタイプ宣言が無い場合に似ている。
ただし関数内から別関数への参照は「動的」に行われるのでCより制約は緩くなるが、
本質的にはあまり変わらない。
そもそも、下位関数なんて名前を見たら実装なんて見ずとも結果が分かるべきものだし、
それがオブジェクト指向の思想だろ。下位関数は読む必要なんてないんだよ。
俺は「『君が無能だから』糞コードを量産している」と言っているわけではない。
Pythonの仕様が糞だから、「Pythonでは糞コードしか書けない」と俺は言っている。
そこを君は勘違いしている。
それはそうと、Pythonのスレ試しに見てみたが、相当酷いな。あれじゃマ板だよ。
>>961
IDEに使って本格的に読めばその辺も含めて改善するのだろうが、
設計者が分かりやすいようにソート済みなのと、
コンパイラに都合がいいようにソート済みなのでは、全然違うんだよ。
そしてCは「ファイル」を階層として使っているのだが、これがもう古い。
タグとか使って一発で飛べるのなら余計に1つのファイルにまとめてあったほうが好都合だろ。
(もっともタグ使えば複数ファイルでも飛べるのだとは思うが)
ただ、俺が求めている階層は関数内関数で十分で、
GCCで採用されているのでいいんだが、アレは何で標準にならないんだ? トランポリンコード必須なGCCの関数内関数が標準に入るわけないだろ >>952
親プロセス while (1) で回してるって、その while (1) の中でやってる処理はなんだ?
wait() してないのか? wait() してるならそれで子プロセス側の exit() のステータス
受け取れるからそれで親側で判別すればいいんじゃない?
てか、これCはCでもUNIX系OS固有の話だよな。ここだとスレチにならんか? >>959
まあそれで見やすくなるだろうから、そういうCを拡張した新しい言語作れば良い。
しかし、問題はC(あるいはそこからちょっとしか拡張されていないような言語)を
人間が直接使う機会はおそらく減り続けることにある。今でもほとんどOSや
デバイスドライバを記述するアセンブラ代わり >>962
お前のいうことは完全に間違い。Pythonスレでならちゃんと答えてやる
興味がないならこれ以上その浅はかな知識をひけらかすな あ、ごめん。途中で送信しちゃった。
つづき。
↓
に使われてるしね。 関数内関数って要するに高階関数のことだろ
関数型言語または関数型のマルチパラダイムの言語でないと無理だろ Objective-Cで全部可能ではある
C言語でもclangならblocks拡張(関数オブジェクト・クロージャ)が使える
関数内関数は単純に制御構造だと捉えれば、C言語でもgoto文で可能でしょう Blocks拡張は有能なのは分かってるけど、Clang依存コードになるからちょいとハードル高いよなあ >>948
いやコンパイラにとって初見の識別子があとで宣言される
という形になっているコードについて話しているのは
みんなわかってるのに、頓珍漢な言葉遊びに持ち込もうと
している邪魔な奴がおまえだ
> Cはそれが作法になってるだろ
はあ? 聞いたこともねえぜ、寝言は寝てぬかせ
横着しねえでちゃんとプロトタイプ宣言すんだよ
正直たまにサボることがあるのを恥もせずに
それがスタンダードとか居直るおまえの態度が鼻持ちならん ヘッダにはプロトタイプ宣言を書くだろうに
なんでプロトタイプ宣言をなかったことにしたがるのだろうか? >>972
俺も非依存性重視なので、拡張なしの標準的なCでやってるよ
プロトタイプ宣言とクロージャは諦めなきゃならないが
クロージャはコールバック関数のポインタを渡すという伝統的なやり方でできる >>975
諦めなきゃならんのか出来るのかどっちだよw
いやblockなしでクロージャ出来るんなら割と真面目に知りたいんだけど >>976
いやコールバック関数のポインタ渡しで代替だからw 別に関数書く必要はあるよ
blocksみたいに、同じスコープにコールバックの処理も書けちゃうっていう便利さは無い
環境のキャプチャもしたければ、値のコピーをヒープに確保してコールバック側でfreeとか、
工夫すればできるでしょう うーむわかりた。やっぱ別に書いた関数を呼ぶのがせいぜいよなあ
せめて関数オブジェクトがあればなあとたまに思うわ >>959
> というかPythonの話は止めよう。俺はそっちには興味ない。
はあ?
Python言い出したのはお前だぞ w
>>962
> Pythonの仕様が糞だから、「Pythonでは糞コードしか書けない」と俺は言っている。
だから知らないならPythonに触れるなよ
別にPythonサイコーって思ってる訳じゃないけどお前の指摘は全て的はずれすぎる
関数定義の順序に制限なんてない
あとローカル関数についてはJavascriptも似たようなもんだぞ >>970
> 関数内関数って要するに高階関数のことだろ
全然違う
> 関数型言語または関数型のマルチパラダイムの言語でないと無理だろ
Pascalでも使えるのに何を知ったかしてるんだよ w
>>971
> 関数内関数は単純に制御構造だと捉えれば、C言語でもgoto文で可能でしょう
これはさすがにアホすぎる... >>980
ちょっと関数内関数ってどういうものを言ってるか説明して
単純に言えば関数内で行ったり来たりするだけじゃないの? 関数の内部で関数を定義するようなイメージじゃないの?
C言語では不可能だけど
void functionA(void) {
…
void functionB(void) {
…
void functionC(void) {
…
}
}
} >>981
スコープが違うだけで普通の関数と同じだぞ
普通の関数をgotoだけで実装してみてよ >>963
> トランポリンコード
なんだそりゃ?と思ったらこれか。
http://d.hatena.ne.jp/yupo5656/20040602/p1
なるほどGCCのは単なる階層ではなく、プチグローバル付きか。
この仕様なら上位階層(ファイル)を記述変更無しで取り込めるが、
これは確かに標準化には微妙だな。俺はGCCの仕様を詳しく知らんかった。すまんね。
しかしこれ、C++のメンバ関数ポインタみたいに、
普通の関数ポインタと相互運用することは諦めてしまっても良かった気もするが、
それだとレガシーとは相性が悪い。微妙なところだね。 >>983
俺が言ってるのは、Cでは同じようには書けないが同じ処理はできるってことだよ >>967,969
チョイ拡張言語ってのはエコシステムが付いてこず勝手に死ぬ。
Dもだし、Objective-CはAppleに拾ってもらえたけど、もう確実に死ぬ運命だよね。
(あれらはチョイ拡張でもないが)
チョイ拡張だとわざわざCから移行する意味が無いんだよ。
理想的にはやっぱ標準に入ってくれないと辛いわ。
Cが死に行く、って指摘については、俺もそう思っていたのだが、
何度も言っているが最近Cスタイルの他言語コードを見てちょっと考えを改めつつある。
OOPのコードは結構真面目に追いかけないと辛くて、読みやすくはない。
これはCも同様だと思っていたのだが、実はCの読みにくさは「階層」と「後方参照」がないだけで、
(つまりファイルがバラバラで、しかもグダグダな順に書かれているからであって《=プチ難読化済》)
構造的に問題があるわけではなく、それなりに読みやすいことに気づいた。
だからこれらがある言語(Python以外の新しい言語全部)でCスタイル(手続き型)で書かれたコードは
実はかなり読みやすいのだと思う。
(問題は、そういうのにあまり遭遇しないことだが)
だからC自体は廃れるかもしれないけど、Cスタイルは多分廃れない。
そして今のところ手続き型万歳的な言語はCだけだ。
となると、Cに足りない上記、「階層」「後方参照」が入ればCってもう一回来るかも?とも思う。
(つか、namespaceすら入れないって何よ?とは思うよマジで)
>>986
乙 Pythonがプロトタイプ宣言の必要のないC言語と言ってるバカがいるのはこのスレですか? >>973
全部書くのがお前のジャスティスならそうすりゃいいし、
実際そっちが主流かもしれん。
しかしヘッダファイルを用意するなんて完全に二度手間だし、
コンパイラが自動的にやれよマジで、と思ったことは無いのか?
コンパイル時間が気になるのなら、ヘッダファイルを用意しろ、
面倒ならなしでよし、その場合はコンパイラが勝手に探してくる、
その分コンパイル時間はかかるが手間が省ける、って仕様で何も問題ないだろ。
てか他言語は全部そうだし。(Python除く)
俺はあの仕様がいまだに残っており、
また、お前みたいに疑問を持ってない奴がいることがよく分からん。 >>989
× Pythonがプロトタイプ宣言の必要のない
○ Pythonはプロトタイプ宣言が出来ない
○ JavaScriptはプロトタイプ宣言が必要ない
何度も言っているがこれだけでPythonは糞だと断定できる。
一番わかりやすい順に記述出来ない時点で糞。
ただしPythonってのは元々そういう言語。ユーザの自由を認めていない。
で、俺はマジでPythonに関わるつもり無いからもう止めて。
Python信者が発狂しているし。俺自身Python知らんし。 一元管理と二重チェック、共存はできないが一概にどちらが優れていると決めつけられるものでもないなぁ。 >>985
だからgotoでどうやってやるんだよ
戻り番地の意味わかる? >>990
いや、何も無理してC使う必要はないんだよ。なんだったら新言語作ればいい。
bison, flex (yacc, lex) があるわけだし。
で、比較的楽に言語を作る方法は、C言語へのコンバータにしてしまうことだ。
そうするとかなり多くの環境で動くものがいきなりできる。
C++も最初の頃はそうだった。 >>991
バカは何度指摘してもバカのままなんだな >>990
1ソースコードファイル1オブジェクトファイルだからそういう仕様なんだよ このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 66日 23時間 31分 46秒 2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/
▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。