C言語なら俺に聞け 143

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 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
246デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
垢版 |
2017/11/11(土) 15:25:23.65ID:cTWJmMx00
8bitマイコンみたいなやつだと説明は少し楽になるな。メモリ空間が64KBしかないし。
まあ昔はそれでもバンク切り替えして沢山メモリ使えるようにしていたが、考える上では楽だ。
今はメモリ空間も広大になってメモリブロック切り替えてアドレス変わるのは当たり前だったりして説明が面倒だ。
2017/11/11(土) 15:28:20.12ID:ljWP0iHz0
>>245
debug.exe ですね
2017/11/11(土) 17:00:50.95ID:6HxAQryE0
MON
*■
2017/11/11(土) 17:08:09.72ID:HnFKgro40
おじいちゃん・・・
2017/11/11(土) 17:25:03.39ID:TdmokUpS0
>>246
初心者相手なら論理アドレスで説明すればいいだけ
アドレス変換とかの説明はもっと後でいいだろ
2017/11/11(土) 18:27:36.19ID:2S6WQY7h0
&h■
2017/11/11(土) 18:34:58.95ID:tdhPifsQM
CALL -151
253デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
垢版 |
2017/11/11(土) 19:57:56.44ID:Hv/PaJUT0
>>252
懐い...
254デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/11(土) 23:12:19.01ID:4HyMUlDc0
CASL→C→Java→C++の順でどうぞ。
255デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
垢版 |
2017/11/12(日) 02:33:10.79ID:0YSprajH0
>>252
な、なぜそれを知っているw
256デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
垢版 |
2017/11/12(日) 05:22:01.75ID:yBBP+7vl0
SWEET16
2017/11/12(日) 06:32:07.24ID:61B/9ygA0
ポインタの前にアドレスが理解できないってどういうことよ…
アドレス=メモリ上の位置、だよ
例えば64kbのメモリを積んだ機械ならアドレスの全範囲は0x0000〜0xffffだが
そんなこと気にしなくても使えるようにしたから高級言語なのよ

int a;
int *pa;
としたとき、コンパイラはaとpaそれぞれを上記範囲の"どこか"に割り当てる
その"どこか"をaやpaという名前で呼ぶことにするよ、という宣言だから

ただし「変数は"どこか"のアドレスの別名である」ということを"利用"することはできる
pa = &a;
とすれば、paには「aの実際の場所(=アドレス)」が入り
*pa = 123;
とすれば、paが現在指しているアドレス、即ち「aの実際の場所」に123が入る
258デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 10:09:12.41ID:H0u2BwIs0
お前らが箱とか部屋とか変なこと言いだすから初学者が混乱するんだろ。
259デフォルトの名無しさん (ワッチョイ 7fa2-Ud84)
垢版 |
2017/11/12(日) 10:18:34.45ID:pV+DiiLQ0
変じゃない説明よろしく
260デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 10:24:13.57ID:H0u2BwIs0
CASLが基本。
261デフォルトの名無しさん (ワッチョイ 5fd2-cd7v)
垢版 |
2017/11/12(日) 10:34:03.82ID:534592TW0
ニモニック表片手にハンドアセンブルしてみろ
そうすりゃアセンブラやコンパイラがなにしてるか
馬鹿でもない限りいろいろ分かる
2017/11/12(日) 11:18:13.17ID:JQDoPKa1a
自分は二重ポインタってのが分からないです
アドレスの入るアドレスがあるなら
アドレスの入るアドレスの入るアドレスもあるんですか?
263デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:23:06.41ID:H0u2BwIs0
アドレスにアドレスは入らないだろ。
264デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:28:32.94ID:H0u2BwIs0
アドレスを記録位置と言い換えてみたらどうだろうか。
265デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:30:59.32ID:H0u2BwIs0
メモリーを記録装置、メモリー上のバイトを記録素子、アドレスを記録位置。
どうだい。
2017/11/12(日) 11:32:35.21ID:StX7DGK40
変数の位置(アドレス)を示す変数 = ポインタ
そいつ自体も変数だからアドレスを持ってるしポインタも持てる
267デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:33:44.56ID:H0u2BwIs0
記録位置の入った素子の位置が入った記録素子。
これなら有りえるとすぐわかる。
268デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:35:10.76ID:H0u2BwIs0
>>266
ポインタはアドレスではない。
269デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:40:26.83ID:V8vWJYoP0
物理的な描像にするな。
論理的な本質部分を説明しろ。
270デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:41:52.30ID:H0u2BwIs0
Cから物理を取り除いたら役に立たない古代文明。
271デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:43:40.40ID:V8vWJYoP0
ハートは抽象的モデル化しろ。
272デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:44:09.30ID:V8vWJYoP0
x ハート o ハード
273デフォルトの名無しさん (ワッチョイ 7f87-ckd2)
垢版 |
2017/11/12(日) 14:48:35.92ID:w0XJ4hAE0
>>265
メモリー上の位置でいいんじゃね?
これがイメージできなきゃ無理
2017/11/12(日) 14:50:03.54ID:BnEu6Dc30
C使う以上、物理的な概念から逃れる事は不可能。
2017/11/12(日) 14:54:31.77ID:MOg5phwx0
>>262
ある
3重でも4重でもいくらでも
一般的に使うのは2重までだが
2017/11/12(日) 15:11:05.31ID:61B/9ygA0
○重ポインタという言葉はあまりオススメしない
いくら重ねようが「〜へのポインタ」だ

