C言語なら俺に聞け 155

レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/08/20(木) 17:36:07.94ID:h4eQG1wdM
>>824
fprintf(stderr, "%s:%s", _FILE_, _func_)
2020/08/20(木) 17:44:00.86ID:h4eQG1wdM
>>826
仕様書6.7.9に余裕があったらnull文字も書き込むよって書いてあるので、余裕がないからnullは書き込まれてないんじゃないかな。
829デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 17:52:19.01ID:RX/3qqm6F
>>828
ありがとうございます

別の質問なのですが
char s[4] = "ABC";
のとき
printf("%2s\n", s);

ABC
まで表示されてしまいます
これを2文字で切るのは
%2s
じゃ駄目なんでしょうか?
2020/08/20(木) 18:19:55.36ID:ajS/uCbw0
%.2s
831デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/20(木) 18:47:15.31ID:RX/3qqm6F
出来たかも知れないありがとう

ちなみに
char s[4] = "A";
printf("|%.2s|\n", s); // |A| 右詰めにならない(左に空白一文字分が出来ない)
printf("|%.-2s|\n", s); // |%.0-2s| って表示される
printf("|%-.2s|\n", s); // |A| 左詰めにならない(右に空白一文字分が出来ない)
なんですけど
printf("|%-2.2s|\n", s);
printf("|%2.2s|\n", s);
で自己解決です
2020/08/20(木) 18:55:26.23ID:6pX7b83qM
>824
そもそも__FILE__や__DATE__はリテラルだが__func__ はリテラルじゃないのでそういうことはできない。
2020/08/20(木) 19:58:56.88ID:vxwYzwgQ0
>>832
そうなんですね。
とすると,
#define FILE_FUNC(func) __FILE__ ":" func
みたいにして,
実際使う場面で
FILE_FUNC(__func__)
というように引数として渡す,という方法をとればいい
ってことでしょうか。
2020/08/20(木) 20:00:10.19ID:vxwYzwgQ0
>>833
あ,当然
#define FILE_FUNC(func) __FILE__ ":" func
のままではいずれにせよ
"somefile:somefunc"
には展開されませんが……。
2020/08/20(木) 23:51:48.90ID:ajS/uCbw0
>>833
#defineで定義してしまうと、再定義でもしない限り、そのソースファイル全体で
一意になる静的なリテラルになってしまうでしょ
一方の __func__ は、各関数内部で、static const char に展開されています
だから、マクロを工夫して置き換えたりするよりも、
>>827 の方法が一番簡潔な方法だと思います
2020/08/21(金) 12:10:40.53ID:RjoBQXpc0
>>835
わかりました。ありがとうございます。

>>827さまもありがとうございました。
2020/08/21(金) 17:03:22.67ID:/1umECfd0
ところで、何で__FILE__は直に文字列リテラルに置換され
__file__は暗黙に宣言される配列の識別子なんだろうな

まさに822が陥ったような混乱の元だと思うが
そうしなければならない理由があるのか
2020/08/21(金) 17:31:23.64ID:J6Koy0SX0
>>837
__func__ のことなら、構文解析が要るからでしょ。
ファイルはプリプロセッサの中で自然にわかるだろうけど、現在位置がどの関数の中か(あるいは関数の外か)はわからない。
2020/08/21(金) 18:15:49.48ID:GWEzflke0
ああ、だから大文字じゃないのね
2020/08/21(金) 18:46:45.25ID:/1umECfd0
>>838
ああ、そうか
翻訳フェーズ(7)でやっと関数名が判明するから
翻訳フェーズ(4)では置換できないってことか
当たり前っちゃ当たり前だな
気が付かなかった
841デフォルトの名無しさん (ワッチョイ 7fad-RTUg)
垢版 |
2020/08/22(土) 10:09:37.81ID:K3IJhML30
>>401
> 何に使うかでそんなに変わるか?

亀レスでごめんなさい。
GUIを含むかどうかでちょと変わると思う。
WindowsならやはりVisualStuidoが便利だった。
Linux、UNIXならgcc,vi,makeの3種の神器かな?
842デフォルトの名無しさん (ワッチョイ ff28-wQSi)
垢版 |
2020/08/25(火) 11:52:50.75ID:c6c4SV8K0
for文の制御式にポインタが単独で使われているコードの意味が分かりません。

