X



C言語なら俺に聞け 143
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん (ワッチョイ b375-rVGZ)
垢版 |
2017/10/27(金) 21:28:08.20ID:pAogLeJi0
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/

前スレ
C言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0895デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/16(土) 05:42:42.76ID:V7dZrSJp0
1点、気になるのがNULLと書いていたことだ
0番地にアクセスすることを意図しているコードは
struct hoge *tmp = NULL; ではなく
struct hoge *tmp = (struct hoge *)0; と書くだろう
思うに、単にtmpへの代入を忘れただけではないか?
そういうポカミスを多発するどんくさいやつほど
「変数は必ず初期化」に固執する
0897デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
垢版 |
2017/12/16(土) 08:59:26.34ID:TBmZZU6f0
>>893
ゆとり死ね
韓国人死ね

俺が読めといっているのは>>884のことだ馬鹿タレ
どうせお前らは日本語が不自由で3行以上は読めないから意味が分からないのだろうが
お前らが迷惑行為を働くことに対して俺はキレてるんだよ


>>895
環境によってはwarningが出る。VC++とか。
個人的には意味ないとも思うが。
0908デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/16(土) 14:30:30.83ID:+Cq6iaDY0
>>906
つまりこうであると。

#include <stdio.h>

int main(int argc, char *argv[])
{
 int i, j;
 for (i = 0; i < 2; i++) {
  for (j = 0; j < 2; j++)
   fputs("おっぱい", stdout);
  for (j = 0; j < 2; j++)
   fputs("ぽよん", stdout);
  putchar('\n');
 }
 return 0;
}
0909デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/16(土) 14:32:07.96ID:+Cq6iaDY0
そういや古いソースには char *p なのに if (*p == NULL) みたいに書いてあるのがあって、今時のコンパイラだと警告出しまくりになるんだよなあ。
0910片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/16(土) 15:55:35.27ID:2NfYNG63d
>>908
こう書いてもいいね。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
if (i % 4 < 2) fputs("おっぱい", stdout);
else fputs("ぽよん", stdout);
if (i % 4 == 3) putchar('\n');
}
return 0;
}
0913デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/16(土) 17:23:42.81ID:+Cq6iaDY0
>>910
なるほど。

ちょっと変形してビット演算でも行けるな。

#include <stdio.h>
int main(void) {
 int i;
 for (i = 0; i < 8; i++) {
  fputs(i & 2 ? "ぽよん" : "おっぱい", stdout);
  if ((i & 3) == 3) putchar('\n');
 }
 return 0;
}
0914デフォルトの名無しさん (ワッチョイ 92e1-kSiG)
垢版 |
2017/12/16(土) 19:24:56.53ID:lAe10LAt0
#include <stdio.h>
#include <stdlib.h>
void o(){ fputs("おっぱい", stdout); }
void p(){ fputs("ぽよん", stdout); }
void r(){ puts(""); }
void e(){ exit(0); }
void (*a[])() = { o,o,p,p,r,o,o,p,p,r,e };
int main(){ void (**x)()=a; while(1) (*x++)(); }
0915デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/16(土) 20:18:31.50ID:ftZRkd7o0
>>877
>struct hoge *tmp = (struct hoge *)0; と書くだろう

このように書いても*正しく*NULLポインタが代入される
char zero[(struct hoge *)] = {0};
memcpy(tmp, zero, sizeof zero);
としないとダメ

逆によく見かけるポインタを含む構造体をmemcpyで0に初期化するのも正しく無い
0916デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/16(土) 20:46:52.08ID:V7dZrSJp0
>>915
それがわからんやつが、ここに、いや世界にいると思っているのか?
俺のはコードに意図を残すという論旨だったが、それがわからんやつがおまえさんか

ア ホ か
0917デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/16(土) 21:04:20.92ID:ftZRkd7o0
意図を残すために間違ったコードを書くとは理解に苦しむ
コメントで残した方が数百倍マシ
0918デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/16(土) 21:54:17.26ID:V7dZrSJp0
ほほう、どう間違ったと言うのかね?
0922デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/17(日) 04:55:34.79ID:vowUucL80
>>919
>>895と間違えてたな

>>921
memcpy(&tmp, zero, sizeof zero);
こうだね
0925デフォルトの名無しさん (ワッチョイ ef9f-v37J)
垢版 |
2017/12/19(火) 08:30:52.67ID:SEIe84in0
お、収まったか・・・
0926デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/19(火) 21:03:25.54ID:6p/5Z93J0
完全初心者です。文字列の性質について質問させてもらいます。

