C言語なら俺に聞け 140 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©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
2017/05/20(土) 08:13:36.98ID:Ykf9CvnEa
>>131
野良ライブラリが多いのは多分Cが一番だろうけどな。
何かしらの言語の野良ライブラリの元はCの野良ライブラリが必要で〜とかで、Linuxじゃないと集めてられない。
Win32APIもC前提だけど、多分MSの中の人もいくつあるか把握出来てないんじゃないかな。
134デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/20(土) 18:45:47.54ID:AtO1B5PX0
ISO/IECだってしょせんはブランドの1つでしかなく
別に数学的な公理とかじゃないからな
2017/05/20(土) 19:07:14.30ID:cC3hGZmH0
無矛盾な公理的集合論は自己そのものの無矛盾性を証明する事ができない
2017/05/20(土) 22:15:46.49ID:d/44g1et0
./a.outって入力すると'.'は認識されてないと言われました
何が問題でしょうか?
2017/05/20(土) 22:21:46.82ID:3NdrFBG3d
>>136
コマンドプロンプトはMS-DOSのカルチャーで区切りはバックスラッシュで、MSYSやLinuxはbashのカルチャーで、スラッシュが区切りあるね。
2017/05/20(土) 22:38:50.18ID:feiyOPgg0
>>136
区切りで「/」使いたいなら、パス全体を「"」で括る
「/」以降をオプション「.」をコマンドとして認識するから、全体で一つのコマンドと認識させる必要がある

