何にも知らない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で描くとどんなのがありますか
■ このスレッドは過去ログ倉庫に格納されています