柴田望洋著 「ポインタ完全攻略」という書籍にて次のような内容の記載があります。

・文字列リテラルは変数ではないが記憶域を占有する
・文字列リテラルはcharの配列である

そして次のページに、
・このような文字列リテラルは、整数にいいかえると「定数」に相当するものであるから、自由に取り扱うためには
 変数に格納する必要性がある
・そこで利用されるのがcharの配列である

ここでわかりかねるのが、文字列リテラルというのはそもそも定義自体が「charの配列」であるはずなのに、
これをまた「charの配列」に格納するの??と、疑問に思ってしまったわけです。

これはいったいどういうことでしょうか。
0928片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/19(火) 21:18:36.23ID:3xf/peDqd
"This is C string literal."
これが文字列リテラルね。参照すると文字列定数になる。
char s[] = "This is character array.";
これが文字の配列の変数sの宣言と初期化ね。sはヌル文字を含めた文字列データ先頭を参照する。sizeof(s)は、ヌル文字を含めたデータのサイズになる。
const char *p = "This is pointer to characters.";
これは文字列の先頭へのポインタになる。サイズはアドレスのサイズ。データは変更できない。
0929 ◆QZaw55cn4c (ワッチョイ b260-4mDj)
垢版 |
2017/12/19(火) 21:19:44.32ID:U2jplJ2K0
>>926
ちょっと進んだ知識になるのですが。

プログラムがコンパイルされたのち、プログラムの実行の段階にはいったとき、コードや変数領域やその他もろもろがメモリ上に展開されるわけですが、
文字リテラルは、場合によってはメモリ上の書き込み不可能の場所に置かれます。たとえば ROM メモリとか。
もし、その文字リテラルを適宜書き換えて使いたいのならば、書き込み可能な場所にコピーして使うでしょう、それが、変数であり配列でありするわけです。

ただし文字リテラルを書き換えることが可能な環境では、それを見越して、文字リテラルを書き換えて対応する、という手がないわけではありません。
まあ一般的には行儀が悪いと思われています。それに文字リテラルを途中で長くしたい、とかは不可能ですし。
0930デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/19(火) 21:21:47.79ID:MoA6J0CR0
>>926
おまえさんが疑問に思っているのはこういうことか?
puts("aho"); で済むのを、わざわざ
static const char array[] = "aho";
puts(array); としなければならないのかと
0932デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/19(火) 22:51:39.70ID:6p/5Z93J0
>>927
>>928
>>929
>>930
>>931

みなさんお騒がせいたしました。みなさんから頂いたアドバイスを参考にさせていただいて、
よく考えてみたところ、あまり深く気にするべきではないように感じてきました。
先ほどの本の「配列による文字列」「ポインタによる文字列」という箇所を読み込んだところ、
「配列による文字列」はcharの配列を宣言して文字列を用いる場合で、「ポインタによる文字列」
は「char p* = "ABC"」のように、ポインタchar *を宣言してなんらかの文字列リテラルで初期化する
手法であるとのことです。

おそらく・・・よくわかりませんが、直観的に私が当初感じていた疑問点というのはここら辺の部分に帰結
する話だと思われます。

現段階での私の理解
・文字列はそもそも配列?などということは気にしなくてもよい。
・文字列を配列charに格納してからポインタで操作する方法がある。この場合は当然配列の規則に従う
 ので代入とかはできない
・char * = "ABC" のようにchar[]を宣言せずに文字列をポインタで操作する方法もあり。
 この場合は p = "SEX" のような代入ができる。
0934デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/19(火) 23:01:45.80ID:6p/5Z93J0
>>933
const
中身を変えられないとかいう…。
ありがとうございます。勉強になります。
0935デフォルトの名無しさん (ワッチョイ 1680-zkGJ)
垢版 |
2017/12/19(火) 23:37:54.35ID:jfHXMkXp0
immutable・不変かどうかの区別。
不変オブジェクトは、メモリ内の読み込み専用エリアに置けるので、最適化しやすいから、
できる限り、不変が望ましい

Ruby, JavaScript では、文字列は可変オブジェクトだが、freeze すると更新できない

s = "hello"
s.freeze

