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
652デフォルトの名無しさん (ワッチョイ 1911-CicO)
垢版 |
2017/06/29(木) 17:10:15.78ID:wGgfLCtF0
***SLAMO***

}

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


---

[[[C%%]]]
}

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

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

/*sub.c*/
int *sub()
{
int b[10];
return b;
}
2017/06/30(金) 01:03:42.29ID:obNwHzFda
mainにbの配列を宣言してsubにポインタを渡し中身を書き換える
もしくは
sub内のbをstatic intにする
2017/06/30(金) 01:17:27.06ID:RtmcppLUM
もしくは
mallocで確保した領域を返し、freeするのは呼び出し元の責任にする
2017/06/30(金) 04:27:36.41ID:8CWbZ/OEd
null pointer
2017/06/30(金) 05:56:01.96ID:sS6ajRjO0
呼び出し元で寿命を管理すべきなので、
mainに int b[10]; と宣言してsubにbのポインタを渡す
2017/06/30(金) 08:37:20.11ID:Zx9hbpt8M
別にどっちで管理してもいい
2017/06/30(金) 09:33:09.99ID:OFeLP1+80
>>654 >>655 >>657
ありがとうございます!!
2017/06/30(金) 09:40:38.20ID:b/sHRIH80
構造体で包んで値返し
typedef struct { int b[10]; } foo_t;
foo_t sub(void) { foo_t a; return a; }
2017/06/30(金) 09:44:31.82ID:RtmcppLUM
>>657
strdup使わない派?
2017/06/30(金) 10:43:50.08ID:12icUynjd
Cでprintfみたいな可変引数関数のラッパー
を可変引数で作りたいです。
コンパイラの実装に依存しない書き方って
有りますか?
2017/06/30(金) 11:24:03.18ID:zIElKXKqH
>>662
それができないからvprintfみたいなラップされる専用の関数ができた
2017/06/30(金) 11:37:38.99ID:12icUynjd
やっぱそうですか、残念。
ターゲットの関数はソース無いし、
vprintfみたいなのは用意されてないです。
2017/06/30(金) 11:51:41.54ID:vgqCM8Lxd
>>656
ガッ
2017/06/30(金) 12:52:04.96ID:X/gd7WZi0
可変引数関数を記述するだけなら stdarg.h で事足りるけど

printf のフォーマット文字列解釈して 文字に置き換える部分を
そのまま利用したいとなると、vsprintf の有無次第だよな・・・
2017/06/30(金) 17:00:50.82ID:sS6ajRjO0
>>661
状況によるけど、malloc/freeはコストが大きいので、使わなくて済むなら使わない
668デフォルトの名無しさん (ワッチョイ 2d6c-ddzC)
垢版 |
2017/06/30(金) 17:07:02.99ID:BBkM2EA10
>>667
コスト高いの?本当に!

