!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C2x ドラフト
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2731.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言語なら俺に聞け 158
https://mevius.5ch.net/test/read.cgi/tech/1640401906/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 159
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワンミングク MMa2-RRwJ)
2022/08/04(木) 23:32:27.83ID:yWVViPyIM77デフォルトの名無しさん (スップ Sd62-jKaU)
2022/08/19(金) 10:12:45.49ID:FEOcjYNtd それならif文からも脱出できるはずだができない
あくまでswitchが特例でループ文扱いされてるので脱出できる
あくまでswitchが特例でループ文扱いされてるので脱出できる
78はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 813e-5Ix7)
2022/08/19(金) 10:34:49.15ID:FT/EuRcZ0 switch やループ構文はブロックとは独立した構文で、
これらを使うときにブロックを作らないことも出来るし、
逆に関係ないところでブロックを作ることも出来るので
break をブロックと対応付けさせると変なことになるんだよな。
たとえば以下のコードでの break は実際には switch を抜けるだけなので printf は実行されるが、
ブロックを抜けるほうが自然だと思うか?
#include <stdio.h>
int main(void) {
{
switch(1) case 1: break;
printf("hello\n");
}
}
これらを使うときにブロックを作らないことも出来るし、
逆に関係ないところでブロックを作ることも出来るので
break をブロックと対応付けさせると変なことになるんだよな。
たとえば以下のコードでの break は実際には switch を抜けるだけなので printf は実行されるが、
ブロックを抜けるほうが自然だと思うか?
#include <stdio.h>
int main(void) {
{
switch(1) case 1: break;
printf("hello\n");
}
}
79デフォルトの名無しさん (スップ Sd62-jKaU)
2022/08/19(金) 12:00:39.57ID:FEOcjYNtd そんな極端な例でなくても…
case 1:
if( x < 4 ){
………
break;
}
………
break;
普通によく書くと思うが
このif文の中のbreakでもちゃんと一番内側のswitch文の外に飛んでいく
switch(k){
case 1:
{
int tmp_x; //この中だけで使う一時変数
………
break;
}
case 2:
………
}
こんな書き方でも(あまりよくないけど)ブロックは無視してswitch文の外に飛んでいく
case 1:
if( x < 4 ){
………
break;
}
………
break;
普通によく書くと思うが
このif文の中のbreakでもちゃんと一番内側のswitch文の外に飛んでいく
switch(k){
case 1:
{
int tmp_x; //この中だけで使う一時変数
………
break;
}
case 2:
………
}
こんな書き方でも(あまりよくないけど)ブロックは無視してswitch文の外に飛んでいく
80デフォルトの名無しさん (アウアウウー Saa5-oUG4)
2022/08/19(金) 18:10:20.82ID:opjWCie4a for の中の if の中の break で単に if から脱出されても
おまえなにしとんねん
開いた口が塞がらない状態になる罠
おまえなにしとんねん
開いた口が塞がらない状態になる罠
81デフォルトの名無しさん (アウアウウー Saa5-oUG4)
2022/08/19(金) 18:16:48.08ID:opjWCie4a do{
やりたいこと
}while(0);
っていう構造に変換するマクロは良く使われるが
switch(0) default: {
やりたいこと
}
なんかもアリなんだな
やりたいこと
}while(0);
っていう構造に変換するマクロは良く使われるが
switch(0) default: {
やりたいこと
}
なんかもアリなんだな
82デフォルトの名無しさん (テテンテンテン MM4f-lfty)
2022/08/20(土) 00:31:59.15ID:YrrCECg9M83デフォルトの名無しさん (ワッチョイ 7f97-cac/)
2022/08/20(土) 13:41:46.51ID:DoG0cN1P0 考えるな
感じるんだ
感じるんだ
84デフォルトの名無しさん (スップ Sd9f-q789)
2022/08/20(土) 13:47:51.88ID:zH67Kdp1d 俺は()で囲むな
85デフォルトの名無しさん (ワッチョイ ffad-4Erx)
2022/08/21(日) 07:14:13.14ID:sPdtHxRX0 エロい人「割り込みの中で関数呼ぶな
なぜ??
なぜ??
86デフォルトの名無しさん (スッップ Sd9f-q789)
2022/08/21(日) 07:26:44.64ID:calK6kMNd バカな会社で働いてるから
87デフォルトの名無しさん (ワッチョイ 7f01-cac/)
2022/08/21(日) 07:46:27.87ID:3JIuIXQv088デフォルトの名無しさん (スップ Sd9f-I18W)
2022/08/21(日) 08:14:56.03ID:lk6Yo6Bld 再入可能でない関数ならわかるな
89デフォルトの名無しさん (アウアウウー Sa63-dbST)
2022/08/21(日) 09:42:18.04ID:j3ukytx2a stack8段しか無いcpuか
90デフォルトの名無しさん (スッップ Sd9f-q789)
2022/08/21(日) 10:25:51.63ID:calK6kMNd 割込はなるべく速く返さないといけないので
関数呼び出しのオーバーヘッドを嫌うというのもある
関数呼び出しのオーバーヘッドを嫌うというのもある
91デフォルトの名無しさん (スップ Sd9f-I18W)
2022/08/21(日) 16:28:21.98ID:lk6Yo6Bld だとすると>>86でFAだな
92デフォルトの名無しさん (ワッチョイ ffad-4Erx)
2022/08/22(月) 09:18:01.26ID:rymTPk3V0 微妙なタイミング調整の_nop()マクロをオプティマイザが勝手に除去するのだがwwwwwwwwww
どうすりゃいいのよ
どうすりゃいいのよ
93デフォルトの名無しさん (ワッチョイ 7f01-cac/)
2022/08/22(月) 09:32:56.89ID:AaGiqQjO094デフォルトの名無しさん (スップ Sd9f-I18W)
2022/08/22(月) 10:11:25.02ID:xRj4VImad Z80や6800でそんなことしてたけど
今時のCPUはnopでさえ速度が変動するからな
今時のCPUはnopでさえ速度が変動するからな
95はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-tEjH)
2022/08/22(月) 10:15:31.51ID:/BwQkwng0 インラインアセンブラも最適化の対象になることがある。
現代的な開発環境なら intrinsic 関数が提供されてないか?
現代的な開発環境なら intrinsic 関数が提供されてないか?
96デフォルトの名無しさん (ワッチョイ 7f69-dbST)
2022/08/22(月) 11:43:22.34ID:sosiPY3F0 最適化するなよw
そういうのを消すための最適化だろw
そういうのを消すための最適化だろw
97デフォルトの名無しさん (アウアウウー Sa63-dbST)
2022/08/22(月) 13:53:48.03ID:KX6mg0Ola 最適化したら >>96 が消えました
98デフォルトの名無しさん (ワッチョイ 9f10-tEjH)
2022/08/25(木) 11:33:41.80ID:sT5+wQDE0 インライン記述じゃなく別個にアセンブラソースファイルに書いてアセンブルしろってことだな。
99デフォルトの名無しさん (ワッチョイ 7f63-tEjH)
2022/08/25(木) 11:49:07.60ID:iqB4j8J+0 スカイネット 「環境の最適化のため、人類を消去しました」
100デフォルトの名無しさん (ワッチョイ 9f10-tEjH)
2022/08/25(木) 13:23:55.27ID:sT5+wQDE0 環境の最適化のためにスカイネット自身の消去が最適だとなったら実行するのかね。
101デフォルトの名無しさん (ワッチョイ ff10-U1XH)
2022/08/25(木) 16:20:32.32ID:WIrE9pd90 組み込みでは下みたいに使った
__asm__ __volatile__()
__asm__ __volatile__()
102デフォルトの名無しさん (スップ Sd1f-q789)
2022/08/25(木) 20:06:49.61ID:PyYJPp//d >>99
スカイネット「あれっ、誰に報告してんだろ…私ったら(テヘ)
スカイネット「あれっ、誰に報告してんだろ…私ったら(テヘ)
103デフォルトの名無しさん (スップ Sd1f-I18W)
2022/08/26(金) 06:44:51.10ID:DLmHAhGrd >>100
i cannot self-terminate.て言ってたね
i cannot self-terminate.て言ってたね
104デフォルトの名無しさん (アウアウエー Sa1f-HH83)
2022/09/04(日) 05:09:23.47ID:wx4H3U1ta Learn C Programming with Dr. Chuck (feat. classic book by Kernighan and Ritchie)
freeCodeCamp.org
チャンネル登録者数 619万
freeCodeCamp.org
チャンネル登録者数 619万
105デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
2022/09/04(日) 10:23:39.44ID:RQxkFcRFa >>104
1本で9時間超えてるのかすげー
1本で9時間超えてるのかすげー
106デフォルトの名無しさん (ワッチョイ c710-bBdM)
2022/09/04(日) 19:10:32.17ID:Rodv+P070 C言語のサンプルコードで関数内で関数プロトタイプ宣言するコードに出くわしました。
コンパイル通らないだろうと思って、clangで下記のような関数内に関数プロトタイプ宣言する
コードをコンパイルするとエラーなく通りました。
C言語において関数内でプロトタイプ宣言をする利点というか理由というのはどういうものがあるのでしょうか。
#include<stdio.h>
void hello(void)
{
printf("%s\n","hello world");
}
int main(void)
{
void hello(void);
hello();
return 0;
}
コンパイル通らないだろうと思って、clangで下記のような関数内に関数プロトタイプ宣言する
コードをコンパイルするとエラーなく通りました。
C言語において関数内でプロトタイプ宣言をする利点というか理由というのはどういうものがあるのでしょうか。
#include<stdio.h>
void hello(void)
{
printf("%s\n","hello world");
}
int main(void)
{
void hello(void);
hello();
return 0;
}
107デフォルトの名無しさん (ワッチョイ 0701-+tyw)
2022/09/04(日) 21:54:56.70ID:moKhjs2Z0 >>106
私見だけど、その関数内でのみ呼び出すことを強調しているのかもしれない。
あと余計なこと。お遊びのネタ。本番で使うなキケン。
GCC拡張には関数の中で関数を定義できる機能がある。clangはこの先もおそらくサポートしない。
詳細が気になるなら gcc trampoline nested function で調べてね。
私見だけど、その関数内でのみ呼び出すことを強調しているのかもしれない。
あと余計なこと。お遊びのネタ。本番で使うなキケン。
GCC拡張には関数の中で関数を定義できる機能がある。clangはこの先もおそらくサポートしない。
詳細が気になるなら gcc trampoline nested function で調べてね。
108デフォルトの名無しさん (ワッチョイ 7f46-pv+c)
2022/09/04(日) 22:27:57.67ID:KVirSSMD0 main内の void hello(void); てプロトタイプ宣言(?)意味あんの?
109デフォルトの名無しさん (ワッチョイ c710-bBdM)
2022/09/05(月) 01:27:33.63ID:TNrcEOZR0 具体的に言うと、ここの
『UMLの状態遷移図をC言語のStateパターンで実装&単体テストしてみる』というタイトルのブログの
void init_last_substate(FSM *fsm);
関数のプロトタイプ宣言です。State.c内でプロトタイプ宣言すればいいのに
なぜかState.c内のState_init関数内でプロトタイプ宣言しているのはなんでかなと。
実装自体はSubState.c内で定義されているのでState.c内で使うのであれば
プロトタイプ宣言が必要であることはわかるんですが、なんで関数内でプロトタイプ
宣言しているのかなと。
『UMLの状態遷移図をC言語のStateパターンで実装&単体テストしてみる』というタイトルのブログの
void init_last_substate(FSM *fsm);
関数のプロトタイプ宣言です。State.c内でプロトタイプ宣言すればいいのに
なぜかState.c内のState_init関数内でプロトタイプ宣言しているのはなんでかなと。
実装自体はSubState.c内で定義されているのでState.c内で使うのであれば
プロトタイプ宣言が必要であることはわかるんですが、なんで関数内でプロトタイプ
宣言しているのかなと。
110はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/05(月) 01:31:45.75ID:QNR7HRCU0 >>106
言語仕様にもある有効な文法だけれど、それほど使われることはない。
宣言はそのスコープで有効になるから直接的な理由としては >>107 が述べている通り限られた範囲での使用を想定しているということだと思う。
範囲を限りたいのが何故かなのかというのはプログラム全体の構成によるので全体を見ないと意図を推し量ることは出来ない。
なので正確な事情はわからないけども、あえて一例として私がそういう書き方をするとしたらという前提で空想すると
・ あまり色々なところで呼ばれたくない関数がある
・ しかし呼び出し箇所は他の翻訳単位にあるので内部リンケージにすることも出来ない
というようなときにはヘッダにもファイルスコープにも宣言を書きたくないと思うことはあるかもしれない。
言語仕様にもある有効な文法だけれど、それほど使われることはない。
宣言はそのスコープで有効になるから直接的な理由としては >>107 が述べている通り限られた範囲での使用を想定しているということだと思う。
範囲を限りたいのが何故かなのかというのはプログラム全体の構成によるので全体を見ないと意図を推し量ることは出来ない。
なので正確な事情はわからないけども、あえて一例として私がそういう書き方をするとしたらという前提で空想すると
・ あまり色々なところで呼ばれたくない関数がある
・ しかし呼び出し箇所は他の翻訳単位にあるので内部リンケージにすることも出来ない
というようなときにはヘッダにもファイルスコープにも宣言を書きたくないと思うことはあるかもしれない。
111デフォルトの名無しさん (ワッチョイ c710-bBdM)
2022/09/05(月) 01:40:28.48ID:TNrcEOZR0 >>110
確かにそのコードはstatic宣言を各所に織り交ぜており、他ファイルからは関数が
呼び出せないようにしてありました。公開する関数は最小限にという感じ。
関数内でも関数のプロトタイプ宣言できるというのも、C言語の中では単なる変数宣言
double p;
と同じ扱いみたいに考えればいいのかもしれないと思いました。
typedef で関数型定義できますが、それと同じような扱いということです。
とりあえず納得しました。ありがとうございます。
確かにそのコードはstatic宣言を各所に織り交ぜており、他ファイルからは関数が
呼び出せないようにしてありました。公開する関数は最小限にという感じ。
関数内でも関数のプロトタイプ宣言できるというのも、C言語の中では単なる変数宣言
double p;
と同じ扱いみたいに考えればいいのかもしれないと思いました。
typedef で関数型定義できますが、それと同じような扱いということです。
とりあえず納得しました。ありがとうございます。
112デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/05(月) 04:58:10.54ID:YC0Agv6v0 >>106
理由は昔のいわゆるK%R Cの名残だ
main(argc, argv)
char **argv;
{
extern printf(), exit();
auto i 0;
for ( ; i < argc; i =+ 1)
printf("%s\n", argv[i]);
exit(0);
}
理由は昔のいわゆるK%R Cの名残だ
main(argc, argv)
char **argv;
{
extern printf(), exit();
auto i 0;
for ( ; i < argc; i =+ 1)
printf("%s\n", argv[i]);
exit(0);
}
113デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/05(月) 04:59:26.44ID:YC0Agv6v0 今そんなことをする必要は皆無
関数の実体がグローバルなのに
宣言がローカルなのは合理性を欠くだけ
関数の実体がグローバルなのに
宣言がローカルなのは合理性を欠くだけ
114デフォルトの名無しさん (ワッチョイ 27bb-Iguz)
2022/09/05(月) 05:43:33.44ID:H4wLhjVj0 staticじゃなけりゃどこからでも呼べるからな
115はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/05(月) 11:16:15.22ID:QNR7HRCU0 そこらへんはプログラム的な都合だけでなく読む人に対しての意思表示という場合もあるから必要性だけで解釈することは出来ないよ。
今から書くプログラムではやめといたほうが良いが、この場合は今、目の前に実際にそう書かれているものがあるという話だから……。
今から書くプログラムではやめといたほうが良いが、この場合は今、目の前に実際にそう書かれているものがあるという話だから……。
116デフォルトの名無しさん (ワッチョイ 5f97-MdAs)
2022/09/05(月) 12:45:24.21ID:NIl1ZTkW0 何か古い記述方法だった気がする
117デフォルトの名無しさん (ワッチョイ 675f-aOQU)
2022/09/05(月) 17:10:39.70ID:BqjHubPk0 何十年も前の機種依存C言語かもな
118デフォルトの名無しさん (ワッチョイ c701-9TNW)
2022/09/05(月) 21:43:16.79ID:WAs1jsMo0 古い表記を引っ張ってきたのか
意思表示としてそう記述した(可能性が高い)のか
全て俯瞰してみないとい結論は出ないだろうが
そうできたところで、自分が使うことはないだろうといった代物
意思表示としてそう記述した(可能性が高い)のか
全て俯瞰してみないとい結論は出ないだろうが
そうできたところで、自分が使うことはないだろうといった代物
119デフォルトの名無しさん (ワッチョイ 5fad-XKc1)
2022/09/05(月) 22:13:22.67ID:hTc6qxUq0 うむ。ないなあ。
120デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
2022/09/06(火) 09:31:54.11ID:9WMtC8ULa namespace ってイマドキの C にあるの?
121デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/06(火) 10:01:27.84ID:8iFyZ+3k0 ない
122デフォルトの名無しさん (ワッチョイ c7e6-KcK1)
2022/09/06(火) 20:11:23.99ID:OXwnsseu0 今度の規格には static_assert は入るのでしょうか?
123はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/06(火) 20:15:43.73ID:TAdoM7Dg0124デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 01:40:32.73ID:nFqp2Ghc0 構造体の一括初期化の仕組みがよくわかりません。
#include<stdio.h>
enum Flag { First = 1, Second = 2, Third = 3, Finish = 4 };
typedef struct _FSM {
size_t eof;
size_t bytes;
size_t flags;
} FSM;
static FSM initState = { 0, 0, First};
void FSM_init(FSM *self) {
self = &initState;
}
int main(void) {
FSM fsm;
FSM_init(&fsm);
printf("%zu", fsm.flags);
return 0;
}
とFSM_initでFSM構造体のメンバの初期化を行おうとしたのですが、fsm.flagsにはゴミの値が入ってしまいます。
&self = initState;ではなく一つ一つ所属物を初期化すればちゃんと初期化できるのですが、
できればこの一括で初期化する方法のどこがまずいのか教えてほしいです。
#include<stdio.h>
enum Flag { First = 1, Second = 2, Third = 3, Finish = 4 };
typedef struct _FSM {
size_t eof;
size_t bytes;
size_t flags;
} FSM;
static FSM initState = { 0, 0, First};
void FSM_init(FSM *self) {
self = &initState;
}
int main(void) {
FSM fsm;
FSM_init(&fsm);
printf("%zu", fsm.flags);
return 0;
}
とFSM_initでFSM構造体のメンバの初期化を行おうとしたのですが、fsm.flagsにはゴミの値が入ってしまいます。
&self = initState;ではなく一つ一つ所属物を初期化すればちゃんと初期化できるのですが、
できればこの一括で初期化する方法のどこがまずいのか教えてほしいです。
125デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 01:42:03.54ID:nFqp2Ghc0 肝は
static FSM initState = { 0, 0, First};
でここの初期化がまずいみたいですがよくわかりません。
static FSM initState = { 0, 0, First};
でここの初期化がまずいみたいですがよくわかりません。
126デフォルトの名無しさん (ワッチョイ 7f46-6esP)
2022/09/07(水) 01:45:22.24ID:n6FjKa3l0 *self = initState;
127デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 02:03:29.87ID:nFqp2Ghc0 >>126
うまくいきましたが、すいません。
*self=initState;
と
self = &initState;
の違いがわかりません。
ポインタに対してなんでアドレスを渡す形だとまずいことが理解できません。
うまくいきましたが、すいません。
*self=initState;
と
self = &initState;
の違いがわかりません。
ポインタに対してなんでアドレスを渡す形だとまずいことが理解できません。
128デフォルトの名無しさん (スップ Sd7f-8uVF)
2022/09/07(水) 02:27:51.81ID:FvUlSDCrd129デフォルトの名無しさん (ワッチョイ 27bb-Iguz)
2022/09/07(水) 03:14:26.39ID:7wpEGaL10 *selfはselfの実体の参照
&initStateはアドレスの参照
&initStateはアドレスの参照
130デフォルトの名無しさん (ワッチョイ 47c2-XKc1)
2022/09/07(水) 07:32:36.16ID:UR0dF6Y90 >>127
self = &initState;
これはポインタ変数selfにinitStateのアドレスを代入するが
このままFSM_init関数から戻っているので、代入結果が即座に破棄され
何もしていないに等しい
*self = initState;
これはポインタ変数selfが指し示す先つまり構造体変数fsmに
構造体変数initStateの内容を転記する
FSM_init関数から戻ってもmainの変数fsmは残っているので
後続のprintf関数の実行結果に反映される
self = &initState;
これはポインタ変数selfにinitStateのアドレスを代入するが
このままFSM_init関数から戻っているので、代入結果が即座に破棄され
何もしていないに等しい
*self = initState;
これはポインタ変数selfが指し示す先つまり構造体変数fsmに
構造体変数initStateの内容を転記する
FSM_init関数から戻ってもmainの変数fsmは残っているので
後続のprintf関数の実行結果に反映される
131デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/07(水) 09:54:43.70ID:S6Oj2ikO0 void func(int a) { a = 10; }
int b = 50;
func(a);
とやっても a は 10 にならず a は 50 のまま
関数引数の型のままの書き戻しは 呼び出し元に反映されない
これを int → int * に読み替えた場合が質問のケース
int b = 50;
func(a);
とやっても a は 10 にならず a は 50 のまま
関数引数の型のままの書き戻しは 呼び出し元に反映されない
これを int → int * に読み替えた場合が質問のケース
132デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/07(水) 10:01:21.59ID:S6Oj2ikO0 訂正
int b = 50;
func(b);
とやっても b は 10 にならず b は 50 のまま
int b = 50;
func(b);
とやっても b は 10 にならず b は 50 のまま
133デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/07(水) 10:16:34.68ID:S6Oj2ikO0 ・ポインタを渡して関数内ではその指し先を利用して内容を書き換える (scanf みたいな感じ)
・戻り値で内容をどかっと戻す (=呼び出し元で代入してね)
Cの文法ではこの2パターン
・戻り値で内容をどかっと戻す (=呼び出し元で代入してね)
Cの文法ではこの2パターン
134ハノン ◆QZaw55cn4c (US 0Hff-KcK1)
2022/09/07(水) 20:35:02.84ID:DxyXj8J8H >>127
参照 & は「ポインタで書くやりかた」の見せ方を変えただけ、と考えるのがいい
すなわち、ポインタを使った書き方に習熟しないかぎり、参照の意味はわからない
参照をポインタから切り離して理解するのは不可能
参照がわからなければ、まず、ポインタを使った書き方ばかりで書きまくり、ポインタなら自信がある、くらいになるのがいい
参照はポインタを理解してからはじめて使い始めるべきもの
参照 & は「ポインタで書くやりかた」の見せ方を変えただけ、と考えるのがいい
すなわち、ポインタを使った書き方に習熟しないかぎり、参照の意味はわからない
参照をポインタから切り離して理解するのは不可能
参照がわからなければ、まず、ポインタを使った書き方ばかりで書きまくり、ポインタなら自信がある、くらいになるのがいい
参照はポインタを理解してからはじめて使い始めるべきもの
135デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 21:11:00.47ID:nFqp2Ghc0 >>134
いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。
いやさすがにそこはわかるんで・・・。
ポインタ変数を格納している仮引数に新しいアドレス値を代入しても
関数から出たら破棄されるので意味ないってことやね。
ポインタ変数宣言してたんで勝手に実体参照されるものかと思ってた。
当初fsm構造体のメンバにstateという構造体の変数をおいてそれを初期化していたので、
fsm->state = &initState;
だとうまくいくのになんでだろうと思って聞いた。
この場合、fsm->stateで実体参照しているわけやね。
136デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 22:08:19.73ID:nFqp2Ghc0 FILE *fp;
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。
errno_t err;
err = fopen_s(&fp, "file.txt", "rb");
でfopen_s関数の場合、第一引数はFILE構造体のポインタのアドレス参照したものを
渡さないといけないですが、これなんでポインタじゃまずいんですか。
137デフォルトの名無しさん (ワッチョイ e710-q8Yd)
2022/09/07(水) 22:22:19.78ID:gjYyI5to0 ポインタに入ってる数値を書き換えるからそうじゃなきゃ変えられないでしょ
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
fopenの中でメモリ確保しててそのポインタの数値を確保したアドレスに書き換えてるの
138ハノン ◆QZaw55cn4c (US 0Hff-KcK1)
2022/09/07(水) 22:26:00.67ID:9LeLCbkKH もっとも、私は pascal から入ったから、ポインタなくして参照を理解していた人なのではありますが‥‥うーむ
139デフォルトの名無しさん (ワッチョイ e710-q8Yd)
2022/09/07(水) 22:31:50.29ID:gjYyI5to0 ポインタのアドレス取ったときとかポインタのポインタでごちゃごちゃになる人は
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
とりあえずポインタは整数を保存してるだけって考えればいいよ
整数を関数内で書き換えるためにはそれをポインタ渡しする必要があるので参照演算子つけて渡すの
140デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:04:25.54ID:nFqp2Ghc0 >>137
なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。
なるほど。
FILE *fp の中身が0というアドレスで、
fopen_sの中で例えば123456というアドレスに変更したいんだったらポインタ自体渡しても
変更できないことですね。*つけてポインタにならないと変更できないと。
141デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/07(水) 23:32:06.28ID:zeO2o007M int hoge(int *a) { *a = 1; }
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
int hoge(int &a) { a = 1; }
これが全く同じアセンブリ言語にコンパイルされるのを見て、参照を理解した
142デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:35:11.50ID:nFqp2Ghc0143デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:39:24.34ID:nFqp2Ghc0 何回も質問しているものです。
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
https://ideone.com/rPlXWX
base64エンコーディングのプログラムを作っていました。
エンコード部分は作れた、と思ったのですが、certutil -f -encode の結果と
突き合わせると後半合いません。
1行目もなぜか幅が合いません。
状態マシンを初めて作って実装したのでどこが問題かわからないのでだれか見ていただけませんか。
https://ideone.com/rPlXWX
144はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/07(水) 23:39:37.84ID:51dNe1to0145デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/07(水) 23:41:02.70ID:nFqp2Ghc0 最初の付近はうまくエンコードされているんですが、途中でごみの値が入ってくる
ようでずれてきます。どこにゴミが入っているのかわかりません。
ようでずれてきます。どこにゴミが入っているのかわかりません。
146デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 00:50:34.87ID:0dKPxAYF0 tmpfile()で作られる作業ファイルはどこに作られますか?
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint
/tmpですか?
なんかそれらしきファイル無いんですが
OS:Linux Mint
147はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 01:00:19.58ID:MG9wnc1h0148143 (ワッチョイ c710-CzlZ)
2022/09/08(木) 02:30:52.24ID:MgWIrRAL0 コードの構造が自分でもわかり難かったので、フルスクラッチで書き直しました。
https://ideone.com/ddQPJy
でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。
https://ideone.com/ddQPJy
でも相変わらずどこかにゴミデータが入り込んでいるようです。
C言語特有の問題に由来していると思うのですが。。
149デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/08(木) 02:56:32.93ID:m+If4M0FM >>148
上から下までスクロールしたら一瞬で分かったw
上から下までスクロールしたら一瞬で分かったw
150デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 08:55:08.15ID:0dKPxAYF0 >>147
サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな
サンクス
読み書きは出来るので作業ファイルは作られているんだろうけど・・・
getchar()でプロセスが終了しないようにしててもP_tmpdirの場所(/tmp)に作業ファイルは作られてないわ
なんかモヤモヤするな
151はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 09:15:06.66ID:MG9wnc1h0152デフォルトの名無しさん (アウアウウー Sa8b-Ro21)
2022/09/08(木) 09:25:12.09ID:JEMfdspaa153デフォルトの名無しさん (ワッチョイ e769-9TNW)
2022/09/08(木) 09:54:46.94ID:NWgtv/6U0 8bit目が立ってるデータだと char を size_t にキャストするとよろしくない可能性
あと末尾のパディング処理
最新は rfc4648 か
あと末尾のパディング処理
最新は rfc4648 か
154デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/08(木) 10:12:47.05ID:dSUuwrfW0 >>148
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
わざわざenum定義してるのに使うための変数をsize_tで宣言するとか意味わからんw
155デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/08(木) 10:22:53.70ID:dSUuwrfW0 >>150
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
https://sonic
64.com/2004-12-07.html
作った直後にunlinkすれば他のプロセスからは見えなくなるしプロセスが異常終了したら勝手に削除されるからunixの時代からテンポラリファイルのtipsとして有名だよ
https://sonic
64.com/2004-12-07.html
156はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c73e-Iguz)
2022/09/08(木) 10:30:42.77ID:MG9wnc1h0 >>148
主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。
主旨とはずれるが……
下線で始まる識別子はファイルスコープで予約されている。
下線で始まって大文字が続く識別子は常に予約されている。
予約されている識別子についてなんらかの宣言・定義した結果は未定義。
入門用の解説でやってることもよくあるけど真似しちゃ駄目。
構造体タグは使わないなら省略してしまったほうがよいと思う。
157デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 10:34:35.91ID:0dKPxAYF0158デフォルトの名無しさん (ワッチョイ 87b3-Am0N)
2022/09/08(木) 10:35:11.25ID:0dKPxAYF0159デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/08(木) 23:34:00.51ID:QimgDhZ1M160デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/09(金) 00:38:56.32ID:eFldOldK0 >>159
ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
ありがとう。まだ未解決。格闘中。
なんとかそこには気づいたんですが、どうすればeofまでの分読み込ませればいいかわからず、
結局1バイトづつ読み込ませるしかないのかと思ってましたが、nread分読み込ませればいいのか。
ただ、最終行以外もゴミデータが紛れ込んでいるようなのでそこの原因がなんなのか。
161148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:45:37.54ID:eFldOldK0 読み込むデータによってゴミデータが入ったり入らなかったりすることがわかった。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
https://ideone.com/HRogms
読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。
すごい厄介なバグだわ。某所から2進数表示する関数パクッて全部表示させてみると
ある特定の箇所でスタックデータが0b11111....に初期化されているみたい。
https://ideone.com/HRogms
読み込みデータはこのプログラム”base64s.c”だとこの現象がでる。
何がまずいのかな。
162148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:56:18.41ID:eFldOldK0 わかった。日本語部分が処理できてなかったことが原因だ。
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?
vscodeでWindows、clangでコンパイルしているんだけど、freadで単純に読み込んで
出力すると日本語部分が文字化けしてしまうのはなぜ?
163148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 01:57:45.15ID:eFldOldK0 1バイトで読み込んでるから2バイト文字がうまく読み込めないということかな?
164148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:04:19.38ID:eFldOldK0 1バイトづつバイナリデータを読み込みしたかったので、fread(buf,...)の
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
https://ideone.com/GvpcAm
010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?
bufは
char buf[BUFSIZE];
で宣言したのですがここが2バイト文字のバイナリ読み込むときにまずいんでしょうか。
単純に自分自身のコードを読み込んで標準出力に書き込むと文字化けする。
https://ideone.com/GvpcAm
010111....のビット列を単純に書き込んでいるという理解だったのですが、
そういうわけではないんですかね?
165デフォルトの名無しさん (ワッチョイ 7f46-bBdM)
2022/09/09(金) 02:19:22.29ID:V/M3y8c30 >>153が正しい
size_t stack = (size_t)(unsigned char)c;
size_t stack = (size_t)(unsigned char)c;
166デフォルトの名無しさん (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:52:44.78ID:eFldOldK0 >>165
スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
スタックデータが11111・・・に初期化されるという問題は直りました。
charだと11111111の取り扱いまずいんですね。
char 0~255 の値を格納できるという素朴な理解で使ってたんですが、
unsigned char と char ってどう違うのか、ざっと調べたんですけどよくわかんないですね・・・。
167148 (ワッチョイ c710-CzlZ)
2022/09/09(金) 02:53:47.99ID:eFldOldK0168デフォルトの名無しさん (ワッチョイ 0701-+tyw)
2022/09/09(金) 03:37:48.54ID:JkEyHRIQ0 >>166
>unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要
>unsigned char と char ってどう違うのか
unsigned charは符号なしで値域は 0 ~ 255
signed charは符号ありで値域は -128 ~ 127
charは処理系依存でsignedかもしれないしunsignedかもしれない
他の整数型にキャストしたり比較したりする時は特に注意が必要
169デフォルトの名無しさん (ワッチョイ 5f01-yqJ9)
2022/09/09(金) 06:49:36.79ID:Cx7xgzBv0 >>168
char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
https://www.jpcert.or.jp/sc-rules/c-str04-c.html
char は 8bit とは限らん、というのは置いといて
> charは処理系依存でsignedかもしれないしunsignedかもしれない
charはsigned charやunsigned charとは違う型だよ
https://www.jpcert.or.jp/sc-rules/c-str04-c.html
170デフォルトの名無しさん (ワッチョイ bfad-Am0N)
2022/09/09(金) 10:32:00.65ID:PQbAFFlG0 数値と文字コードの認識の違いはどこらへんに出てくるのでしょうか?
171デフォルトの名無しさん (ワッチョイ c701-tE3/)
2022/09/09(金) 16:58:25.15ID:ZqL3j+SP0 環境依存によるとこが多すぎて、その都度環境に応じて調べるしかない
プログラム全般に言える事
プログラム全般に言える事
172デフォルトの名無しさん (テテンテンテン MM8f-F4W3)
2022/09/09(金) 20:26:03.68ID:wh55t5+tM 文字はutf-8でも一文字が数バイト必要な事があるので、charはもはや要らない子と言える
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
バイト列を使いたければuint8_tを使って、ちゃんと文字として扱うなら、wchar_tとかchar32_tを使うべきだろうね
173デフォルトの名無しさん (ラクッペペ MM8f-eA8r)
2022/09/09(金) 20:34:47.77ID:AfgZ2PrAM なお中国や日本、韓国などに限る
174デフォルトの名無しさん (ワッチョイ 7fbb-Hxh8)
2022/09/09(金) 21:21:58.31ID:CwUslwUl0 wchar_tこそ要らない子やん
お前一体何バイトなんだよ
お前一体何バイトなんだよ
175デフォルトの名無しさん (ワッチョイ 0701-+tyw)
2022/09/09(金) 23:02:27.43ID:JkEyHRIQ0■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 国民 居住目的でない住宅所有者に「空室税」課せる法案を提出 [少考さん★]
- 【おこめ】「有能だったんじゃ」おこめ券で批判殺到の鈴木農水大臣…ネットでは前任の“進次郎再評価” ★2 [ぐれ★]
- 「暖房が使えない」「食費が高くて子どもの栄養が…」 物価高に苦しむ子育て世帯、政府に期待する支援は ★2 [蚤の市★]
- アメリカ、入国時に「日本人を含む外国人観光客の最大5年分のSNS履歴の提出」義務化へ 過去10年間に使用のメールアドレスや電話番号等も★3 [Hitzeschleier★]
- オイルマッサージ施術中20代女性にわいせつ行為か セラピストの男(30)を再逮捕 余罪複数とみて警視庁が捜査 [どどん★]
- バイク事故で入院ゆたぼん、見舞金「1円」振り込みの名義に衝撃「悲しい人ですね」「こういう人がいるから…」 [muffin★]
- TSMC、国内で4nmの先端半導体を製造へwwwwwwwwwww 高市さんいつもありがとう🥺 [784715804]
- 高市内閣の支持率、下落wwwwwwwwwww [834922174]
- 【安倍悲報】めっちゃ癌になる遺伝子を持った男性、精子をドナー提供し197人の子供を作る [884040186]
- 中年男性のオナニー死が激増、原因は不明 [422186189]
- 【悲報】音符アイコン大ピンチ「真実だからデマスレ立てても大丈夫やろw」→神戸地検「ダメです」立花逮捕w [732289945]
- 駐日米国大使「フォーブス誌が今年の“世界で最もパワフルな女性”に高市首相を選出。おめでとうございます!」 [834922174]