int a = 123;
int *pa = &a; /* 「int型」へのポインタpa */
int **ppa = &pa; /* 「int型へのポインタ」へのポインタppa */
int ***pppa = &ppa; /* 「int型へのポインタへのポインタ」へのポインタpppa */

参照のイメージ([アドレス][値])
[a][123]
[pa][&a] -> [a][123]
[ppa][&pa] -> [pa][&a] -> [a][123]
[pppa][&ppa] -> [ppa][&pa] -> [pa][&a] -> [a][123]
277デフォルトの名無しさん (ワッチョイ 5f9f-/Aoa)
垢版 |
2017/11/12(日) 17:57:06.14ID:dvIcUwwY0
確かにポインタは2重以上はなるべく使いたくないな。混乱するし。
278デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
垢版 |
2017/11/12(日) 18:01:39.60ID:C1sLEmf00
そうだなポインタを文字列の格納だけに使うならアドレスは関係ない
int型で変数を操作するとかなら話は別だけどな
279デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:02:47.18ID:H0u2BwIs0
二重以上には二重も入るのだが、本当にそれでいいのか?
2017/11/12(日) 18:05:10.12ID:5J9eZD000
二重ポインタって言い方が紛らわしい
「ポインタが二重」って意味が通じない。
もともとは * が2つ付いてることを二重って言ってるんだろうけど
281デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:20:47.35ID:H0u2BwIs0
ポインタは型ではないので、二重のポインタという言い方はあり得るのではないか。
2017/11/12(日) 18:22:14.17ID:VcNgV3aF0
ポインタの配列 配列のポインタ ポインタのポインタ
2017/11/12(日) 18:25:05.93ID:MOg5phwx0
>>279
「なるべく使いたくない」だからいいんじゃね
2017/11/12(日) 18:25:48.95ID:ppEJgx+i0
三重以上のポインタって実際に使われているの?
285デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:25:59.93ID:H0u2BwIs0
int型へのポインタに対するchar型へのポインタとかあるのなら紛らわしいという主張も理解できるが。
そんなものは無いので。
***を三重のポインタというのは合理的に見える。
どうだい。
2017/11/12(日) 18:28:26.99ID:ppEJgx+i0
int型へのポインタ型へのポインタ
char型へのポインタ型へのポインタ
2017/11/12(日) 18:28:46.98ID:5fy9hb990
>>284
15年前大学で4重ポインタの地獄を目にした
2017/11/12(日) 18:30:54.73ID:ppEJgx+i0
>>287
型宣言の読解が試験にでたとか?
2017/11/12(日) 18:36:30.86ID:Va1KoPXV0
>>284
http://mevius.2ch.net/test/read.cgi/tech/1434079972/26
2017/11/12(日) 18:36:50.26ID:5fy9hb990
>>288
研究課題で先輩が作ったライブラリのプログラム
それを使って成果を出すのが自分の卒論…
2017/11/12(日) 18:42:31.96ID:VcNgV3aF0
3次元配列を生成して引数に書き戻すような構造なのか
4次元配列を生成して戻すようなのか
各次元で大きさが固定なら 1次元配列にして 添え字演算で4次元にしちゃうな
2017/11/12(日) 19:35:51.01ID:BnEu6Dc30
リスト構造とかツリー構造とか、繋げたり外したりすんのに使うよな?
2017/11/12(日) 19:57:25.27ID:MOg5phwx0
>>292
でも2重までじゃね?
294デフォルトの名無しさん (ワッチョイ 5f9f-/Aoa)
垢版 |
2017/11/12(日) 20:33:06.12ID:0YSprajH0
>>280
階層の方が良いか?
2017/11/12(日) 21:04:53.38ID:RBwKcf3Fa
x,y,z座標表すのにint***を使ったことがある
2017/11/12(日) 22:25:07.93ID:Q7xN5Euu0
2重以上になりそうなときは構造体にまとめちゃうからなぁ。
2017/11/12(日) 22:26:52.43ID:5J9eZD000
>>294
多分、階層の方がわかりやすいだろうね