よく覚えていないけど、この本が良かった気がする。
詳説 Cポインタ、オライリー、2013
0936デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/19(火) 23:44:08.13ID:SEIe84in0
char *s = "abc";
と初期化した場合は
s[1] = '\0';
のようなことをすると Segmentation fault になったが、
char s[] = "abc";
の場合は
s[1] = '\0';
が問題なくできた。その後 puts(s) をすると a だけが出た。
OS は Linux でコンパイラは gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) だ。
-S でアセンブラの出力をさせるとどちらも "abc" をリードオンリーの領域に配置させているが
char s[] と書いた場合は関数の初めでスタックに領域を確保してそこにコピーしてからアクセスしていた。
char *s の方は単に先頭アドレスを使うようになるだけ。(そしてリードオンリーの領域に書いて死亡)。

man gcc を見ると -traditional や -fwritable-strings で文字列リテラルに書き込めるようにできるとは
書いてあるが、この man page 自体が古く、4.8.5 では既にこのオプションは使えなくなっていた。
0937デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
垢版 |
2017/12/20(水) 00:00:34.09ID:FD+Ux1Ht0
>>932
> 現段階での私の理解
だいぶ間違っているが、ド初心者ならあまり細かく考えずに進めてもいい。
(プログラミング自体の初心者なら、最初の段階で重要なのはそこではないから)
キッチリやりたいのなら、メモリを確認しながら進めた方がいい。
IDE等使えば簡単に見えるし、何を間違っているかすぐに理解できると思う。


>>935
JavaScriptのstringはインミュータブルだ馬鹿タレ
0938デフォルトの名無しさん (ワッチョイ 92e3-4pIx)
垢版 |
2017/12/20(水) 01:15:20.03ID:52iYTq0Y0
>>932
よく言われることだけど、cに文字列型はない
cで文字列という時は必ず文字の配列のこと

char * p = "ABC";

char x[] = { 'A', 'B', 'C', 0};
char * p = x;
って書くのを少し楽に書けるようにしてくれてるだけ

プログラミング自体の初心者なら、cで文字列を扱うこと自体を後回しにした方がいいと思う
0939デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 06:46:09.98ID:63AN+5MK0
> cで文字列を扱うこと自体を後回し

俺もそう思う
ど初心者にはちとキツい
0942デフォルトの名無しさん (ワッチョイ 92a6-ak+6)
垢版 |
2017/12/20(水) 09:01:12.50ID:RLul2dZl0
const教は良い教義だと思うけどな。
0945デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 10:35:07.90ID:63AN+5MK0
C++にconstexprがあるのはconstの設計ミス
0946デフォルトの名無しさん (ササクッテロレ Spc7-e1v7)
垢版 |
2017/12/20(水) 11:33:29.38ID:9SrStGF7p
>>944
いや、const無くても文字リテラル自身はROMに書かれてるんだけど、デフォルトはそれをわざわざ初期化の時にRAMに展開して書き換えられてもいいように準備して待ってるんだよな。
それがもったないからconst付けるんだ。
0947デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
垢版 |
2017/12/20(水) 11:48:57.84ID:g9yiCifSa
>>946
ところが chrar * 変数に対する初期化に文字列リテラル使うと>>936のようにエラーも警告も出さずにコンパイルが成功してリードオンリーの領域に書き込みアクセスするプログラムができてしまうと。
0949デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 13:49:50.09ID:63AN+5MK0
constつーか__attribute__((section(".rodata")))だろ
0950デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/20(水) 20:21:08.31ID:ap2qT8fO0
>>932です。
みなさんありがとうございます。
C言語では文字列を扱うのは難しいようですね。
しかし使うだけであれば「なんとなく感覚的」に可能か?と思われます。