高いのはSystem Callのこれじゃぁ?
sbrk/mmap/VirtualAlloc等
2017/06/30(金) 17:27:47.82ID:sS6ajRjO0
>>668
不必要なら避ける癖ついてたなあ
厳密に検証してないが、確保するサイズにもよるけど10%ぐらい違う
しかし関数コールは減らした方がいいのは明らか
2017/06/30(金) 18:45:37.58ID:I/Y6yRYUM
>>668
高い場合がある
と言う方がより正確かと
なので組み込みだと禁止してたり独自のルーチン組み込んでたりする
2017/06/30(金) 20:10:41.26ID:caqhD/Ov0
int b[10]とmallocではmallocの方が常にコストは高いけどな。
前者は最適化無しで1命令、最適化後は0命令。
後者はK&R的軽量実装でも10〜1000命令は必要になる。
10%ってのは他含めてコミコミの計測結果だろ。確保のみなら喧嘩にならん。
2017/06/30(金) 20:23:10.05ID:Hz970lyir
ガベージコレクタだって高コストだしな。自分でメモリを管理するのが一番安いw
2017/06/30(金) 20:33:40.33ID:APIJ3en80
アセンブラ時代思い出すなぁ。
2017/06/30(金) 23:38:17.22ID:yb1eWQ160
コストが高いからalloca()が出来たんだし
2017/07/01(土) 00:12:13.52ID:bUPyefPgM
>>638
もちつけ。おまいださいぜ
2017/07/01(土) 02:56:34.34ID:PLwoIwzod
Windows環境のMINGWです
\nをASCII文字コードにするとASCII表の通り10になりますが、
Windowsの改行コードCR+LFですよね?
UNIX環境ならLFつまり10になるのはわかりますが、何故Windows環境でも10なのでしょうか?
2017/07/01(土) 08:20:28.99ID:PrUYVLVg0
\nをprintしたりした場合に改行になるだけであって、\nが10なのは変わらない。
2017/07/01(土) 08:40:33.80ID:EmOg/tlYd
>>677
ありがとうございます
\nが10になるのはCR+LFでもLFでも同じだということですか?
2017/07/01(土) 13:13:17.56ID:FWbGo/9j0
\nは改行を表しその値は(ASCIIなら)10
printfとかの入出力するときにunixなら何もしないがwindowsではCR+LFと変換する
2017/07/01(土) 14:26:57.37ID:jAe4uSb20
出力先のファイルポインタがクックドモードの時だけ変換される
2017/07/01(土) 15:56:17.04ID:9IpZzPucd
>>679
>>680
ありがとうごぞいます
クックドモードも調べてすっきりしました
2017/07/04(火) 18:08:24.69ID:K9JgJTrT0
[[[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
2017/07/04(火) 23:36:19.93ID:ydrc2aV60
テキストファイルは、CR + LFでも読み込んだらLFだけになる。書き込むときCR + LFになる
バイナリファイルは、そんなことにならない

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

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

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

ただし本当にintになっちまうわけじゃないから
(int)n = n < 0 ? -n : n; みたいに
代入先にしようとするとエラーだ
コンパイラによっては通るのがあるけどそれは非標準
2017/07/06(木) 05:57:41.52ID:pM9IP2NJ0
>>687
ありがとうです!
キャストですね。
size_tからintに一時的な変換ですね。
双方のメモリー上の大きさが違う気がするんですけど、僕の環境でどうなるのか調べてみます。
2017/07/06(木) 08:10:55.85ID:rcg+ZZ7N0
何がしたいコードなのか意味がわからない
2017/07/06(木) 08:12:31.54ID:TeNYF/iwM
nが負になりうるならなんでsize_tで宣言するんだろ
691デフォルトの名無しさん (ワッチョイ 9f8f-gRQY)
垢版 |
2017/07/06(木) 08:30:53.10ID:KLsItAo20
ssize_t が標準に欲しいところだよね。
2017/07/06(木) 08:36:29.39ID:c6kgU9bA0
キャストを覚えろ
キャストしない事を覚えろ
キャストをすこしだけする事を覚えろ
2017/07/06(木) 08:37:13.77ID:kIxohS2+M
>>689-690
単なるサンプルコードだろ
そもそもそのまま実行したら未初期化のnを参照することになるし
2017/07/06(木) 08:41:41.93ID:kIxohS2+M
>>691
sizeof と言うコンパイラ組込演算子の戻り値の型がコンパイラに組み込まれていない違和感
695デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 09:45:19.82ID:CwAIhoRS0
>>694
いや組み込まれているが
それが具体的に何型なのかを
コンパイラの実装者が明らかにせよと
規格が要求しているということだ
2017/07/06(木) 11:03:13.91ID:TUAsW00PH
>>693
出典はここだな。
https://stackoverflow.com/questions/10204471/convert-char-array-to-a-int-number-in-c

問1: この回答者がnの絶対値をとりたくなったときの気持ちを3行で答えよ。
2017/07/06(木) 12:41:49.84ID:kIxohS2+M
>>695
> いや組み込まれているが
「コンパイラ(プリプロセッサじゃなくて)」には組み込まれてないだろ

> それが具体的に何型なのかを
> コンパイラの実装者が明らかにせよと
> 規格が要求しているということだ
だからなに?
698デフォルトの名無しさん (ワッチョイ f76c-QYYo)
垢版 |
2017/07/06(木) 12:58:54.02ID:Ot0nxXPI0
size_tは__darwin_size_tでトドのつまり、unsighed longだって。
2017/07/06(木) 13:20:12.73ID:SSOSMdMWM
>>697
どうであれば組み込まれてることになるの
size_t n がコンパイルできることじゃないんだよね?
2017/07/06(木) 14:53:10.10ID:m/Ia1fy10
>>691
反物質のサイズでも記述する気か?w
701デフォルトの名無しさん (アウアウウー Sa5b-pw7F)
垢版 |
2017/07/06(木) 15:09:30.84ID:F+RVqvnpa
【環境】
CS+ + RX62N + E1エミュレータ
【言語】
C言語

上記にてprintf()でCS+のデバッグウィンドウに出力するにはどうすればいいですか?
2017/07/06(木) 15:37:45.25ID:H/fupZr5d
ここできくないようか?
2017/07/06(木) 15:51:10.46ID:F+RVqvnpa
>>702
printf()ってCの標準関数でしょ?ここでいいのでは?
2017/07/06(木) 16:28:30.82ID:hwRP8VqJ0
ターゲットデバイス上でプログラムを実行するのであって、開発マシン上でプログラムを実行するのではない
705デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 17:11:22.36ID:CwAIhoRS0
>>697
おまえの定義では、どうなっていることを「組み込まれている」というんだ?
たとえば、
float a = sizeof(int);
これの動作過程の途中に生じる整数型は、コンパイラには組み込まれていないのか?
だとするならば、コンパイラは標準変換の規定に「準拠」することができないぞ

# cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
2017/07/06(木) 19:16:01.36ID:kIxohS2+M
>>705
> # cl.exeではsize_tがいきなり使えるが、それがおまえの理想か
どこの cl.exe なのか知らんけど手元の Visual Studio 2015 Express では未定義の識別子だぞ
2017/07/06(木) 20:40:37.21ID:fTFUdLH00
>>700
size_tの差を記述したいんだろう。
708デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
垢版 |
2017/07/06(木) 21:53:15.95ID:GBHzG+Z/0
何も入力されずにenterが押されたらループを終了する方法が分かりません・・・
誰か教えてください・・・
やはりscanfでは出来ませんかね
fgetsだったらできますか?
誰か教えてください、お願いします
2017/07/06(木) 22:01:35.45ID:TwV4dW80d
プロとしては、scanf単独で使うのではなく、fgetsとsscanfの組み合わせをオススメする。
Enterキーのみが入力されたときは、fgetsのバッファには\nが入る。
710デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 22:02:15.40ID:CwAIhoRS0
>>706
ああ、わりいな
拡張子が.cppの場合だw

で、それがおまえの理想か?
711デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 22:03:10.59ID:CwAIhoRS0
つーか+Mはメインの質問に答えてないんだが
712デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/06(木) 22:04:47.65ID:CwAIhoRS0
>>709
すげえのオススメしてんなw
へーえ、それがプロの仕事か
713デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
垢版 |
2017/07/06(木) 22:08:15.36ID:GBHzG+Z/0
>>709
ありがとうございます
参考になります
2017/07/06(木) 22:13:42.82ID:btC8Tydl0
http://www.c-tipsref.com/reference/stdio/fgets.html
読み取ったものが空だったときfgetsはNULLを返すらしいのでそれを使えばいいかと
2017/07/06(木) 22:17:43.51ID:btC8Tydl0

確かにfgets(s, N, stdin)は改行を含めて読み取るな
じゃあ戻り値をsに格納したときにs[0] <= 0x1fのときループを終了させればいいか
716デフォルトの名無しさん (ワッチョイ 9fea-hKQV)
垢版 |
2017/07/06(木) 22:18:05.33ID:GBHzG+Z/0
>>714
ありがとうございます!
2017/07/06(木) 22:24:35.28ID:btC8Tydl0
>>716
>>715(もう読んでるかもしれないけど念のため)
2017/07/06(木) 22:58:55.19ID:Ksmyoljx0
>>710
スレタイも読めないアホは黙っとけ
2017/07/06(木) 23:10:54.32ID:mkYh7+Rt0
>>709

^d だと?
2017/07/07(金) 00:50:35.73ID:eIaxM4+K0
>>717
多分、

入力文字列の最後が '\n' の時は '\0' に置き換える。
入力文字列が空の時は、処理を終了する。

がいいと思う。
721デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/07(金) 04:21:12.07ID:WdR7zyOW0
>>718
スレタイに沿って聞いている>>705に答えられないゴミがドヤってんじゃねええよ
722デフォルトの名無しさん (アウアウエー Sadf-X9Wr)
垢版 |
2017/07/07(金) 05:29:44.02ID:1OiH67XQa
>>708
環境依存ならgetchってのがあったな。
VS使ってんなら使えると思う。
2017/07/07(金) 06:45:35.54ID:URSZRmHsM
>>721
スレタイも話の流れも読めないアホは黙っとけ w
724デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/07(金) 08:07:53.36ID:WdR7zyOW0
>>723
誰だよそれ
実在しない人物を罵倒することこそ
このスレですることじゃねえだろクズ
2017/07/07(金) 08:12:35.70ID:URSZRmHsM
アンカーついてるのに誰だよとか
さらにアホさが増してるやん w
2017/07/07(金) 08:22:53.74ID:o9CZFWTBM
説明不足と読解不足の両方だおまえら
もういいからどっちも黙れ
727デフォルトの名無しさん (ワッチョイ ff1c-2mCk)
垢版 |
2017/07/07(金) 09:38:36.86ID:WdR7zyOW0
>>725
アンカーつけられた人物と
おまえさんの説明が一致しない
と言っているんだよ
ニホンゴワカリマスカ?
728デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 19:49:06.92ID:9n40FStT0
質問です。
http://fast-uploader.com/file/7054979858432/
このプラグラムで関数
void InsertList(struct LIST **ptr ,char *newname,char *newpref,double newdistance);
の部分のポインタのポインタ**ptrを普通のポインタ*ptrにするとコンパイラが通らないのは何故でしょうか?
*ptrに直してコンパイラがエラーとして指摘する場所は
newcell->nextptr=*ptr; /* いままでの先頭ポインタを次ポインタに変更 */
*ptr=newcell; /* 新しいデータ領域を先頭ポインタに変更 */
で、「「struct LIST」型の変数の値を「struct LIST *」型の変数に自動的に変換することはできない」とのことです。
自分の頭の中では**ptrを*ptrにしてもアドレスを渡すという役目はできそうに思うのですがよく解りません。
**ptrと*ptrで型が違うとは具体的にどういう意味で**ptrと*ptrでは何がどう違うんでしょうか?
2017/07/07(金) 19:54:32.46ID:w6YiLhhJM
単純に型が違うんどすえ
int a, *b, **c;
これ全部違うんどすえ
a = 728;
b = &a;
c = &b;
int d, *e, **f;
f = c;
e = *c;
d = **c;
どすえ
730デフォルトの名無しさん (ワッチョイ 97c1-1B52)
垢版 |
2017/07/07(金) 20:42:03.04ID:9n40FStT0
>>729
今回のプログラムに当てはめたらどうなるんでしょうか?
int a, *b, **c;
a = 728; = ?
b = &a; = root=NULL
c = &b; = ?
int d, *e, **f;
f = c; = ?
e = *c; = newcell
d = **c; = ?

それとも

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

よりも

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

の方が一般的には分かりやすいのではないかと。
そして宣言 int* i, j, k; でシンタックスエラーを出すまでが様式美。
と思ったけど、K&R確認したら全部(A)だったw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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