「/」を区切りに使うのはunix
windowsでも一応使えるけど普通はバックスラッシュ使う
2017/05/20(土) 22:52:55.54ID:d/44g1et0
>>136 >>137
バックスラッシュということは¥ですよね?
2017/05/20(土) 23:02:48.40ID:3NdrFBG3d
bashではセキュリティ上の理由で、現在のディレクトリのプログラムを起動するのに、./が必要だが、Winのプロンプトでは不要。
2017/05/20(土) 23:12:15.43ID:feiyOPgg0
>>139
日本語のwindowsならそう、円記号
コマンドプロンプトとかエクスプローラとかのパス表示には区切り文字に\使われてるでしょ
2017/05/20(土) 23:54:38.45ID:HEZORyL40
昔は.がデフォルトでPATHの先頭に入ってたな
ホームディレクトリにls置いたら面白いことになった
143デフォルトの名無しさん (ワッチョイ 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でいけるのはなぜですか?
2017/05/21(日) 11:43:49.79ID:pUWFtSb10
>>143
i の型はポインタ,すなわち char *i だから
2017/05/21(日) 11:44:04.43ID:JHzb8j250
>>142
&はアドレス演算子で、その変数がメモリ上のどのアドレスにあるかを示す
scanf関数で&を使うのは、つまり、「この変数のアドレスに読み取ったものを書き込め」という意味になる。

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

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


>>147
そのたとえは意味不明,可変長引数の可変部は float->double に格上げされることを隠すなんでひどい物言いだね
2017/05/21(日) 12:51:40.59ID:EZ567Ylh0
最近は初心者を騙すのが流行しているのか
2017/05/21(日) 13:33:41.41ID:LBGUGIAq0
linuxでc言語開発したいんですが、IDE使わないのが一般的なんですか?
2017/05/21(日) 13:45:10.14ID:2TTm6ATPa
はい。
CやJavaならEclipseが一般的かと。
Eclipseにサポートして貰ってないのはviやemacsカスタマイズしてIDEとして使う感じ。
2017/05/21(日) 13:45:35.47ID:2TTm6ATPa
あ、はい。は忘れてw
2017/05/21(日) 15:31:07.21ID:Mj8j7wxe0
>>132もおねがいします
2017/05/21(日) 15:34:52.30ID:kPjNSBDr0
>>157
質問文が酷すぎて、何を聞きたいのか理解されてないだけだぞ
2017/05/21(日) 16:54:32.37ID:bYtGqajI0
>>154
最近は yacc じゃなくて何か新しいのあるんだよね。
2017/05/21(日) 17:27:25.62ID:1Ubd4ETn0
>>159
最近じゃないけど bison とかか?
161デフォルトの名無しさん (ワッチョイ aa18-JCxV)
垢版 |
2017/05/21(日) 17:32:24.58ID:ViqOYprV0
何でいきなり構文解析器の話になった?
2017/05/21(日) 17:53:33.03ID:Qv//Z9+/0
>>152
>訂正する,配列名を示す識別子は配列の先頭を示すポインタになる >>145 が丁寧な説明だ
なんねーよ カス

int a[10];
a++; // お前の主張が正しいならエラーにはならないはずだ
2017/05/21(日) 17:53:37.15ID:/ema5D/U0
c言語作るって言ってるからでしょ
164デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 17:59:27.49ID:EhbYbiNc0
>>149
コンパイルエラーって、どこが?
https://ideone.com/VpAiLB

>>152
147だが、最後ふじこってんじゃん
落ち着いてもっぺん日本語で書いてくれ
2017/05/21(日) 18:06:09.69ID:zNfd0kUpa
>>162
横からと言うか流されてるんで。。。
飛び飛びになってるけど
>>148
>>150
>>151
は、おいらなりに結構正確に書いたつもり。
参照はC++用語だからCだと&はアドレス演算子が正確だけど。
2017/05/21(日) 19:10:04.03ID:pUWFtSb10
はいはい,そりゃ配列とポインタは互換じゃないよ
分かりやすい説明はないものかね‥
2017/05/21(日) 19:10:52.98ID:pUWFtSb10
>>164
>147だが、最後ふじこってんじゃん
ん?
2017/05/21(日) 19:20:07.02ID:lXB+sVuE0
%f は 引数を double 仮定で引き出す
呼び出し側は (可変長引数の可変部なので) doubleに格上げしてから引数に詰んでる

詰んでるものと引き出すものの食い違いはおきてないんじゃないかね
2017/05/21(日) 19:28:27.25ID:pUWFtSb10
>>168
>積んでるものと引き出すものの食い違いはおきていない
そりゃ引数に積むときに float->double しているから,そうなって当然だが,その事実を隠したまま
>>147
を主張されても,そりゃないよ,としかいいようがない.
2017/05/21(日) 19:29:57.61ID:zNfd0kUpa
>>166
無いなー。。。
ここが変だよC言語とかもう廃刊だっけ。
あれじゃないと説明しきれん。
2017/05/21(日) 19:40:24.59ID:kPjNSBDr0
配列型の"式"は、一部のケースを除いてポインタ型の式に"型変換"される、それは配列の先頭要素を指す、また左辺値でもない
関数の実引数での使用についてなら、>>147の既定の実引数拡張でfloatがdoubleに拡張(型変換)される例と同じような話だと思うんだけどな
2017/05/21(日) 20:10:14.64ID:zNfd0kUpa
>>146
おいらはこれ、sizeofが関数じゃなくて演算子って呼ばれてるのが肝で、関数に配列渡しても何故かポインタのサイズじゃなくて配列サイズ返す謎な奴って解釈してるな。
2017/05/21(日) 20:19:46.42ID:8VZiX6Z0a
んあ。
ごめん。
>>172は無し。
嘘付いた。
配列関数に渡す時、配列の大きさも別で関数に渡してたの思い出した。
2017/05/21(日) 20:24:04.46ID:8VZiX6Z0a
>>146
これは配列宣言した場所と同じスコープなら配列のサイズ返すけど、配列を関数に渡した先(関数の中)でこれするとポインタのサイズが返ってくる。
2017/05/21(日) 21:28:16.83ID:LBGUGIAq0
>>155
ありがとう
176デフォルトの名無しさん (ワッチョイ 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);
}
177デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 21:45:09.31ID:EhbYbiNc0
>>169
隠している? それは聞き捨てならんな
公文書に書かれていることを俺がどう隠したとぬかす?
2017/05/21(日) 21:53:31.38ID:8VZiX6Z0a
>>176
それ、文字配列だからヌル文字(0)で数えられるっしょ。
intの配列とか無理だから。
179デフォルトの名無しさん (ワッチョイ 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);
}
2017/05/21(日) 22:02:18.84ID:lXB+sVuE0
いやいや sizeof はコンパイル時に確定する演算だから
strlen みたいにポインタの指し先追っかけてデリミタ見つかるまでのバイト数とか 実行時依存じゃない
2017/05/21(日) 22:08:35.89ID:8VZiX6Z0a
>>179
ん?
出来てんの?
よく見たら宣言だけで初期化(確保)はしてないのな。
うーん。。。
ちょっとおいらの方でも書いて検証してみるわ。
2017/05/21(日) 22:10:30.59ID:lXB+sVuE0
だから sizeof は型さえ類推できれば、変数の実態なくてもいいんだって
なんなら () 付けて 型をかけばいい
183デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 22:10:36.85ID:EhbYbiNc0
176でも初期化はしてないが
184デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/21(日) 22:13:36.56ID:EhbYbiNc0
>>182
型をかけばいいって、こうか?
if (sizeof i != sizeof(char*)) puts("ahem!!");
2017/05/21(日) 22:15:17.46ID:lXB+sVuE0
>>184
ごめん、すべて ID:8VZiX6Z0a 君向け (>>178 他)
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]);
}