ところで、ネットや本でC言語の難所はポインタだ!とよく書いてますが、この文字列の部分というは正に
ややこしい部分ではないでしょうか?
ポインタと配列の関係性の理解だけでも一山あります。
それが文字列となると、ポインタ+配列+文字列の知識の理解、となってしまって。
構造体を勉強するのが先でしょうか。
0951片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/20(水) 20:43:26.94ID:hN2yOtWhd
>>950
この程度で難しいというなら、あきらめてJavaに行った方が身のためだ。
plain Cは時代遅れで、そのまま使うとセキュリティに穴があるシステムを量産してしまう。
Cはロボットにまかせて、人間はC++みたいな高度なプログラムを使うことが望ましい。
0952デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 20:47:28.16ID:63AN+5MK0
>>951
それを言うなら静かに自力で解決するやつ以外すべて足切り点未満だろ
plain Cで隙だらけのコードを量産するおまえさんが体現しているようにw
0953デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/20(水) 21:24:09.39ID:ap2qT8fO0
>>951
最近プログラミングが騒がれているのでpythonを始めたのですが、どうもプログラミングしてる感
が持てないためC言語をかじりだしたのです。
javaはコードが長そうなので嫌な感じですね。C++はえらく難しいらしいですし...
まあpythonかrubyが普通に使えるくらいになれば十分なのですが...
0955デフォルトの名無しさん (ワッチョイ ffb3-AOQJ)
垢版 |
2017/12/20(水) 21:35:23.89ID:bl+FG2Ud0
余所の芝が青く見えるので、そっちをつまみぐいする進め方は
正直どっちも中途半端に覚えてるつもりになって、実際には道具として使えてない状態に陥りそう
0956 ◆QZaw55cn4c (ワッチョイ b260-4mDj)
垢版 |
2017/12/20(水) 21:41:33.06ID:8hKmNCKf0
>>953
C++ は教育的配慮に欠けていて、自力でなんとかしないといけない部分が多いし、ここ5〜6 年で規格がばたばた改定されたのに教科書が追いついていない
ついでに私もC++11later には追いつけていない(;;)
プログラムしている感は満載なんですけれども。

java は、資格とかもあり教育的な環境が整っているし書籍も多い、言語的な紛れもC++ に比べると少ない、個人的にはお勧めです。
プログラムしている感は、それなりにあると思います。

python 私もやっているんだけれども、つづりミスに悩まされています。なにか、いい支援環境はないものでしょうか?
0961片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/20(水) 22:38:41.88ID:hN2yOtWhd
>>959
地震の原因は、地球内部の核融合反応をエネルギー源とするマントル活動だから、三次元マントルマップを
作って天気予報みたいにスパコンでシミュレーションすればある程度予測可能なはず。
0973デフォルトの名無しさん (ワッチョイ cf81-+obY)
垢版 |
2017/12/21(木) 00:17:01.11ID:HiBe6ryp0
>>968
映画だと、
日本列島の下に沈みこむ海洋プレートが微生物が発生するメタンガスの影響もあって
沈み込み速度をましているため、日本列島が引きずり込まれて「一気呵成」に沈み込む
ことになってます。
0976デフォルトの名無しさん (アウーイモ MM67-yeUS)
垢版 |
2017/12/22(金) 15:34:13.13ID:E+fmptBcM
4つの整数と + - * / を組み合わせて10を作ってその組み合わせを表示する、みたいなプログラムって作れますか?
0978デフォルトの名無しさん (アウーイモ MM67-yeUS)
垢版 |
2017/12/22(金) 16:10:47.49ID:ft9sfOBHM
>>977
ありがとうございます
計算してみたら1536通り?とかで気が遠くなってましたが、頑張ってみます
0979 ◆QZaw55cn4c (ワッチョイ 7f60-IIk+)
垢版 |
2017/12/22(金) 16:13:51.13ID:Zf+4IlSz0
>>961
>地球内部の核融合反応
コアは6000K の液体または固体金属、とのことだが、核融合にまでは至っていないかと思っていた
しかし、ググってみると、重水素の核融合が起こっているという仮説があった
http://www.natureasia.com/ja-jp/srep/abstracts/85904
この融合反応は wikipedia には載っていないなあ…よくわらかないね
0981デフォルトの名無しさん (アウーイモ MM67-yeUS)
垢版 |
2017/12/22(金) 17:16:18.78ID:ft9sfOBHM
演算子入れられる変数とか無いのかなー
0986デフォルトの名無しさん (ワッチョイ cfd7-tRgI)
垢版 |
2017/12/22(金) 20:43:06.61ID:e2HIssEB0
EXEファイル先頭のマジックナンバーだろ
0987デフォルトの名無しさん (アウアウカー Sac7-vdkM)
垢版 |
2017/12/22(金) 20:52:06.42ID:xiD1v8rca
二画面スマホ
0990デフォルトの名無しさん (ワッチョイ 639f-bsML)
垢版 |
2017/12/23(土) 06:03:46.75ID:BUr3nOOf0
まず、カセットテープからBASICを読み込ませます。
0992デフォルトの名無しさん (ワッチョイ f378-tRgI)
垢版 |
2017/12/23(土) 07:11:10.70ID:82L7PCHk0
オブジェクトみたいにもともと多義語だから
レス数が950を超えています。1000を超えると書き込みができなくなります。

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