何にも知らない0からの出発、超初心者のためのC言語相談室
C++は、こちら。
0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/
探検
0からの、超初心者C言語相談室
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2021/05/19(水) 01:34:14.03ID:OYngDuIu2デフォルトの名無しさん
2021/05/19(水) 02:46:32.09ID:iywlut5a 糸冬
3デフォルトの名無しさん
2021/05/19(水) 07:05:58.55ID:arAgfqcT #include<stdio.h>
void funcB(void)
{
int b = 20;
printf("b-address: %ld\n", (long)&b);
}
void funcA(void)
{
int a = 10;
printf("a-address: %ld\n", (long)&a);
funcB();
}
int main(void)
{
funcA();
return 0;
}
(1)変数aとbはメモリ内の特に何という領域に確保されますか。
(2)変数aとbはどちらのほうがより小さい番地にメモリが確保されましたか。
(3)(2)から(1)の領域は前と後ろのどちらの方向へ向かって利用されていくと推測できますか。
スッキリ分かるCの問題なのですが
これの(3)が意味分からないので解説してほしいです
(2)も何でそうなるのかよく分からんですが、。
void funcB(void)
{
int b = 20;
printf("b-address: %ld\n", (long)&b);
}
void funcA(void)
{
int a = 10;
printf("a-address: %ld\n", (long)&a);
funcB();
}
int main(void)
{
funcA();
return 0;
}
(1)変数aとbはメモリ内の特に何という領域に確保されますか。
(2)変数aとbはどちらのほうがより小さい番地にメモリが確保されましたか。
(3)(2)から(1)の領域は前と後ろのどちらの方向へ向かって利用されていくと推測できますか。
スッキリ分かるCの問題なのですが
これの(3)が意味分からないので解説してほしいです
(2)も何でそうなるのかよく分からんですが、。
4デフォルトの名無しさん
2021/05/19(水) 07:34:36.87ID:dkgz9ZJm 無理しないでPythonでもやっとけ
5デフォルトの名無しさん
2021/05/19(水) 11:41:19.87ID:psqzmlBB &p
6デフォルトの名無しさん
2021/05/19(水) 11:41:41.86ID:psqzmlBB もとい
%p
%p
2021/05/19(水) 11:51:21.02ID:AeilwxT4
どっかの宿題か
https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node9.html
https://www.atmarkit.co.jp/ait/articles/1703/01/news166_4.html
https://qiita.com/zacky1972/items/86741d1ac6939795784f
https://qiita.com/hiro4669/items/348ba278aa31aa58fa95
https://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node9.html
https://www.atmarkit.co.jp/ait/articles/1703/01/news166_4.html
https://qiita.com/zacky1972/items/86741d1ac6939795784f
https://qiita.com/hiro4669/items/348ba278aa31aa58fa95
2021/05/19(水) 16:59:00.40ID:ZyjXFBY0
9はちみつ餃子 ◆8X2XSCHEME
2021/05/19(水) 17:43:06.29ID:ONEwpJm5 >>3
(1) 一般にはスタックと呼ばれるが言語仕様にはそのような規定はないので、
実行環境によっては違うこともあるかもね。
(言語仕様ではオブジェクトの寿命が決められているだけ。)
(2) 主流の CPU では b の方が小さい番地の可能性が高い。
(3) スタックはメモリの上位番地から下位番地に向かって使われる。
なんでそうなるかっていうのは結局のところそう決めたから
そうなっているってだけなんで、逆でもかまわないし、
実際に逆にデザインされたアーキテクチャは存在する。
https://ja.wikipedia.org/wiki/PA-RISC
これらはコンピュータアーキテクチャの話。
言語の仕様とそれがどのように実装されているか (機械語を生成するか) は別物なんで、
そこらへんのレイヤを区別して考えないとわけわからんと思う。
(1) 一般にはスタックと呼ばれるが言語仕様にはそのような規定はないので、
実行環境によっては違うこともあるかもね。
(言語仕様ではオブジェクトの寿命が決められているだけ。)
(2) 主流の CPU では b の方が小さい番地の可能性が高い。
(3) スタックはメモリの上位番地から下位番地に向かって使われる。
なんでそうなるかっていうのは結局のところそう決めたから
そうなっているってだけなんで、逆でもかまわないし、
実際に逆にデザインされたアーキテクチャは存在する。
https://ja.wikipedia.org/wiki/PA-RISC
これらはコンピュータアーキテクチャの話。
言語の仕様とそれがどのように実装されているか (機械語を生成するか) は別物なんで、
そこらへんのレイヤを区別して考えないとわけわからんと思う。
2021/05/19(水) 18:47:16.00ID:SmvgsauD
11デフォルトの名無しさん
2021/06/09(水) 14:13:39.99ID:3Qpbsqp/ strstr で文字列を検索出来ますが'\0'が含まれているともちろん正常に動作しませんね
メモリ中の'\0'を含むバイトパターンの現れる位置を調べる関数は何ていう名前?
メモリ中の'\0'を含むバイトパターンの現れる位置を調べる関数は何ていう名前?
12はちみつ餃子 ◆8X2XSCHEME
2021/06/09(水) 16:35:20.50ID:Ih94CWHU13デフォルトの名無しさん
2021/06/10(木) 10:48:32.40ID:ZbfFyHii memchr を使って memmem 相当の関数を造りました
ありがとうございました
ところで memmem の引数や戻り値ってどうして void * なんですか?
char * になってないと使いにくくないですか?
memory 用だからですか?
void * の場合 size_t が各要素の size の倍数なのか char の size の倍数なのか
特別考慮してくれる訳でもないですよね?
ありがとうございました
ところで memmem の引数や戻り値ってどうして void * なんですか?
char * になってないと使いにくくないですか?
memory 用だからですか?
void * の場合 size_t が各要素の size の倍数なのか char の size の倍数なのか
特別考慮してくれる訳でもないですよね?
14はちみつ餃子 ◆8X2XSCHEME
2021/06/10(木) 14:11:49.95ID:MOYAWABe >>13
> memory 用だからですか?
そう。 バイト列を扱う場合というのは色んな型のメモリブロックである可能性がある。
`void*` の特徴として、他のポインタとの間で暗黙の型変換の対象になるという特別扱いがある。
(C++ ではこの特徴は廃止されているので注意!)
だから
int a=114514;
unsigned char b=0xbf;
memmem(&a, sizeof(a), &b, 1);
といったように何のポインタを渡した場合でも型が違うとかいったエラーにはならない。
いちいちキャストしなくてよいから楽だからこうなってる。
> memory 用だからですか?
そう。 バイト列を扱う場合というのは色んな型のメモリブロックである可能性がある。
`void*` の特徴として、他のポインタとの間で暗黙の型変換の対象になるという特別扱いがある。
(C++ ではこの特徴は廃止されているので注意!)
だから
int a=114514;
unsigned char b=0xbf;
memmem(&a, sizeof(a), &b, 1);
といったように何のポインタを渡した場合でも型が違うとかいったエラーにはならない。
いちいちキャストしなくてよいから楽だからこうなってる。
15はちみつ餃子 ◆8X2XSCHEME
2021/06/10(木) 14:20:26.59ID:MOYAWABe ちょっと間違えた。
C++ でも void* への暗黙の型変換はアリだけど
void* からの暗黙の型変換はないんだった。
C++ でも void* への暗黙の型変換はアリだけど
void* からの暗黙の型変換はないんだった。
16デフォルトの名無しさん
2021/06/11(金) 16:56:51.54ID:hP01Bt9y 環境
unix系でxterm系のコンソール
less vi emacs等の
現在のプロンプト位置でプログラムを実行し(全画面表示し)終了すると
元のプロンプト位置(の次の行)に戻ってくる処理をできる限りの低レベルで知りたい
例えば
3行目でvi起動
編集
終了
プロンプトが4行目に復帰する
起動時のコマンドが直上にある状態
エスケープシーケンスでのクリアは内部的に
エコーしないで改行してるだけ?なのかそのまま空行が出来てしまう
unix系でxterm系のコンソール
less vi emacs等の
現在のプロンプト位置でプログラムを実行し(全画面表示し)終了すると
元のプロンプト位置(の次の行)に戻ってくる処理をできる限りの低レベルで知りたい
例えば
3行目でvi起動
編集
終了
プロンプトが4行目に復帰する
起動時のコマンドが直上にある状態
エスケープシーケンスでのクリアは内部的に
エコーしないで改行してるだけ?なのかそのまま空行が出来てしまう
17デフォルトの名無しさん
2021/06/20(日) 10:08:07.54ID:vSSpHRy4 char a[4]; で確保したときって
strncpy(a, "abc", sizeof(a)); で良いんですか?
char a[4+1]; で確保する書き方もあれば
strncpy(a, "abc", sizeof(a) - 1); で少なめに指定する書き方もあるようですが
どちらが一般的ですか?
strncpy(a, "abcd", sizeof(a)); ならメモリ壊れますか?
strncpy(a, "abc", sizeof(a)); で良いんですか?
char a[4+1]; で確保する書き方もあれば
strncpy(a, "abc", sizeof(a) - 1); で少なめに指定する書き方もあるようですが
どちらが一般的ですか?
strncpy(a, "abcd", sizeof(a)); ならメモリ壊れますか?
2021/06/20(日) 18:24:48.63ID:a10qQPc9
char s[4]
strncpy(a, "abcd", sizeof(s));
はnul文字がコピーされないし
strncpy(a, "abc", sizoef(s)-1);
もnul文字がコピーされない
唯一動作するのは
strncpy(a, "abc", sizeof(s));
だがこれも abc が abcd になったらnul文字がコピーされなくなる
結論:strncpyは使うな
strncpy(a, "abcd", sizeof(s));
はnul文字がコピーされないし
strncpy(a, "abc", sizoef(s)-1);
もnul文字がコピーされない
唯一動作するのは
strncpy(a, "abc", sizeof(s));
だがこれも abc が abcd になったらnul文字がコピーされなくなる
結論:strncpyは使うな
2021/06/20(日) 19:07:42.24ID:Q3V/e/tw
×使うな
◯仕様を理解して適切な場面で適切に使え
◯仕様を理解して適切な場面で適切に使え
2021/06/21(月) 00:42:00.03ID:zJyyyGxF
正直標準ライブラリは諦めた方がいいと思うんだが
安全な文字列や数値型ライブラリはあるけど、特にどれがメジャーというわけでもないから、チームでやると最大公約数の標準ライブラリ使わざるを得ないっていう
安全な文字列や数値型ライブラリはあるけど、特にどれがメジャーというわけでもないから、チームでやると最大公約数の標準ライブラリ使わざるを得ないっていう
2021/06/26(土) 05:41:35.82ID:64gC9b2h
22デフォルトの名無しさん
2021/06/29(火) 14:18:16.44ID:q4QzgdjF default:
https://www.mbs.jp/news/kansainews/20210628/GE00038998.shtml
■「日本が財政破綻する確率は100%」と大前研一氏。
私に言わせれば、税金を払える生産年齢人口が減り続けている以上、破綻確率は「100%」である。
今の日本は、いわば“裸の王様”のようなもので、すでに国の財政は破綻している状態だから、いつ国債が暴落して債務不履行になってもおかしくない。
ただ、それは1年後かもしれないし、10年後かもしれない、という話なのである。
そういう事態が起きないように財政運営戦略を作っていくのが、国を預かる為政者がやるべきことだ。
ところが日本は、日本銀行が「異次元金融緩和」を8年以上も継続して財務省が紙幣を刷りまくり、大量発行する国債の消化資金を民間金融機関に提供してきた。
そして、その国債を日銀が民間金融機関から買い取って自ら貯め込み、“禁じ手”とされている事実上の財政ファイナンス(中央銀行が通貨を発行して国債を直接引き受けること)を続けている。
https://www.mbs.jp/news/kansainews/20210628/GE00038998.shtml
■「日本が財政破綻する確率は100%」と大前研一氏。
私に言わせれば、税金を払える生産年齢人口が減り続けている以上、破綻確率は「100%」である。
今の日本は、いわば“裸の王様”のようなもので、すでに国の財政は破綻している状態だから、いつ国債が暴落して債務不履行になってもおかしくない。
ただ、それは1年後かもしれないし、10年後かもしれない、という話なのである。
そういう事態が起きないように財政運営戦略を作っていくのが、国を預かる為政者がやるべきことだ。
ところが日本は、日本銀行が「異次元金融緩和」を8年以上も継続して財務省が紙幣を刷りまくり、大量発行する国債の消化資金を民間金融機関に提供してきた。
そして、その国債を日銀が民間金融機関から買い取って自ら貯め込み、“禁じ手”とされている事実上の財政ファイナンス(中央銀行が通貨を発行して国債を直接引き受けること)を続けている。
2021/06/29(火) 14:18:32.64ID:q4QzgdjF
FRBやECBも日銀と同じように金融緩和を行なっているが、むしろ日銀を先行指標として注視している。
一方、日本人の多くは、自分は国債と関係ないと思っている。
だが実際は、郵便貯金や銀行預金が金融機関を通じて国債に流れ、さらに日銀とGPIFという「2頭の鯨」が国債と株を爆買いしている。
つまり、個人金融資産は国債に化け、年金積立金も国債と株に形を変えているわけで、政府が財政破綻したら国民も一蓮托生なのだ。
だが、今の日本は政治家に政府債務に対する危機感がなく、今後も少子化と生産年齢人口の減少が続く。GAFAMのような巨大IT企業もなければ、アメリカや中国などで続々と誕生しているユニコーンも全く出てこない。このような状況では、巨額の政府債務を返せるわけがない。
では、国民はどうすればよいのか?
資金に余裕があれば、政府が財政破綻しても影響が少ない「不動産」や「金」を買っておいたほうがよいだろう。
利息が付く預貯金は元本1000万円までとその利息しか保護されないし、「株」や「投資信託」や「債券」も国が破綻すれば「国債」と同じく紙屑同然になるからだ。
ただし、最も有効な対策は、自分に投資して世界のどこに行っても稼げる人間になることだ。
もし日本が破綻したとしても、世界のどこかに繁栄しているところはあるはずだから、そこで稼げる力を磨いておくことが唯一の安全・安心・有望な投資先なのである。
一方、日本人の多くは、自分は国債と関係ないと思っている。
だが実際は、郵便貯金や銀行預金が金融機関を通じて国債に流れ、さらに日銀とGPIFという「2頭の鯨」が国債と株を爆買いしている。
つまり、個人金融資産は国債に化け、年金積立金も国債と株に形を変えているわけで、政府が財政破綻したら国民も一蓮托生なのだ。
だが、今の日本は政治家に政府債務に対する危機感がなく、今後も少子化と生産年齢人口の減少が続く。GAFAMのような巨大IT企業もなければ、アメリカや中国などで続々と誕生しているユニコーンも全く出てこない。このような状況では、巨額の政府債務を返せるわけがない。
では、国民はどうすればよいのか?
資金に余裕があれば、政府が財政破綻しても影響が少ない「不動産」や「金」を買っておいたほうがよいだろう。
利息が付く預貯金は元本1000万円までとその利息しか保護されないし、「株」や「投資信託」や「債券」も国が破綻すれば「国債」と同じく紙屑同然になるからだ。
ただし、最も有効な対策は、自分に投資して世界のどこに行っても稼げる人間になることだ。
もし日本が破綻したとしても、世界のどこかに繁栄しているところはあるはずだから、そこで稼げる力を磨いておくことが唯一の安全・安心・有望な投資先なのである。
2021/07/05(月) 11:47:38.56ID:c503ASju
4899774451
4899775067
4046019557
489977463X
4899775067
4046019557
489977463X
25デフォルトの名無しさん
2021/09/12(日) 04:36:58.26ID:a7tYNi4V #include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "Pointers are fun to use.";
char str2[80], * p1, * p2;
p1 = str1 + strlen(str1) - 1;
p2 = str2;
while (p1 >= str1)
*p2++ = *p1--;
*p2 = '\0';
printf("%s %s", str1, str2);
}
#include<string.h>
int main()
{
char str1[] = "Pointers are fun to use.";
char str2[80], * p1, * p2;
p1 = str1 + strlen(str1) - 1;
p2 = str2;
while (p1 >= str1)
*p2++ = *p1--;
*p2 = '\0';
printf("%s %s", str1, str2);
}
2021/09/12(日) 04:40:02.79ID:a7tYNi4V
p1 = str1 + strlen(str1) - 1;の部分と*p2++ = *p1--;この部分の意味がよく分かってない可能性が高いので解説してほしいです
str1の先頭アドレス+str1の文字数-1…でつまり何処をさしてるのでしょうか?
p1 >= str1は先頭アドレスより大きい間はって意味ですか?
str1の先頭アドレス+str1の文字数-1…でつまり何処をさしてるのでしょうか?
p1 >= str1は先頭アドレスより大きい間はって意味ですか?
2021/09/12(日) 05:25:12.94ID:cHe5vqGk
>str1の先頭アドレス+str1の文字数-1…でつまり何処をさしてるのでしょうか?
str1の最後の文字(0終端の一個前)
>p1 >= str1は先頭アドレスより大きい間はって意味ですか?
惜しい
「より大きい」ではなく「以上」、=があるから
VisualStudio等のIDEのデバッガでステップ実行して、
各変数の変化・ポインタの指す先を見てればすぐわかるよ
str1の最後の文字(0終端の一個前)
>p1 >= str1は先頭アドレスより大きい間はって意味ですか?
惜しい
「より大きい」ではなく「以上」、=があるから
VisualStudio等のIDEのデバッガでステップ実行して、
各変数の変化・ポインタの指す先を見てればすぐわかるよ
2021/09/12(日) 07:15:26.26ID:jZMYjdNi
*p2++ = *p1--
こういのは、意味が分からないしバグるから、MISRA-C で禁止している
Ruby には、++/-- 演算子はない。
Go では単独文扱いで、他の式と組み合わせることは出来ない
MISRA-C でも同様
こういのは、意味が分からないしバグるから、MISRA-C で禁止している
Ruby には、++/-- 演算子はない。
Go では単独文扱いで、他の式と組み合わせることは出来ない
MISRA-C でも同様
29デフォルトの名無しさん
2021/09/12(日) 09:32:13.18ID:x3+6FKDq >意味が分からないしバグる
馬鹿自慢乙
馬鹿自慢乙
2021/09/12(日) 19:32:07.65ID:0tQ1ubt9
*p2++=*p1--
これは参照してるオブジェクトの値に化けてからアドレスを進めてるんですね。
なんとなく分かりました。ありがとうございます!
>>p1 = str1 + strlen(str1) - 1;
ここがなんかモヤモヤするんですけど
数字で表すとどんな感じになってるか教えてほしいです。お願いします。
これは参照してるオブジェクトの値に化けてからアドレスを進めてるんですね。
なんとなく分かりました。ありがとうございます!
>>p1 = str1 + strlen(str1) - 1;
ここがなんかモヤモヤするんですけど
数字で表すとどんな感じになってるか教えてほしいです。お願いします。
31蟻人間 ◆T6xkBnTXz7B0
2021/09/12(日) 19:38:22.89ID:G4gOb8CM str1が文字列の戦闘アドレスを刺している。それに文字列の長さマイナスいちを足すと文字列の最後の文字へのアドレスが得られる。
2021/09/12(日) 20:18:52.41ID:0tQ1ubt9
>>31
0+25-1って感じでしょうか?今回のケースの場合
0+25-1って感じでしょうか?今回のケースの場合
33蟻人間 ◆T6xkBnTXz7B0
2021/09/12(日) 20:37:03.69ID:G4gOb8CM >>32
Visual C++を使ってるならデバッグ厨二、ウォッチ死期で実際に確認で切るはずだ。
Visual C++を使ってるならデバッグ厨二、ウォッチ死期で実際に確認で切るはずだ。
34Mb
2021/09/12(日) 20:42:24.21ID:eZoXy3gP C言語というのは、unix の記述言語としてスタートした言語という経緯があって、
システム記述言語だから「基本的になんでもあり」みたいな危険な言語では
あるのですよ。
それを踏まえて向かいあうんだったら、ニモニックとかアセンブラとか
マクロアセンブラとか、そのあたりまで含めて勉強してほしいと思う。
C++ だって、C に一皮被せただけのマクロ言語だしね。
そこは、アセンブラとの関係まで含めて、勉強しておくといいかもしれない。
ツー手も、昨今の言語だと、「そういうところは気にしなくていい」というのが
潮流ではあるんだけどね。
システム記述言語だから「基本的になんでもあり」みたいな危険な言語では
あるのですよ。
それを踏まえて向かいあうんだったら、ニモニックとかアセンブラとか
マクロアセンブラとか、そのあたりまで含めて勉強してほしいと思う。
C++ だって、C に一皮被せただけのマクロ言語だしね。
そこは、アセンブラとの関係まで含めて、勉強しておくといいかもしれない。
ツー手も、昨今の言語だと、「そういうところは気にしなくていい」というのが
潮流ではあるんだけどね。
2021/09/12(日) 20:54:09.14ID:0tQ1ubt9
36はちみつ餃子 ◆8X2XSCHEME
2021/09/13(月) 00:44:43.40ID:b2LY5t5P アセンブラの詳細を理解する必要はないんだけれど、
C で書いたものがどういう機械語に対応付けられているのかおおよそにでも
知っておくと C の仕様が腑に落ちることは結構あるとは思う。
(現代的なコンパイラは超強力な最適化があるので一対一に対応付けられるようなもんではなくなってしまっているけど……。)
C で書いたものがどういう機械語に対応付けられているのかおおよそにでも
知っておくと C の仕様が腑に落ちることは結構あるとは思う。
(現代的なコンパイラは超強力な最適化があるので一対一に対応付けられるようなもんではなくなってしまっているけど……。)
2021/09/15(水) 10:15:40.95ID:v8RKbjHW
>>9
亀だけど、マイコン触ってるとスタック上から、下からはグローバル変数など固定配置のメモリ、
その上にヒープまたはそれに類するものがスタック間際までって割当になっててなるほどって思った。
スタックが伸びすぎても下がそこまで使ってなければぶっ飛ぶこともない的な。
スタックオーバーフローの割り込みとかありますしデバッガで様子はわかりますから気にすべきですが。
亀だけど、マイコン触ってるとスタック上から、下からはグローバル変数など固定配置のメモリ、
その上にヒープまたはそれに類するものがスタック間際までって割当になっててなるほどって思った。
スタックが伸びすぎても下がそこまで使ってなければぶっ飛ぶこともない的な。
スタックオーバーフローの割り込みとかありますしデバッガで様子はわかりますから気にすべきですが。
2021/09/15(水) 10:28:04.04ID:JucPjPcF
39デフォルトの名無しさん
2021/09/17(金) 20:49:49.30ID:inv44Tua ラズパイ pico \500
40デフォルトの名無しさん
2021/09/18(土) 08:22:38.19ID:bA/qQPAi STM32
2021/09/22(水) 02:00:31.84ID:T3iMh7Ht
char p[]="12345";
char *p="12345";
const char *p="12345";
先生、この違いをおしえてください。
char *p="12345";
const char *p="12345";
先生、この違いをおしえてください。
42はちみつ餃子 ◆8X2XSCHEME
2021/09/22(水) 04:32:30.60ID:1hd+XsHu >>41
char p[]="12345"; は
char p[6]; としたのと同じように領域が確保されてその内容が "12345" で初期化される。
たとえば p[2]=6; といったように内容を書き換えていい。
char *p="12345"; は
どこかの領域に "12345" という内容の文字列が存在して
p はそれを「指す」という状態。
文字列リテラルは書き換えてはいけない (書き換えたらその結果がどうなるかは保証されない)
というルールなので p[2]=6; というように書き換えるのは (型システム的に禁止されないにもかかわらず!) やるべきではない。
三つの例の内でこれが一番クソな仕様。
(余談だが現在の C++ では文字列リテラルは const 付きなので const を剥がして変数に代入することは出来ないように型システム的に保護されている)
const char *p="12345"; は char *p="12345"; と理屈は同じだが、
p が指している領域を書き換えることは (型システム的に) 出来ない。
char p[]="12345"; は
char p[6]; としたのと同じように領域が確保されてその内容が "12345" で初期化される。
たとえば p[2]=6; といったように内容を書き換えていい。
char *p="12345"; は
どこかの領域に "12345" という内容の文字列が存在して
p はそれを「指す」という状態。
文字列リテラルは書き換えてはいけない (書き換えたらその結果がどうなるかは保証されない)
というルールなので p[2]=6; というように書き換えるのは (型システム的に禁止されないにもかかわらず!) やるべきではない。
三つの例の内でこれが一番クソな仕様。
(余談だが現在の C++ では文字列リテラルは const 付きなので const を剥がして変数に代入することは出来ないように型システム的に保護されている)
const char *p="12345"; は char *p="12345"; と理屈は同じだが、
p が指している領域を書き換えることは (型システム的に) 出来ない。
2021/09/22(水) 10:30:17.08ID:T3iMh7Ht
ロボット制御に使いたいんですが、
アドレスaのchar領域cのnビット目(0-7)をon/offするマクロはどう書いたらいいですか?
関数ではなくマクロにしたいです。
#define BitOn(a,c,n) ???????
#define BitOff(a,c,n) ???????
アドレスaのchar領域cのnビット目(0-7)をon/offするマクロはどう書いたらいいですか?
関数ではなくマクロにしたいです。
#define BitOn(a,c,n) ???????
#define BitOff(a,c,n) ???????
2021/09/22(水) 10:51:34.30ID:jJoskI2c
45デフォルトの名無しさん
2021/09/22(水) 12:09:08.97ID:T3iMh7Ht >>44
ad1バイトのcharです
ad1バイトのcharです
46デフォルトの名無しさん
2021/09/22(水) 12:10:01.22ID:T3iMh7Ht aで指定される1バイトのcharです
47デフォルトの名無しさん
2021/09/22(水) 12:37:28.88ID:T3iMh7Ht 1バイト限定にすればcなしでもいいですね。
2021/09/22(水) 12:48:28.66ID:jJoskI2c
49デフォルトの名無しさん
2021/09/22(水) 15:58:45.17ID:KzVGjGnL そんなにたくさんパーツいらんやろ
2021/09/22(水) 16:10:13.68ID:jJoskI2c
>>49
ん?要らないのどれ?
ん?要らないのどれ?
51デフォルトの名無しさん
2021/09/22(水) 18:02:02.01ID:T3iMh7Ht すみません、質問した立場でアレですが、|=と&=は要らないと思いますw
2021/09/22(水) 19:14:02.21ID:jJoskI2c
>>51
そうなのか。気になるから解決してたら結果教えて。
そうなのか。気になるから解決してたら結果教えて。
2021/09/22(水) 19:37:07.36ID:u8cZI69m
&、| なしか、興味あるな…
2021/09/23(木) 16:53:43.78ID:lZOUN/j/
漏れはヘタレだから、ビットフィールド使ってRAM上で更新してバイト単位でポートに書けば良いやなんて考えちゃう。
2021/09/23(木) 17:55:47.84ID:T47aXDe3
>>51
なぜそう思ったw
なぜそう思ったw
2021/09/23(木) 18:30:20.38ID:KLbp/g+2
上位ワード下位ワードを取り出すって意味がよくわからないのですが
int main()
{
int a=77778888;
}
とあったら7777が上位ワードって事でしょうか?
int main()
{
int a=77778888;
}
とあったら7777が上位ワードって事でしょうか?
58デフォルトの名無しさん
2021/09/23(木) 19:09:52.18ID:KLbp/g+22021/09/23(木) 19:29:25.98ID:h/5qm19B
>>58
コンピュータの中のデータはすべてビット(0か1)の集まり
int は32ビットだったり16ビットだったりするが、とにかく0や1がいくつもならべてある
だけだ。
表示するのに、0111100010111101 とかだと長くてわかりづらい。
それを手短にわかりやすく表現しようと 4ビットづつまとめて表示したのが16進数
コンピュータの中のデータはすべてビット(0か1)の集まり
int は32ビットだったり16ビットだったりするが、とにかく0や1がいくつもならべてある
だけだ。
表示するのに、0111100010111101 とかだと長くてわかりづらい。
それを手短にわかりやすく表現しようと 4ビットづつまとめて表示したのが16進数
2021/09/23(木) 20:15:26.01ID:KLbp/g+2
61蟻人間 ◆T6xkBnTXz7B0
2021/09/23(木) 20:25:44.38ID:WyFAZLWz >>60
LOWORD/HIWORDは、ビットシフトと型キャストをしている。Visual C++なら定義を確認できるはずだ。
LOWORD/HIWORDは、ビットシフトと型キャストをしている。Visual C++なら定義を確認できるはずだ。
2021/09/23(木) 21:05:22.52ID:KLbp/g+2
63デフォルトの名無しさん
2021/09/24(金) 08:02:57.39ID:eotJkoo2 #define BitOn(a,c,n) ( a[c] |= 1<<c )
#define BitOff(a,c,n) ( a[c] &= ~(1<<c) )
#define BitOff(a,c,n) ( a[c] &= ~(1<<c) )
64デフォルトの名無しさん
2021/09/24(金) 08:06:02.22ID:eotJkoo2 間違えた
#define BitOn(a,c,n) ( a[c] |= 0x01<<n )
#define BitOff(a,c,n) ( a[c] &= ~(0x01<<n) )
よく使うよ
#define BitOn(a,c,n) ( a[c] |= 0x01<<n )
#define BitOff(a,c,n) ( a[c] &= ~(0x01<<n) )
よく使うよ
65デフォルトの名無しさん
2021/09/24(金) 08:12:56.68ID:eotJkoo2 8ビット=1バイト
1ワード=2バイト=16ビット
32ビットCPUなら、通常int は32ビットで2ワード。
1ワード=2バイト=16ビット
32ビットCPUなら、通常int は32ビットで2ワード。
66デフォルトの名無しさん
2021/09/24(金) 14:39:54.44ID:6iUyOY+3 CPUがBEかLEか判定するのに使うマクロを
#defineで描くとどんなのがありますか
#defineで描くとどんなのがありますか
67はちみつ餃子 ◆8X2XSCHEME
2021/09/24(金) 15:04:20.65ID:hNucDJal >>66
完全に仕様の範囲内かつ人が一切のヒントを与えずに結果が定数式になる形で自動判定するのはたぶん無理だと思う。
完全に仕様の範囲内かつ人が一切のヒントを与えずに結果が定数式になる形で自動判定するのはたぶん無理だと思う。
68デフォルトの名無しさん
2021/09/24(金) 15:43:32.44ID:zyC2bCW7 #define LE ( (1&0x00000001)!=0)?true:false)
#define BE ( (1&0x01000000)!=0)?true:false)
#define BE ( (1&0x01000000)!=0)?true:false)
2021/09/24(金) 15:47:22.20ID:U2st4CQ0
>>66
そんなこと考えるより環境のエンディアンに依存しないコードの書き方を学んだほうが良い。
そんなこと考えるより環境のエンディアンに依存しないコードの書き方を学んだほうが良い。
70デフォルトの名無しさん
2021/09/24(金) 15:55:16.30ID:6iUyOY+3 htonsですか?ωωω
2021/09/24(金) 21:07:09.60ID:naX2jA4f
?true:false
って、意味あるの?
って、意味あるの?
72デフォルトの名無しさん
2021/09/24(金) 22:00:46.33ID:eotJkoo2 意味ないよ
2021/09/24(金) 22:25:06.12ID:Dq17+3pv
gcc拡張なら
#define LE ({ int a = 1; ((const char *)&a)[0]; })
うごくかどうかはしらん
#define LE ({ int a = 1; ((const char *)&a)[0]; })
うごくかどうかはしらん
74デフォルトの名無しさん
2021/09/25(土) 11:13:09.39ID:lBxoEpbF !=0 って意味あるの?
2021/09/26(日) 21:10:08.57ID:0u8JLN98
!!って意味あるの?
2021/09/27(月) 00:30:15.47ID:qCKTTnQF
意味なくもないよ。
2021/09/27(月) 01:12:22.69ID:lw6R4pVu
!!は静的解析やコンパイラの警告黙らせる時に使える場合もあるよ
79デフォルトの名無しさん
2021/10/25(月) 12:19:02.96ID:hesMamgg char a[3]とした場合 aとa[0]は同じ←分かる
struct A a[3]とした場合 aとa[0]は違うんか?
struct A a[3]とした場合 aとa[0]は違うんか?
2021/10/25(月) 12:33:40.14ID:Rm/sO20O
81デフォルトの名無しさん
2021/10/25(月) 12:37:22.98ID:vmRZrQEp 同じじゃない
2021/10/25(月) 13:34:18.40ID:dRHq7DJG
「*a と a[0] は同じ」あるいは「a と &a[0] は同じ」と言いたかったのかな?
a の型はあくまで配列型、つまりこの場合は char[3] という型を持つ。
ただし配列が式中に現れた場合には配列の先頭要素を指すポインタに型変換するという規則によって
a と書いたら型 char* の値として解釈される。
先頭要素を指していることになるので a==&a[0] が満たされる。
で、この a[0] という表記もクセモノで、定義上はポインタ演算の構文糖であるという扱いになっている。
a[0] とは *(a+0) のこと。
&a[0] は &*(a+0) と同じということになるんだが、
演算子 & のオペランドが * の適用結果であるときはどちらの適用も無かったことになるというルールがあるので
&*(a+0) から &* は消去されて a+0 が残り、 0 を足しても結果は変わらないからこれも消去すると a が残る。
故に &a[0] == a
a の型はあくまで配列型、つまりこの場合は char[3] という型を持つ。
ただし配列が式中に現れた場合には配列の先頭要素を指すポインタに型変換するという規則によって
a と書いたら型 char* の値として解釈される。
先頭要素を指していることになるので a==&a[0] が満たされる。
で、この a[0] という表記もクセモノで、定義上はポインタ演算の構文糖であるという扱いになっている。
a[0] とは *(a+0) のこと。
&a[0] は &*(a+0) と同じということになるんだが、
演算子 & のオペランドが * の適用結果であるときはどちらの適用も無かったことになるというルールがあるので
&*(a+0) から &* は消去されて a+0 が残り、 0 を足しても結果は変わらないからこれも消去すると a が残る。
故に &a[0] == a
2021/10/26(火) 03:12:03.00ID:7iLVX7OB
VisualStudioでWin32APIの入門したいんですが
どのプロジェクトテンプレートを使えば良いのでしょうか?
どのプロジェクトテンプレートを使えば良いのでしょうか?
84デフォルトの名無しさん
2021/10/26(火) 15:39:42.99ID:4xSLwudN Console Application
2021/11/10(水) 17:51:26.04ID:TeMjyUmY
if elseから学びたいのですが、余計な習っていない文がついたサイトばかり出てきます。
どこを見ればいいのでしょうか
どこを見ればいいのでしょうか
2021/11/10(水) 19:04:16.39ID:TeMjyUmY
この際、本でもいいです。買います。
87蟻人間 ◆T6xkBnTXz7B0
2021/11/10(水) 19:05:31.96ID:Ibdkkh+M 普通にリファレンスを読めば?
2021/11/10(水) 19:45:30.62ID:TeMjyUmY
出来が悪すぎて
89蟻人間 ◆T6xkBnTXz7B0
2021/11/10(水) 19:50:39.71ID:Ibdkkh+M おむつ? おつむ?
2021/11/11(木) 18:53:34.61ID:N0+2xiNh
今、リファレンスなんてまともなの売ってない
頼んでもいない文が山盛りついていて、一からやりたい奴は苦労している
とほほのhtmlみたいなのは売ってないんだよ
頼んでもいない文が山盛りついていて、一からやりたい奴は苦労している
とほほのhtmlみたいなのは売ってないんだよ
2021/11/11(木) 18:54:29.97ID:N0+2xiNh
つまりリファレンス足り得てない本ばっか
いま、プログラムを始めるのは独学では不可能と言ってもいい
いま、プログラムを始めるのは独学では不可能と言ってもいい
2021/11/11(木) 18:57:09.08ID:N0+2xiNh
ちなみにオクにも出なくなったので手に入らない
2021/11/11(木) 18:58:20.42ID:N0+2xiNh
分かりづらい言い方しなければ、今はif elseから始める本は売ってない
94蟻人間 ◆T6xkBnTXz7B0
2021/11/11(木) 19:02:41.41ID:CgY0hHY1 紙のリファレンスを読むという発想で生き残れるとは思えない。そこはもうデジタルファイルかウェブだよ。
95蟻人間 ◆T6xkBnTXz7B0
2021/11/11(木) 19:07:22.97ID:CgY0hHY196蟻人間 ◆T6xkBnTXz7B0
2021/11/11(木) 19:16:03.47ID:CgY0hHY1 君等の政府を見てみよ。教科書すらデジタル化できない。日本語入力の標準化すらままならない。紙ベース、電話ベースの考えなんかデジタル化で吹っ飛ぶ時代なんだ。
2021/11/11(木) 19:17:19.43ID:N0+2xiNh
98蟻人間 ◆T6xkBnTXz7B0
2021/11/11(木) 19:24:27.07ID:CgY0hHY1 >>97
残念だが、C言語はC++に飲み込まれたんだ。だから今C言語のみを参照するのは時代遅れ。目次からC言語の部分を参照:
https://cpprefjp.github.io/reference.html#clib-facilities
残念だが、C言語はC++に飲み込まれたんだ。だから今C言語のみを参照するのは時代遅れ。目次からC言語の部分を参照:
https://cpprefjp.github.io/reference.html#clib-facilities
2021/11/11(木) 19:26:45.46ID:N0+2xiNh
簡素な実例を使って一個づつ説明しないんじゃ、初心者は誰も読めん
100蟻人間 ◆T6xkBnTXz7B0
2021/11/11(木) 19:27:19.47ID:CgY0hHY1 たとえば、C言語のprintf関数を見たいのであればC++のstd::printfを参照しないといけない。
101デフォルトの名無しさん
2021/11/11(木) 19:32:26.99ID:N0+2xiNh elseをさもなくば、とか訳すのな、それは合ってる
しかし
n>10とかifに入ってたのなら初心者には、さもなくばではなく
10より小さければ、という意味になります。と書かんといかん。
なんだかねえ、わざとやってんのか
全てを伝えづともそれくらい書かないとダメだろと言いたい
しかし
n>10とかifに入ってたのなら初心者には、さもなくばではなく
10より小さければ、という意味になります。と書かんといかん。
なんだかねえ、わざとやってんのか
全てを伝えづともそれくらい書かないとダメだろと言いたい
102はちみつ餃子 ◆8X2XSCHEME
2021/11/12(金) 00:56:45.47ID:r8IM8kKp >>98
そんなことはない。
C 由来の関数は C++ の規格では C の規格を参照していて、詳細は C の規格を見ないと書いてない。
C と C++ は付かず離れず平行して存続すると D&E でも言及されている。
だいたい C のほとんどの関数はそのまま使うには C++ では行儀が悪いことが多いだろ。
互換性の都合で仕方なく入ってるだけで、 C++ に取り込みたくなんてないと思う。
そんなことはない。
C 由来の関数は C++ の規格では C の規格を参照していて、詳細は C の規格を見ないと書いてない。
C と C++ は付かず離れず平行して存続すると D&E でも言及されている。
だいたい C のほとんどの関数はそのまま使うには C++ では行儀が悪いことが多いだろ。
互換性の都合で仕方なく入ってるだけで、 C++ に取り込みたくなんてないと思う。
103はちみつ餃子 ◆8X2XSCHEME
2021/11/12(金) 01:19:39.87ID:r8IM8kKp 入門書というのは必ずしも簡単ではないということは知っておいて欲しい。
その分野でまず必要な知識を書いてあるのが入門書というもので、専門書の一種には違いないわけで。
ハードルを下げようと思えばいくらでも下げられるし、
実際に絵本に毛の生えたような説明の仕方をしているものもあるのだけれど、
きちんとした知識にするにはそれなりに難解な部分だって最終的には避けられない。
入門書なのに難しすぎる! と思うこともあるかもしれないけど、実際にそれは入門に必要なんだってば。
その分野でまず必要な知識を書いてあるのが入門書というもので、専門書の一種には違いないわけで。
ハードルを下げようと思えばいくらでも下げられるし、
実際に絵本に毛の生えたような説明の仕方をしているものもあるのだけれど、
きちんとした知識にするにはそれなりに難解な部分だって最終的には避けられない。
入門書なのに難しすぎる! と思うこともあるかもしれないけど、実際にそれは入門に必要なんだってば。
104デフォルトの名無しさん
2021/11/12(金) 18:39:10.54ID:Ln6Hv7ms 必要ない
105デフォルトの名無しさん
2021/11/12(金) 18:39:46.26ID:Ln6Hv7ms そんな難解な教え方している専門学校ですらどこにもない
106蟻人間 ◆T6xkBnTXz7B0
2021/11/12(金) 19:13:06.89ID:BtQklgip アスキーとかナツメとか技術評論社あたりを当たると入門書が見つかると思うぜ。
107デフォルトの名無しさん
2021/11/12(金) 19:24:06.67ID:Ln6Hv7ms 売ってない
実在しない
どれだ
実在しない
どれだ
108デフォルトの名無しさん
2021/11/12(金) 19:29:27.55ID:Ln6Hv7ms 害虫がまた初心者向けに少しでもなるようなページを検索結果から消しているな
109デフォルトの名無しさん
2021/11/12(金) 19:35:48.17ID:Ln6Hv7ms そんなに早死にしたいのかねえ
110デフォルトの名無しさん
2021/11/26(金) 12:10:38.20ID:ncT7Zn6W >>38
秋月のPIC用c使ってるけどこれ規格準拠する気更々ないよな、cっぽいナニカ
まあアマチュア向けで気にすることも無いと思うけど
するとPCスマホ組み込みサポート網羅すべく頑張ってるc規格が可哀想に思えてくる…
秋月のPIC用c使ってるけどこれ規格準拠する気更々ないよな、cっぽいナニカ
まあアマチュア向けで気にすることも無いと思うけど
するとPCスマホ組み込みサポート網羅すべく頑張ってるc規格が可哀想に思えてくる…
111デフォルトの名無しさん
2021/11/28(日) 00:02:18.62ID:A21vXR4U スタック数段のマイナーマイコンcだと関数スコープから呼べない標準関数があったりしたな
何段消費するか明示して欲しい
まさかテストケースをグローバルで書いてるわけないよな
何段消費するか明示して欲しい
まさかテストケースをグローバルで書いてるわけないよな
112デフォルトの名無しさん
2021/11/28(日) 00:41:12.56ID:1ODb51AX 徹底的に呼び出し避けたマクロライブラリも挙動不審になりがちだしあきらめよう
113デフォルトの名無しさん
2023/06/11(日) 23:42:34.62ID:NEZaQnIG >>66
#defineでは書けなかった
でもif文で処理を分ければ最適化で通らない処理とif文の処理は削除される
int a=1;
if((char)a==0)
{
;
}
else
{
;
}
こんな感じ
#defineでは書けなかった
でもif文で処理を分ければ最適化で通らない処理とif文の処理は削除される
int a=1;
if((char)a==0)
{
;
}
else
{
;
}
こんな感じ
114デフォルトの名無しさん
2023/06/12(月) 04:26:28.49ID:wqSZy/1p 間違えた
int a=1;
if(*((char *)&a)==0)
{
;
}
else
{
;
}
こんな感じ
int a=1;
if(*((char *)&a)==0)
{
;
}
else
{
;
}
こんな感じ
115デフォルトの名無しさん
2023/09/21(木) 22:09:39.70ID:6guGpWia ほんまにかいな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★4 [BFU★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す [蚤の市★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【卓球】早田ひな、「総額100万スられた」「ずっと憧れていたスペインとイタリア…」ヨーロッパ旅行で悲劇 スリ被害を告白 [muffin★]
- 【緊急】佳子さま、コロナ感染!高市発言なんかより非常事態※最新画像 [219241683]
- 【悲報】ネトウヨ「なんで高市が謝るんだよ!岡田が謝れ!😡」 [359965264]
- 【実況】博衣こよりのえちえち歌枠🧪★2
- 産経新聞「高市早苗の答弁さぁ……思慮が足りてなくね?官僚と詰めずに思いつきで話しているでしょ」 [175344491]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