https://git.musl-libc.org/cgit/musl/tree/src/locale/catopen.c#n43
ここにある

const char *path, *p, *z;
path = getenv("NLSPATH");
for (p=path; *p; p=z) { // ← これ
...
}
こんな処理です。

繰り返しの際に実行する式にポインタを置くことで
どういう処理が行なわれているのか解説していただけないでしょうか。
どうかよろしくおねがいします。
843デフォルトの名無しさん (エムゾネ FF9f-fHWV)
垢版 |
2020/08/25(火) 11:57:23.18ID:Zt9gBA2MF
*p なら文字終端 '\0' チェックしてるだけじゃね
for (p=path; *p != '\0'; p=z) {
と一緒
2020/08/25(火) 12:06:04.67ID:IYsRryaL0
p=zの方が気になる
845842 (ワッチョイ ff28-wQSi)
垢版 |
2020/08/25(火) 12:36:19.71ID:c6c4SV8K0
>>843
なるほど!
for文の中でpを:ごとに削っていっているので,
それが空になるまで廻すという意味になるんですね。

*p != '\0'はメッチャ分かり易い書き換えでした!
(*pとだけ書いてあっても難なく読めるようにならないと
いけないとは自覚していますが……)

>>844
すいません,ほぼ追加で質問する形になってしまうのですが,
どういうところが気になりますか?
教えていただけると勉強になります。
2020/08/25(火) 12:36:38.95ID:N6/CJWHL0
>>842
*p は、その位置の文字が '¥0' じゃなければループ内に入る判定。
ようするに文字列の終端にたどり着くまでループするということ。
p=z の z は、ループ内で p から見た文字列の中の ':' がある位置の次が入るようになってる。
ようするに path を ':' 区切りにした断片を一つずつ処理してる。
2020/08/25(火) 12:44:35.72ID:mY7DCxIU0
>>844
z = __strchrnul(p, ':'); で ':' 毎に切り出して処理して、次の項目に移動してるんでしょ
2020/08/25(火) 12:48:06.50ID:lcyhmMWC0
strtok : ぼくの出番は・・・
2020/08/25(火) 12:55:51.83ID:ch0Vj7Ea0
こういう2重ループは生理的に好きになれないw
2020/08/25(火) 13:24:37.63ID:c6c4SV8K0
>>848
たしかになぜstrtok()ではなくて独自関数を使うか気になりますね。

__strchrnul()はここで定義されていますが,
http://git.musl-libc.org/cgit/musl/tree/src/string/strchrnul.c
strtok()の仕様
https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html
を見ても,ほとんどインターフェースも同じに思えます。
(引数の型がちょっと違う?)

strtok()関数自体を実装しているならともかく
外部から使用するのにわざわざstrtok()と仕様がそっくりな
独自の関数を用いる理由が分からないですね。
2020/08/25(火) 14:01:32.20ID:mY7DCxIU0
>>850
> たしかになぜstrtok()ではなくて独自関数を使うか気になりますね。
strtok( ) は与えられた文字列書き換えちゃうし内部状態を持つので今どき使うのはやめた方がいいと思うぞ
2020/08/25(火) 15:02:43.34ID:DOmxfygr0
再入可能じゃないからね
2020/08/25(火) 15:06:17.67ID:fzTrphgL0
既存関数を使えばわざわざ文字列をループで処理する必要は無いと思えるけど
例えば昔から良くあるコマンドライン引数をチェックする場合などは
ループで処理するのが一般的かなと思われる

簡単なコードを書いてみたので確認してみるといいかも
https://paiza.io/projects/e/0d-LM04O2-C1g6xC2uXP5w
2020/08/25(火) 15:08:24.49ID:DOmxfygr0
コマンドライン引数にstrtokは全く向かない
引用符使われただけでアウト
ASCIIコードしか想定していない
2020/08/25(火) 15:38:28.41ID:c6c4SV8K0
>>851
ありがとうございます。
なるほど,
https://www.jpcert.or.jp/sc-rules/c-str06-c.html
にも strtok() を不用意に扱わないようにという記述がありました。
だからわざわざ,strtok()に似ているが与件文字列を変更しない
っていう内部関数を利用していたんですね。

「区切り文字による分割」みたいな処理をする場合は,
strtok()の挙動を完全に理解した上で使うか,
自分で挙動を把握できる内部関数を作るかにするよう心掛けます。
(自分で1からC言語を書けるようになるのは
当分先のことになるとは思いますが)
2020/08/25(火) 18:08:51.59ID:efL3nra7M
ライブラリ関数内部で同じライブラリで公開してる別の関数を呼び出すのはエラー時に滅茶苦茶になりそうだから良くない
2020/08/25(火) 19:42:36.86ID:KqJVwSUy0
へぇ __strchrnul だと非マッチ時 zがヌルポにならないようになってんのか
2020/08/26(水) 07:47:13.52ID:EcgUuw1J0
文字列はS-JISのこと考えて自分で作るか
逆にunicodeで全部ライブラリに任せるかしてるわ。
2020/08/26(水) 07:57:09.94ID:68jGS2+/0
こないだユニコード文字列を扱うライブラリを作ったんだが、Poweshellから使うとうまく動作しないでやんの
Bashだとうまくいくからシェルの文字コードが原因かなぁって
2020/08/28(金) 14:09:17.18ID:Rsi3PU970
Poweshell 相手 なら UTF16で試してみて
2020/08/29(土) 18:11:22.84ID:uw2IISYA0
>>860
サンクス
覚えておく
2020/09/05(土) 12:34:48.17ID:inRyx+ft0
一時期ソースファイルで使われる文字コードと
テキストコマンドで指定される文字コードで混乱してた。
863デフォルトの名無しさん (ワッチョイ 675f-th+2)
垢版 |
2020/09/05(土) 14:24:19.26ID:D6IgUwp/0
ファイルシステムもコードページあれば良いのに
2020/09/08(火) 19:54:58.87ID:XpL2+zA20
すみません
visualstudio2019で
scanfてうまく動かないて
書き込みありまさしたが
こちらは初心者です
2020/09/08(火) 20:04:29.03ID:oUJlYCUI0
何がうまくいかないの?
866デフォルトの名無しさん (ワッチョイ e7e6-dQ4P)
垢版 |
2020/09/08(火) 20:07:28.59ID:SzSjgAIn0
>>864
母国語でおk
867デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 20:33:38.44ID:h4K4tlm90
>>866
ماذا علي أن أفعل لتحسين عمل Scanf؟
868デフォルトの名無しさん (ワッチョイ 5fa5-w/i8)
垢版 |
2020/09/08(火) 20:57:51.12ID:dd3/c9tT0
>>864
scanf_sを使うんだよ
2020/09/08(火) 21:00:35.32ID:oUJlYCUI0
自分が初心者だった頃を忘れて弱い者いじめするクズばっかり
870デフォルトの名無しさん (ワッチョイ 87e6-+pFZ)
垢版 |
2020/09/08(火) 21:38:18.70ID:L9CYXS2m0
ここの連中は初心者の時でもこんな愚かな質問しなかっただろうからな
2020/09/08(火) 21:48:40.05ID:i07xiLbJ0
かまって欲しいだけだろう
872デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 22:29:20.68ID:h4K4tlm90
よしよし かまってあげよう おいで〜
2020/09/08(火) 22:40:52.39ID:5p23t/CB0
(≧▽≦)きゃー
874デフォルトの名無しさん (ワッチョイ 0701-P8XZ)
垢版 |
2020/09/08(火) 22:50:33.61ID:h4K4tlm90
(*-ω-)ヾ(・ω・*)ナデナデ
2020/09/10(木) 22:31:27.77ID:XqO8hjOE0
>>869
ここ初心者向けじゃないし
2020/09/11(金) 06:53:15.69ID:Cxw4gZ+X0
クズは認めるわけか
877デフォルトの名無しさん (ワッチョイ c5e6-nmCw)
垢版 |
2020/09/11(金) 09:46:30.88ID:t2oJFSgB0
この初心者のほうがよっぽどクズ
2020/09/11(金) 11:05:17.65ID:Cxw4gZ+X0
クズを認めるからこそ比較できるわけだな
2020/09/11(金) 13:23:30.52ID:eRvWHPbG0
クズでもなんでもいいから正しい日本語を使って質問しなさい
2020/09/11(金) 16:01:28.53ID:Cxw4gZ+X0
ほらな、質問者がクズかどうかは関係ないんだよ
2020/09/11(金) 17:04:12.34ID:ua52u3Jr0
お互い(屑であると)認め合う姿は美しいですね
882デフォルトの名無しさん (ワッチョイ b501-zsLS)
垢版 |
2020/09/12(土) 02:19:04.35ID:SzTm78BI0
静かになるまで5分かかりました(ry
2020/09/14(月) 21:43:37.62ID:8/TQSAVT0
https://hnw.はてなブログ.com/entry/20130406
この記事(海外の質問箱の邦訳)に対するコメントで,
do{
...
} while (feof(input))
というコードが提案されているのですが,どう思われますか。

少なくとも一つの問題点(余分なループ)は克服できている気がしますが。
884デフォルトの名無しさん (ワッチョイ eaad-pVuC)
垢版 |
2020/09/15(火) 00:55:31.70ID:2J2Mo0F/0
>>883
コメントって、どこにあるの?

まあしかしそう書いたとしても c = fgetc(input) をやった直後の c の値が EOF かどうかを調べる必要があって、
EOF だったらループを抜ける必要がある。do { ... } while (feof(input)); のループ内に if ((c = fgetc(input)) == EOF) break; を
入れるとすると最後の while の条件は無駄だ。決して EOF に到達していないから。
2020/09/15(火) 01:38:55.84ID:GcvmEeWM0
>>883
中身が空っぽなinputだったらどうする?
2020/09/15(火) 07:29:42.10ID:YjwP830M0
後判定といえば自明な弱点があるね
2020/09/15(火) 11:24:23.73ID:DboEcGlM0
>>884
はてなブックマークです。
https://b.hatena.ne.jp/entry/139652170/comment/rin51
888デフォルトの名無しさん (ワッチョイ eaad-pVuC)
垢版 |
2020/09/15(火) 13:34:11.71ID:2J2Mo0F/0
ま、しかし、よくよく考えてみると feof() って使い所がほとんどないのではないか?
fgetc() が文字だけでなく EOF まで返す仕様になっているから使わずにも書けてしまうよね。
単にEOFになった後かどうかだけを調べたい場合は fgetc() 使ったら無駄な処理になるけど。
889デフォルトの名無しさん (ワイーワ2 FF92-e6VR)
垢版 |
2020/09/15(火) 13:46:37.73ID:i/gZOuAlF
そもそも feof 使わないよね?って話題だし
2020/09/15(火) 14:02:51.06ID:pUsOBU6W0
fgetc()等はファイルを最後まで読み取った場合だけでなくエラーの場合もEOFを返すことになってるから
どちらの状況か区別するためにfeof(),ferror()はあるんだろ
区別しなくていいなら使わんわな
2020/09/15(火) 14:14:08.17ID:8CWM1WbO0
>>883
ダメダメって書いてあるやろ

rero
ferror の条件が成立した場合,feof の条件は成立せず,無限ループになる.
ループ脱出条件にはfread / fscanf / fgetc などの戻り値を使う.
feof は ferror との切り分けにのみ使う.
2014/02/04
2020/09/16(水) 18:30:21.50ID:+0jueX8G0
ありがとうございました。
893デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 12:37:14.53ID:3L04nVD50
関数定義の書式『例えばprintf関数なら、 int printf(const char * format, ...) 』とかで、関数の引数の型指定が含まれてるけど、これの指す具体的な意味って何?
例えば、const char*型が指定されていたとして、
1、「const char*型でなければならない」
2、「他の型も使えるがconst char*型を推奨する」
3、「色々と対応してるけど代表としてconst char*型を挙げる」
4、「1〜3のうちどれか、関数毎にケースバイケースで具体的には決まってない」
関数定義の書式における型指定には、どのような意味が込められてるんですか?
printf関数では、普通に文字列を入れた配列のポインタ(char *型)にも対応してるので、2か3なんだろうけども。
関数定義書式に含まれる型指定は、1〜4のどれなのか、C言語では統一的に指針が決まってますか?
894デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 12:40:32.43ID:OW2OZx8DF
1
895デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 12:50:38.33ID:3L04nVD50
printf関数の場合では、「char*型が使えるように見えるけど、色々と問題起きるからconst char*型以外は禁止」ということなんですか。
分かりました。
2020/09/17(木) 12:53:34.67ID:uk2B69G8M
const char*はchar*の指す先を書き換えないだけで同じものなのでconst char*をchar*で初期化してなんの問題もない。暗黙変換してくれる。
逆は書き換えられないconst char*が書き換えできる様になってしまうので暗黙にはしない様になっている。
2020/09/17(木) 13:02:01.33ID:9/9M+ZB20
こんなこともできるけどね
static /* const */ char str[] = "hello stupid people";
printf(str);
898デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 13:08:31.54ID:OW2OZx8DF
質問のレベルから忖度すると
質問者が気にしてるのは
ひょっとすると
...
の部分の方なのかも知れない
899デフォルトの名無しさん (ワッチョイ f77c-E8AY)
垢版 |
2020/09/17(木) 13:10:16.65ID:/CJv2N4s0
#include <stdio.h>

int main(int ac, char **av)
{
int p = 0x000a0d41;
printf((char *)&p);
return 0;
}
900デフォルトの名無しさん (ワッチョイ bf8c-CUqR)
垢版 |
2020/09/17(木) 13:40:44.35ID:PwEIVjdJ0
関数定義の引数が配列で書けるようになったのはいつから
int func(array[5]){
.......
}
2020/09/17(木) 13:45:22.35ID:9/9M+ZB20
型指定子がないけど暗黙intってことか? 無理だと思うけど
902デフォルトの名無しさん (ワイーワ2 FFdf-SP/v)
垢版 |
2020/09/17(木) 13:46:44.16ID:OW2OZx8DF
昔から
2020/09/17(木) 13:52:07.27ID:qRMpu/GI0
>>899
明示変換してるのに暗黙変換もさせるのは読みづらいよ
2020/09/17(木) 13:55:11.12ID:9/9M+ZB20
つーかさ
pにアドレス演算子つけてるの
何かがわかってない兆候じゃね?
905デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 14:31:37.44ID:3L04nVD50
皆さんのレスを行間を読んでまとめること、こんな感じの理解でいいですか?

代入の際、右辺の値は、左辺の型に暗黙変換される。
int a = 3.5; // duble型リテラルを暗黙変換してaには3が入る
int a = 'a' // const char型?リテラルを暗黙変換してaには文字コードを表す97が入る
int a ="ほげ"; // const char型リテラルを暗黙変換してaにはよくわからん不正値が入る
同様に、関数へ引数を渡すことも代入の一種であり、実引数が代入する側であるから代入式の右辺に相当し、仮引数が代入される側であるから左辺に相当する。
その際、実引数char*型は仮引数const char*型へ暗黙変換される。
int main(void) {
char hoge[] = "ほげ";
printf(hoge); // 実引数hogeは先頭要素を指すポインタchar*型で、暗黙変換を伴って仮引数のconst char*型となる
}
この逆、仮引数char*型に実引数const char*型を渡すのはNG。char*型とわざわざ指定されてる理由は、値を書き換え可能なポインタを求めるためであり、const char*型はダメ。
2020/09/17(木) 14:32:12.65ID:FojOL81h0
>>900
型が書かれていないけどそれはタイプミスだとすれば、
配列形式で仮引数を書くこと自体は昔から出来る。
ただし、配列形式で書かれるとそれはポインタに調整される。

たとえば仮引数が int array[5] だったら int* array と全く同じとみなされる。
配列の大きさの情報は無視される。
(ひょっとすると警告を出すためのヒントにするくらいの処理系はあったりするのかもしれんけど。)
2020/09/17(木) 14:42:51.44ID:FojOL81h0
>>905
暗黙の変換がされる場合とされない場合はあって、

int a ="ほげ";

で暗黙の変換をする保証はない。
C99 だと単純代入で許される型の組み合わせは 6.3.16 に書かれている。

処理系の拡張としてやっちゃうこともあるかもしれんけど、
その場合でも警告は出るんじゃないかなぁ。

> 関数へ引数を渡すことも代入の一種であり

その通りだが、関数原型 (プロトタイプ) がない場合や
可変長引数 (仮引数が ... で表されるやつ) の場合はちょっとルールが特殊な部分もある。

まちがっててもコンパイラが検出できないこともあるので気を付けないといけない。
2020/09/17(木) 16:23:39.93ID:9/9M+ZB20
処理系の拡張ねえ
gccは-pedanticつけないと黙って通す場合あるかんな

>>905
void func(char *);
func("const char array");
これconst違反なのにできちまう
909デフォルトの名無しさん (ワッチョイ bf8c-CUqR)
垢版 |
2020/09/17(木) 17:46:14.08ID:7hPXgG620
>>900
すまぬ訂正
関数定義の引数が配列で書けるようになったのはいつから
int func(int array[][5]){
.......
}
2020/09/17(木) 18:43:35.04ID:FojOL81h0
>>908
C の文字列リテラルは char の配列ということになっているので char* で受け取れる。
型の視点で見ればそのコードに const は登場しない。

文字列リテラルを書き換えようとした結果は未定義であるにもかかわらず
型に const が付かない C のクソなところのひとつ。

(C++ では文字列リテラルの型には const が付く。)
911デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 19:21:07.83ID:3L04nVD50
よく見てみたら使ってるツールがC++用だった。
C言語入門本でインストールを促すソフトが大抵Visual StudioのC++で、
意識せずにC++の開発環境でC言語の勉強をしてたんだな。
それで、C言語の挙動だと思ってたのが、実はC++の挙動だったんだな。const の件もそう。
2020/09/17(木) 19:39:01.71ID:9/9M+ZB20
>>909
全然配列じゃないじゃん
int func(int(*array)[5]);
これと同じだよ、配列へのポインタ
2020/09/17(木) 19:55:04.93ID:+PkSrmT3M
いくら引数リストに要素数を記述してもコンパイラは無視する
int func(int **array)と同じ扱いでただのニ重ポインタ
2020/09/17(木) 19:57:19.31ID:9/9M+ZB20
>>913
アホwバカwww
2020/09/17(木) 19:58:54.02ID:9/9M+ZB20
char **aho = 0;
printf("%p ", aho);
aho++;
printf("%p ", aho);

printf("%p ", array);
array++;
printf("%p ", array);
916デフォルトの名無しさん (ワッチョイ d793-lMKa)
垢版 |
2020/09/17(木) 19:59:49.49ID:3L04nVD50
でもまあプログラムの再利用性を考えたら、constの件は、C++仕様に配慮して省かないことが大事か。
C++に配慮したコードを書くことで、C言語でもC++でも通用するプログラムとなり、プログラムの再利用性が上がる。
C言語ではconstを省くことが文法的には認められてても・・・・・C++に流用できないプログラムは、たぶんコードとしては減点となる。
2020/09/17(木) 20:03:53.36ID:FZAv8QRcM
>>914
いや、マジで関数に配列を渡せると思ってるの?
配列の引数はポインタの引数の糖衣構文だよ
どうしても配列を渡したい場合は配列を構造体で包めば要素数を関数に渡すことは出来る
2020/09/17(木) 20:05:11.15ID:FojOL81h0
>>913
いや、それは >>912 が正しい。
二重ポインタにまで調整されてしまうと
関数 func の中で array[1][3] みたいなアクセスが不可能になってしまう。
ポインタへの調整はあくまで一段階のみ。
2020/09/17(木) 20:08:22.99ID:FojOL81h0
>>917
配列を渡すのではなく「配列へのポインタ」だ。
配列は多くの場合に配列の先頭要素を指すポインタに暗黙に型変換されるけども、
それとは別に配列を指すポインタというものが存在し、
指す先の配列の大きさは型情報として保存される。
2020/09/17(木) 20:13:48.15ID:9q71Nrm0M
関数の引数として配列を渡す場合、アドレスと要素数は別に渡す必要がある
関数内で要素数を知る手段はない
int func(int **array, int i, int j)
2020/09/17(木) 20:14:06.25ID:FojOL81h0
int array[][5] という配列があったとしたら、その先頭要素の型は int [5] なので、
通常通り配列の先頭要素そ指す型に型変換したら int (*)[5] になるんだ。
仮引数の側もそれと同じような調整が入る。
2020/09/17(木) 20:19:02.57ID:9q71Nrm0M
それは配列の変数宣言の場合だ
仮引数の場合には当たらない
2020/09/17(木) 20:29:34.78ID:FojOL81h0
>>922
JISX3010:2003 から

> 6.7.5.3
> 仮引数を "〜型の配列" とする宣言は、 "〜型への修飾されたポインタ" に型調整する
2020/09/17(木) 20:31:16.69ID:JChOP/F3M
だから糖衣構文だと言ってるだろ
2020/09/17(木) 20:32:41.07ID:FojOL81h0
>>924
構文糖だよ。
でも >>913 の構文糖ではないって話をしてる。
2020/09/17(木) 20:53:29.25ID:+AujTTfU0
>>916
正直言って、const のありがたみが今一つよくわからないんですよね…
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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