int ***p; というポインタ変数pで p[x][y][z] とすると、
*(*(*(p + x) + y) + z)
を参照する。このあたりを分かりやすく言えるといいんだけど
2017/11/13(月) 00:06:28.13ID:NsFkY9mQ0
同一ファイル内の関数を単体で自動化テスト出来る何かスマートな方法はないものか
他のテスト周りで小回りが効く言語と比べると単体テストがお辛い
2017/11/13(月) 00:11:14.56ID:GVKu0VVYd
>>298
惜しい。C++だったら、コンストラクタでオートメーションできるのに。
2017/11/13(月) 05:48:49.26ID:m7i5EnEm0
テストコードを入れておくしかない。
2017/11/13(月) 14:10:14.51ID:oBHzUCYz0
>>295
三次元扱うと***pくらい何て事無いよね
2017/11/13(月) 14:21:03.70ID:M4Fu1SNu0
構造体のメンバーの構造体のメンバーの構造体のメンバーのつもりで
ポインタのポインタのポインタとかいい気になって使ってたら、
エクセプションの嵐でワラタw
2017/11/13(月) 14:23:47.67ID:rCuenLSS0
正しい指し先を格納してるかはコードの書いた奴の責任だからね
言語で保障してくれない
304デフォルトの名無しさん (スッップ Sd9f-6mXn)
垢版 |
2017/11/13(月) 14:41:15.42ID:xUyRVn+md
有名な言葉思い出した。
プログラムは意図した通りには動かない、
書いた通りに動く。
2017/11/13(月) 15:23:54.44ID:U+8SrSdXM
ハードがまともに動いている前提でな。
タイマーLSIにall0ぶち込むなんてのはどこのマニュアルにも
書いてないバッドノウハウだろうに
2017/11/13(月) 16:47:57.07ID:bTqh5JwP0
>>298
google testとかcpp testとか使えば?
307デフォルトの名無しさん (ワッチョイ 7f6e-TYjb)
垢版 |
2017/11/14(火) 05:34:12.35ID:Qlty8abH0
三次元配列を扱うのに三重ポインタが出てくると思っている池沼がいるな
2017/11/14(火) 09:52:35.71ID:1+/iXMbtp
まあ、Cは次元とかオフセット計算が掛け算になるだけだからな。
何次元にしようとリニアな配列のままさ。
2017/11/14(火) 09:54:58.20ID:1+/iXMbtp
俺はポインタを諦めて、構造体配列のインデックスでリンクするリスト構造を作ったわ。
310デフォルトの名無しさん (ワッチョイ ffe7-y/Ph)
垢版 |
2017/11/14(火) 17:36:47.28ID:ijEEO/Co0
誰かが書いてあって気になったんだけど
double a;
scanf("%if", &a);
ってf単体じゃないの?
311デフォルトの名無しさん (ワッチョイ 7fa2-Ud84)
垢版 |
2017/11/14(火) 17:46:40.44ID:CqmbHxm/0
%lfじゃなくて?
312デフォルトの名無しさん (ワッチョイ ffe7-y/Ph)
垢版 |
2017/11/14(火) 18:28:10.04ID:ijEEO/Co0
>>311
間違えたそれだ
2017/11/14(火) 18:42:01.06ID:fdj+YHIz0
long double は別物として実装していない?
2017/11/14(火) 18:56:38.89ID:Qnc8WtYFd
scanfでは、floatが%fで、doubleが%lfだ。printfでは区別がない。
2017/11/14(火) 19:35:59.33ID:ZWJmr3O/0
cでUTF-8のファイル読み書きとデータの取り扱い方が分からないです
もしかしてできないのかな?
316デフォルトの名無しさん (ワッチョイ 5f76-Ud84)
垢版 |
2017/11/14(火) 19:57:38.61ID:mdecs3M50
調べるとすぐにwikipediaが出てきたよ
https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%96%87%E5%AD%97%E3%81%A8%E6%96%87%E5%AD%97%E5%88%97#Unicode.E6.96.87.E5.AD.97.E3.82.BB.E3.83.83.E3.83.88