こう言うコードだとポインタのサイズが返ってくる。
2017/05/21(日) 22:41:32.99ID:fA6hmJLUa
ちゅーか十何年ぶりのCだったわ。。。
2017/05/21(日) 22:44:28.27ID:fA6hmJLUa
sizeof a[100]はタイポだけど許してね。
配列の変数名にiとか普通使わんのよ。
インデックス変数に使うからさ。
a[i]
2017/05/22(月) 06:47:21.18ID:3isejMaU0
void f(void * v, int size, void * x){
*v=*x;
}
上のコードで x の指し示す値のサイズが size であるとき
どのようにvの指し示す場所にxが指し示す値を一度に代入できますか?
2017/05/22(月) 07:31:20.24ID:uEzgaoxk0
memcpy(*v, *x, size);
2017/05/22(月) 07:34:49.91ID:uEzgaoxk0
訂正
memcpy(v, x, size);
2017/05/22(月) 07:37:02.82ID:qnT1Y5yL0
>>189
学校の宿題か?
2017/05/22(月) 08:26:47.95ID:jL5+dSxZ0
for (i=0; i<size; i++) ((int8_t*)v)[i] = ((int8_t*)x)[i];
194デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 09:21:02.66ID:uUtJqX7+0
while(size--) *(char*)v++ = *(char*)x++;
2017/05/22(月) 11:15:09.22ID:jL5+dSxZ0
>>194
文法エラー (v, x のインクリメント操作は void * で評価されてる)
2017/05/22(月) 11:57:30.90ID:WXjICEY9M
size の単位が何なのか分からんなぁ。
2017/05/22(月) 12:02:49.26ID:HD7uOEeF0
(`・ω・´) ?
2017/05/22(月) 12:44:29.59ID:+BU32a3i0
最近はCMakeを使うのが普通なの?
GNU Make覚える必要があるかな

話変わるけど、MakeFileってソース1つ追加するたびに、変更する必要がある?
199デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 13:11:20.22ID:uUtJqX7+0
>>195
すまん、素でボケてたw

しかしこれ構文規則には違反してないぞ
意味論においてvoid*の増分が禁止されているって話で
2017/05/22(月) 13:14:30.22ID:jL5+dSxZ0
>>199
あー コンパイルエラーと言えばよかったかw
2017/05/22(月) 13:14:54.60ID:CEFnqLB20
Makefileを作らなくてもmake出来るケースがある事を最近は知らない奴が多い
202デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 17:02:12.42ID:uUtJqX7+0
cc love.c じゃなく
make love でいい件か?
2017/05/22(月) 19:00:44.22ID:J9ejs7e9M
makeのデフォルトルールだね
.c.o はよく使う
204デフォルトの名無しさん (ブーイモ MMea-ysFl)
垢版 |
2017/05/22(月) 19:41:32.06ID:h9CxmUP8M
>>201
まじか、知らなかった
2017/05/22(月) 19:45:14.71ID:yWHDUG7V0
作って覚えるVisual C#のようなゴールを設定して色々学ぶC言語の書籍はありますか?
206デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 20:02:28.46ID:uUtJqX7+0
便利にゃ違いないけど
ロクに指示も与えずよきに計らえってスタンスで
何が出来てくるのかに受動的でいることに
俺は我慢できないな

無関心な大将を有能な部下がフォローして事なきを得たってことだろ
207デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 20:02:58.11ID:uUtJqX7+0
だからスタックサイズのデフォも知らない馬鹿が大量発生するわけだし
2017/05/22(月) 20:03:31.72ID:Zgh5eQVH0
>>195
(void *)c++ は1だけインクリメントされる,c99 では規格で決まっている
2017/05/22(月) 20:04:10.12ID:Zgh5eQVH0
>>199
>意味論においてvoid*の増分が禁止されているって話で
そんな決まりはない,void * のインクリメントは正確に1だ
2017/05/22(月) 20:15:17.89ID:5FlvGyv/0
*vがsize分確保されてないんじゃね?
普通こうだよな
void f(void ** v, int size, void * x)
2017/05/22(月) 20:16:31.52ID:2o5iWMtc0
>>208
しらなんだ C99 からなのかね
2017/05/22(月) 21:22:47.69ID:d/63nSXI0
voidがサイズ持ってるとか無理やり過ぎ
便利だけど
2017/05/22(月) 21:22:49.29ID:lKEcPOEA0
>>208,209
うそつき
2017/05/22(月) 21:31:07.71ID:oluY6epY0
1になるのはgcc拡張だろ
215デフォルトの名無しさん (ワッチョイ 9e0d-Yh7p)
垢版 |
2017/05/22(月) 21:42:16.48ID:uUtJqX7+0
そういうオチか
ばかたれぃっ!!
2017/05/22(月) 23:25:56.35ID:klirxPDR0
息をするように嘘をつかれた
2017/05/23(火) 06:44:54.44ID:a7cn3COJ0
>>214
C99 からガチで
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規格違反ではない。
2017/05/23(火) 09:33:11.13ID:6xCmSTo3M
>>218
「void はサイズ1だけど、sizeof するなよ」ってことじゃね?

「適用してはならない」が何なのかわからんけど。
2017/05/23(火) 09:47:33.99ID:Mt8tSRb/M
>>219
サイズ1ってどこからわかるの?
2017/05/23(火) 11:13:27.58ID:ufwaINxg0
ウンコQz得意の炎上学習法か
とっとと死ねよ
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.)
2017/05/23(火) 11:31:22.03ID:YiZYoA3+0
規格のどこかにあったはず
2017/05/23(火) 11:45:51.13ID:ENsR+rXL0
おいQZ都合悪くなったら自演で叩きかよ
おまえもうム板に向いてないから一人でコードオナニーしてろよ
2017/05/23(火) 12:35:42.70ID:F0rvxaiH0
この件、過去に私が書いたコードを元に議論されたんだよね、当時の書き込みが見つからない…

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

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

というのだから

>>222
当然、(char *)++ と (void *)++ は同じだよね
2017/05/23(火) 12:37:05.33ID:F0rvxaiH0
>>255 = >>256
2017/05/23(火) 12:38:56.50ID:fCVURflQ0
配置アドレスのアライメント要求が等しいのと
アドレスの算術演算で同じ結果になるのは別じゃ?
2017/05/23(火) 12:50:27.27ID:ufwaINxg0
このバカは
https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/Pointer-Arith.html#Pointer-Arith
すら読まずに、C99 からガチでキリッ
とか言ってんのか
死ね死ね死ね今すぐ死ね
2017/05/23(火) 12:57:12.80ID:fCVURflQ0
ideone の C99 でも(同じwarninngで)文句言ってるな
https://ideone.com/fDNXlH
2017/05/23(火) 13:03:46.65ID:BTD2Lf690
>>225
「同じ表現及び同じ境界調整要求」と同じ演算ができるかは別の話だ。
const変数は非const変数と「同じ表現及び同じ境界調整要求」だが変更できない。

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

> 6.5.6 加減演算子
> 制約 加算の場合,両オペランドが算術型をもつか,又は一方のオペランドがオブジェクト型への
> ポインタで,もう一方のオペランドの型が整数型でなければならない。(増分は 1 の加算に等しい)
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]
2017/05/23(火) 17:10:14.54ID:ENsR+rXL0
QZ怒りの暴走
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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