文字を「L"」で囲むとその文字を表現するワイド文字型の数値となる
Unicode文字セットでは、標準ライブラリの関数を使う前にロケール(地域)を設定する必要があり、また、Unicode用の関数を使う必要もある
// wchar_t型
wchar_t wc = L'a';     // wchar_t型の変数wcに文字L'a'を格納
_wsetlocale(LC_ALL, L""); // ロケール(地域)を設定する
wprintf(L"変数wcに格納された文字は%c", wc); //wcを文字として表示
wprintf(L"変数wcに格納された数値は%4x", wc); //wcを数値として表示
2017/11/14(火) 20:29:12.24ID:1+/iXMbtp
だから、文字セットはライブラリの範疇だからC言語スレで聞くなよ。
おまえが使ってるコンパイラのスレにでも行け。
2017/11/14(火) 20:29:48.26ID:M89KBFlu0
何したいかによるんじゃね

素でもそれなりには扱えるし、不十分ならライブラリ探してもいい
どうしても無理なら慣れた文字コードに変換すればいいけど、こっちは一部文字情報が欠落するかもね
2017/11/14(火) 20:58:01.97ID:ZWJmr3O/0
>>316
ありがたい
なんとかなりそう
320デフォルトの名無しさん (ワッチョイ 5f02-TYjb)
垢版 |
2017/11/15(水) 06:11:40.94ID:1fEpam2j0
「配列へのポインタ」で嘘教えてるクソサイト
2017/11/15(水) 08:01:18.30ID:2LyFVpmC0
エンコーディングにかかわらず、ただのバイト列だからchar*でいい
322ビル・ジョブス (ワッチョイ 5fb3-bJtK)
垢版 |
2017/11/15(水) 09:06:23.81ID:sfEUfVZe0
配列名は変更できない左辺値
323デフォルトの名無しさん (ワッチョイ 5f8a-gxuN)
垢版 |
2017/11/15(水) 10:37:31.14ID:Iv8iuDMF0
次のC規格でそろそろ文字を扱う関数全てunsigned charに変更してくれないかな
utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
賢明なプログラマならcharなどというプリミティブ型をそのままの名前で使わずちゃんと
typedef char str_t;
とかしてるはずだし、してない愚者はもうシステムもろとも切り捨てていいだろう
-1が欲しいために結局intに拡張されるんだからcharの時点では符号は不要なんだよ
2017/11/15(水) 10:45:30.80ID:5eRwFnaIp
C#みたいにbyte型作れば?
それかマルチバイト型
2017/11/15(水) 18:45:36.23ID:/fqUZ3V60
>>323
ハゲドゥ
2017/11/15(水) 20:52:19.99ID:edi6IXQo0
>utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる

いまどきそういうencoding依存のコードをそんなに頻繁に書いているんだとしたら
それ自体が不毛な気も。
327デフォルトの名無しさん (アウアウアー Sa16-0x9U)
垢版 |
2017/11/16(木) 10:46:07.94ID:QxSeP1oQa
なんのために皆cやってるん?
2017/11/16(木) 10:47:45.24ID:sipg0WT3p
生活の為だ。
2017/11/16(木) 12:40:47.00ID:jvRl/N31M
文句たれてる暇があるなら1バイト目判定関数でもつくれば
2017/11/16(木) 16:46:03.46ID:ExCdIANwa
ファイルサイズ測定

そのファイルサイズ領域を動的確保

そこにutf-8の文字列を順次格納

みたいなプログラム組んでるんだけど

ファイルサイズ/sizeof(wchar_t)と中身の文字の数って等しくないの?
2017/11/16(木) 16:52:10.55ID:1Qzf60whd
UTF-8をそのまま扱うんなら、/sizeof(char)じゃね?
UTF-16やUTF-32に変換したならデータサイズが違うけど。
2017/11/16(木) 16:54:06.14ID:Gq05ZlN50
UTF-8 は データサイズから文字数を求めることはできない
2017/11/16(木) 17:01:45.21ID:FIH9Q68l0
やっぱり1文字づつ読み込んでって文字数カウントするしかないか
2017/11/16(木) 17:06:37.43ID:Gq05ZlN50
>>333
記憶するのに必要なメモリの量は読み込んだバイト数でいいけど
「1文字に要するバイト数が可変」なので
「文字数」をカウントするとなるとそうせざるを得ないね
2017/11/16(木) 17:15:42.23ID:FIH9Q68l0
>>334
そうします
336デフォルトの名無しさん (ワッチョイ 86e7-0Cia)
垢版 |
2017/11/16(木) 17:29:40.48ID:NqJtZOMo0
暇つぶしで気になったんだけどC言語でもOSは作れるだよな、でも制御とかでコンピューターをちゃんと理解してないとやっぱ作れない?
2017/11/16(木) 17:45:35.36ID:1Qzf60whd
FreeDOS、Linux、ReactOSなどのオープンソースなOSは、ソースが見られるから参考にするといい。
例えば、OSで並列処理をしたい場合は実際のCPUの知識が必要になるし、OSをCD-ROMからインストールしたい場合は、CD-ROMのファイルシステムの知識が必要になる。
OSを便利にしたいなら、それなりの知識が必要になるのさ。
2017/11/16(木) 17:50:48.01ID:1Qzf60whd
モダンなOSは巨大化・複雑化しているから、一人ですべてを把握するのは難しい。
必要な機能を分割統治して、ライブラリなどによってブラックボックスとして実装するのが一般的。
2017/11/16(木) 18:09:46.26ID:j+aaxsF+0
>>336
OS自作入門とかいうそのものズバリな本があるよ
勉強目的なら割りとオススメ
2017/11/16(木) 18:10:16.42ID:NJ9DPXHtM
モダンでなくても、C単体ではシステムコールとCPUステータスに
関わる部分が書けないので、100%は不可能。
asm文とか使うなら別だけど。
2017/11/16(木) 18:10:19.85ID:++5Qg6gN0
なお、OSで商売したいなら、著作権のトラブルをクリアしないといけない。
マイクロソフトやグーグルのようにOSを売るのは至難の技だ。
2017/11/16(木) 18:29:05.66ID:1Qzf60whd
パソコン向けじゃなければ、日本企業でもOSを開発しているところはある。
どんなOSを開発したい?
2017/11/16(木) 18:42:10.01ID:lNSovIGo0
OS劇場っぽいやつ
2017/11/16(木) 20:19:28.30ID:FIH9Q68l0
あとメモリ上に読み込んだバイナリデータをwchar_tの文字列に変換することは可能でしょうか?
345デフォルトの名無しさん (ワッチョイ 86e7-0Cia)
垢版 |
2017/11/16(木) 20:33:55.78ID:NqJtZOMo0
ただC言語の本にアセンブリ言語またC言語でもOS作成可能ってあったから気になっただけ
他の言語もコンパイルして機械語にするからC言語も間接的な言語しかないのかなって疑問に思っただけ
■ このスレッドは過去ログ倉庫に格納されています