C言語なら俺に聞け 142 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8a6f-bDrV)
垢版 |
2017/08/10(木) 20:21:23.44ID:hEocmkh50
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://mevius.2ch.net/test/read.cgi/tech/1500293207/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
463デフォルトの名無しさん (ワッチョイ 4b32-HyX/)
垢版 |
2017/10/04(水) 06:19:36.24ID:Sd/env2d0
>>452
存在するだろ
char charList[32]と等価になるぞ
2017/10/04(水) 06:24:24.64ID:dCjKMF950
二次元配列の宣言についての話で合って
コンパイルが通るかどうかだけの話なんてしてねーぞ
2017/10/04(水) 07:22:39.57ID:zhlDARQmM
>>462
func何やってんの?
2017/10/04(水) 08:10:59.64ID:F93q6j3ba
*charList=0とかやってんじゃない?
2017/10/04(水) 08:22:11.58ID:F93q6j3ba
ってか二次元配列と二重配列間違ってねーか?
それとfunc呼んでからmemsetしたらfunc呼ぶ意味あるの?
memsetもループさせるんじゃなく一回で全部fillした方がよくない?
とかとか。
2017/10/04(水) 11:24:36.83ID:hBVSLcAId
>>467
1行目 イミフ
2行目 意味があるから呼んでるんだろ
3行目 明確な利点があるならそれを書け
2017/10/04(水) 13:29:31.00ID:ugGBRoRga
>>468
ポインタの配列と二次元配列を間違ってるのではないかってこと。
書き込んだあと空白で埋めたら意味なくないか?funcが何してるか知らんけど
2017/10/04(水) 13:49:31.85ID:hBVSLcAId
>>469
funcの中身を知らないのに「意味無い」とか「意味あるの?」とかっていう書き込み、意味あるの?
それを聞けば問題の解決になるの?

少なくとも空白を埋めてない部分があるし
問題が発生する範囲で簡略化したのかもしれないし
当然意味があるから呼んでるんだろうと思うのが普通
2017/10/04(水) 14:20:16.63ID:Ot6iICCz0
C言語は俺に訊くなスレになってるな
2017/10/04(水) 14:30:40.85ID:eeE5kOTG0
最近オブジェクト指向が入り口で、C言語がわからんっていう子が多いからなあ
2017/10/04(水) 14:50:53.16ID:38WTG0/g0
再現する最小限のコードに削ってるうちに問題点を自ら発見して終了
2017/10/04(水) 14:54:54.68ID:PNa+p1hk0
つーかfunc()以外の部分で特に問題が見当たらないならfunc()のせいで確定という単純明快な話
自作コードならfunc()もうpできるっしょ
2017/10/04(水) 14:56:07.21ID:6Zs0a9ZSa
>>470
出されたソースのコメント見ると、配列の考え方が間違ってるように感じるけどね。それを示唆したかっただけだよ。
2017/10/04(水) 15:12:09.84ID:f7rOF4qk0
>>462
ふと疑問に思ったんだが、

>func(charList); // charListに書き込む関数

関数を呼び出す際に、nの値を教えなくて良いのか?
2017/10/04(水) 16:34:23.23ID:hBVSLcAId
>>475
例外とは関係ない
合コンじゃないんだから無駄に話を広げる必要はない
問題の解決が遅くなるだけ
2017/10/04(水) 16:35:46.39ID:hBVSLcAId
あとはfuncの中身を見ないとなんとも

組み込みのショボい環境だとスタックオーバーフローって可能性も無いことは無いが
479デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:51:26.35ID:+admsRHQ0
struct I2C_MEM //構造体の型宣言
{
char DEV_ADR ;
char REG_ADR ;
char DATA[0x03] ;
};



struct I2C_MEM I2C_MEM[3] =//構造体の型宣言
{
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x01 , 0x00000000 }
} ;
480デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:56:16.34ID:+admsRHQ0
↑構造体の初期化で
charを連続4byte設定するときの書き方
0x00000000はたぶん違いますよね?
どう書けば良いんですか?

初心者過ぎてすいません
481デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 16:59:03.20ID:+admsRHQ0
struct I2C_MEM      //構造体の型宣言
{
char DEV_ADR ;
char REG_ADR ;
char DATA[0x03] ;
};

struct I2C_MEM I2C_MEM[3] =     //構造体の初期化
{
{ 0x7C , 0x01 , 0x00000000 }
{ 0x7C , 0x02 , 0x00000000 }
{ 0x7C , 0x03 , 0x00000000 }
} ;
2017/10/04(水) 17:01:20.64ID:HMkkIXOid
>>479
> struct I2C_MEM
> {
> char DEV_ADR ;
> char REG_ADR ;
> char DATA[0x03] ;
> };
struct I2C_MEM I2C_MEM[3] =
{
{ 0x7C , 0x01 , {0} }
{ 0x7C , 0x01 , {0} }
{ 0x7C , 0x01 , {0} }
} ;
483デフォルトの名無しさん (ワッチョイ 35d2-asy+)
垢版 |
2017/10/04(水) 17:04:07.51ID:+admsRHQ0
>>482

回答ありがとうございます!
ちなみにこれだったらどうかくんでしょうか?



struct I2C_MEM I2C_MEM[3] =     //構造体の初期化
{
{ 0x7C , 0x01 , 0x12345678 },
{ 0x7C , 0x02 , 0x12345678 },
{ 0x7C , 0x03 , 0x12345678 },
} ;
2017/10/04(水) 17:19:18.44ID:HMkkIXOid
>>483
struct I2C_MEM I2C_MEM[3] =
{
#ifdef BIG_ENDIAN //ビッグエンディアンの場合
{ 0x7C , 0x01 , {0x12, 0x34, 0x56, 0x78} },
{ 0x7C , 0x02 , {0x12, 0x34, 0x56, 0x78} },
{ 0x7C , 0x03 , {0x12, 0x34, 0x56, 0x78} },
#else // リトルエンディアンの場合
{ 0x7C , 0x01 , {0x78, 0x56, 0x34, 0x12} },
{ 0x7C , 0x02 , {0x78, 0x56, 0x34, 0x12} },
{ 0x7C , 0x03 , {0x78, 0x56, 0x34, 0x12} },
#endif
} ;
2017/10/04(水) 17:21:40.35ID:HMkkIXOid
>>484
> char DATA[0x03] ;
おっと、これじゃあ4バイト入らないぜ。
char DATA[4];
にしないと。
2017/10/04(水) 17:27:10.52ID:PA2rRcfg0
全くどうでもいいことだが最近の若いモンはスマホに合わせて上矢印なのな
一つ勉強になった
487デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/04(水) 17:28:20.90ID:VznoOWf36
PCでも上じゃね?
2017/10/04(水) 17:40:04.96ID:HMkkIXOid
>>484

#ifdef BIG_ENDIAN
# define ENDIAN_FIX(a,b,c,d) a,b,c,d
#else
# define ENDIAN_FIX(a,b,c,d) d,c,b,a
#endif

struct I2C_MEM I2C_MEM[3] =
{
{ 0x7C , 0x01 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
{ 0x7C , 0x02 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
{ 0x7C , 0x03 , {ENDIAN_FIX(0x12, 0x34, 0x56, 0x78)} },
} ;
2017/10/04(水) 18:04:30.94ID:9y3nqzOw0
構造体の中身から推測すると、
書く順番はエンディアンに依存しないと思う
単純に配列の頭から1バイトずつ送信するだけ

仮にエンディアンで順番が変わるとしても
どうせガッツリ環境依存なコードなんだから
依存しちゃえばいい
環境依存が無いコードを書くつもりなら、
charが1バイトかどうかにも依存しないようにしないとね
2017/10/04(水) 18:10:15.78ID:9y3nqzOw0
>>488みたいなマクロは最悪
エンディアンていう言葉を覚えたばっかりの初心者が作る糞コード
491デフォルトの名無しさん (ガックシ 06cb-huvM)
垢版 |
2017/10/04(水) 18:48:35.51ID:VznoOWf36
もちつけよw
2017/10/04(水) 19:22:55.76ID:HMkkIXOid
エンディアンについて解説が必要ですか?
はい/いいえ
2017/10/04(水) 20:07:04.96ID:V7FXDajl0
いいえ
2017/10/04(水) 20:09:03.80ID:V7FXDajl0
Definitely no.
2017/10/04(水) 20:18:42.31ID:38WTG0/g0
struct I2C_MEM //構造体の型宣言
struct I2C_MEM I2C_MEM[3] =//構造体の型宣言

この手の文法で自明なことをコメントにする文化はなくならないのかな
2017/10/04(水) 20:46:10.64ID:hBVSLcAId
俺のコードはその対極
大きな流れしかコメントをかかない
2017/10/04(水) 21:20:04.88ID:azmmV5/P0
I2Cか。データは8ビットで受けて、8ビットシフトしてビットORだな。
data = hi<<16 | mid<<8 | lo
2017/10/04(水) 21:27:53.34ID:hBVSLcAId
どう見ても送信
2017/10/04(水) 21:31:39.40ID:hBVSLcAId
>>492
お前の糞マクロ、どの辺が糞か解説が必要?
2017/10/04(水) 21:32:35.25ID:hBVSLcAId
ちなみに、ゆで玉子は輪切り派
501デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/05(木) 01:23:13.38ID:ioWgBjMx0
>>483
やってみな。
2017/10/05(木) 01:24:28.79ID:ioWgBjMx0
やってみなじゃない。どう動くかじゃなくてどう書くかか。
どうなって欲しいのかが書かれてないから答えられないな。
2017/10/05(木) 03:25:02.16ID:JVwY/YZa0
>>465
全体のコードは自作というか(自社製)ですが、funcは他社のライブラリなんです。
ソースがあればなんとかなったのかもですが・・・。

>>467
実際はfunc呼んだ後にcharListの値を呼んで色々作業しています。

>>469
普通の2次元char配列のつもりです。2次元配列というのはC言語的にはシンタックスシュガーにすぎず、
char a[m][n]もchar a[m*n]も等価なのですよね。なので、先頭ポインタから(m*n-1)個先までの
アドレスの範囲内なら範囲外アクセスエラーは起こり得ないと理解しています。



>>474の結論に至る前に、何かC言語で致命的な勘違いや思い込みをしているのかと
思って質問した次第です。今思うとエスパー回答を強いてしまって大変申し訳ありませんでした。

ひとまずはfuncを一切呼ばない形に直して事なきを得ました。
>>437で言った、「charListをプリントしたりすると何故か問題なく動く」からそれで一時凌ぎする考えも
頭をよぎりましたが、思いとどまりました。

ひとまずこれで終えます。回答くださった方々、本当にありがとうございました。
2017/10/05(木) 03:26:43.92ID:JVwY/YZa0
>>503
×charListの値を呼んで
○charListの内容をstringに変換して(charListは不変)
2017/10/05(木) 05:32:30.50ID:PdAAtG4s0
>>503
>char a[m][n]もchar a[m*n]も等価なのですよね

そうだっけ?
2017/10/05(木) 05:39:44.88ID:+DJIpzmcM
char[m][n]はchar**、char[m*n]はchar*、データ型は違う
2017/10/05(木) 08:10:49.48ID:2SMjslBqM
funcに与える引数の条件がちゃんと理解できてないとか
2017/10/05(木) 08:15:39.56ID:Nh1QNpvaF
char[m*n]って何?
結局ただの一次元配列でしょ?
509デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/05(木) 10:10:50.98ID:6niZC7Nf0
>>506
堂々と嘘つくんじゃねえ
sizeof(char[m][n]) != sizeof(char**)
2017/10/05(木) 10:11:07.83ID:TrTYAooo0
>>503
> 2次元配列というのはC言語的にはシンタックスシュガーにすぎず、
> char a[m][n]もchar a[m*n]も等価なのですよね。なので、先頭ポインタから(m*n-1)個先までの
> アドレスの範囲内なら範囲外アクセスエラーは起こり得ないと理解しています。

だいたいの実装では、特に char 類なら、動作上問題が起こることは考えにくいものの、
言語規格上の保証は無いよ。
https://www.jpcert.or.jp/m/sc-rules/c-arr30-c.html
511デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/05(木) 12:14:43.27ID:6niZC7Nf0
そういう保証は紙っきれの条文より自分で確認・検証することが最重要だ
いくら「保証されている」ことでもコンパイラがバグったり中には確信的に違反するケースまである

空想論の域を出ないくだらんことのために
現実的なアイディアを諦めていては生産性が上がらない
512デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/05(木) 12:51:26.83ID:TRdRMfhC0
struct I2C_MEM
{
char DEV_ADR ;
char REG_ADR ;
char DATA[4] ;
} static I2C_MEM0 ;


I2C_MEM0.DEV_ADR = 0x7C ;
I2C_MEM0.REG_ADR = 0x01 ;
I2C_MEM0.DATA[4] = { 0x11,0x12,0x13,0x14 } ;  ←これはエラーになる
//I2C_MEM0.DATA[0] = 0x11 ;            ←こちらのパターンはエラーにならない
//I2C_MEM0.DATA[1] = 0x12 ;
//I2C_MEM0.DATA[2] = 0x13 ;
//I2C_MEM0.DATA[3] = 0x14 ;

4バイト一気に設定の書き方はどうすればいいんでしょうか?
2017/10/05(木) 12:51:30.07ID:/OlbfMDH0
コメント邪魔
2017/10/05(木) 12:52:03.70ID:/OlbfMDH0
誤爆m(_'_)m
2017/10/05(木) 12:59:34.91ID:/OlbfMDH0
>>512
一気に初期化する必要性がわからんが

糞コード
assert( 4 == sizeof ( unsigned long ) );

*( unsigned long* )I2C_MEM0.DATA = *( unsigned long* )"\x11\x12\x13\x14";
2017/10/05(木) 13:01:44.78ID:gOaVCYiad
>>512
配列の複数の要素を一気に代入する記述はない
そういう風にひとつひとつ代入するか
memcpy使ったり構造体にして代入したりする
517デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/05(木) 13:04:36.67ID:TRdRMfhC0
なるほどー ありがとうございました
2017/10/05(木) 13:06:18.55ID:/OlbfMDH0
ARMだと1バイトづつ初期化した方が小さくなるような気がする
519デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/05(木) 13:13:39.58ID:/W/G46pt6
無名配列のリテラルは初期化時には使えるけど代入には使えないってこと?
520デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/05(木) 13:16:53.65ID:/W/G46pt6
初期化時というか宣言時
2017/10/05(木) 19:51:18.71ID:72rIdNeW0
ビッグエンディアンの環境を教えてください
2017/10/05(木) 20:02:42.15ID:Xv32D2hUd
HP-UX、MOTOROLA、AIX、Solaris
2017/10/05(木) 20:09:22.11ID:Xv32D2hUd
Apple PowerPC Mac、Sun Blade、SGI O2??
2017/10/05(木) 20:14:07.63ID:Xv32D2hUd
ビッグエンディアンの仮想環境はQEMU以外にないから、エミュレータを作れば有名になれるよ。
2017/10/05(木) 20:29:07.01ID:Xv32D2hUd
>>524
ごめん、PowerPCのエミュレータにPearPCがあった。
2017/10/05(木) 20:30:19.57ID:3IfCpLlr0
SH
2017/10/05(木) 20:32:46.00ID:Xv32D2hUd
SolarisエミュレータにCHARONがある(有料)。ビッグエンディアンの環境はお金がかかるよ。
2017/10/05(木) 20:34:21.70ID:3IfCpLlr0
整数の負の数に1の補数を用いる環境
整数の負の数に絶対値と符号ビットを用いる環境
整数にトラップ表現がある環境
charが8の倍数ビットでない環境

を教えてください
529デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/05(木) 20:34:53.22ID:olaqz/S6p
ARMは選択出来たっけ?
まあ、みんなリトルで使ってるがな。
地味にMicroBlazeがビッグだな。
2017/10/05(木) 20:39:08.91ID:3IfCpLlr0
MIPSもバイ

ミドルエンディアンの環境を教えて下さい
2017/10/05(木) 20:41:19.68ID:3IfCpLlr0
おれはリトル
わざわざお尻から食べないよね普通
2017/10/05(木) 20:42:01.73ID:Xv32D2hUd
博物館に所蔵されてるようなコンピュータ調べて何の意味があるんだろう。。。
2017/10/05(木) 20:44:02.75ID:3IfCpLlr0
>>522 >>523 のこと?
2017/10/05(木) 20:46:00.84ID:Xv32D2hUd
>>528
絶滅したコンピュータアーキテクチャの話はしたくない。
535デフォルトの名無しさん (ササクッテロレ Sp75-Zdu/)
垢版 |
2017/10/05(木) 20:46:52.00ID:olaqz/S6p
6502とか、地味に生きてるやん?
あ、あれはエミュレータか。
2017/10/05(木) 21:04:49.44ID:Xv32D2hUd
ほとんどの環境のcharが8ビットなのは、基本ASCIIが7ビットで表現できることと、7ビットより8ビットの方が切りが良くてパリティビットなどに使えて便利だったことによる。
537デフォルトの名無しさん (ワッチョイ 054b-5Ff0)
垢版 |
2017/10/05(木) 21:09:26.31ID:PAHxl06e0
最近C言語ハマってる
言語がシンプルなのと直にコンピュータを操ってる感
2017/10/05(木) 21:16:28.12ID:Xv32D2hUd
charが7ビットだったら、パックトBCDもなかった。
2017/10/05(木) 21:25:12.02ID:Xv32D2hUd
7ビットだったら1バイトの16進表示で1ビット無駄になるところだった。
2017/10/05(木) 21:44:27.38ID:Xv32D2hUd
GCCかLLVMを使えば、適当なアーキテクチャのC言語コンパイラーを自由に作ることができるらしい。
2017/10/05(木) 21:54:15.38ID:Xv32D2hUd
まあ、例えばNintendo SwitchのアーキテクチャをGCCかLLVMで定義すれば、そのアーキテクチャのコンパイラーが作れる訳だ。
2017/10/05(木) 22:04:36.58ID:dkgh60ez0
そういう用途なら「高位合成」でggrと幸せになれるぞ
LLVMは多分出番なしだ
2017/10/05(木) 23:19:53.46ID:G8RM0vBkM
スイッチはテグラじゃないの?
2017/10/05(木) 23:34:31.98ID:Xv32D2hUd
うん、NVIDIA Tegra のカスタムだね。例えが悪かったか。
2017/10/05(木) 23:36:35.55ID:3IfCpLlr0
>>536
charが16bitなら最近使ったけど
546デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/05(木) 23:58:01.04ID:ioWgBjMx0
>>512
strncpy(I2C_MEM0.DATA, "\x11\x12\x13\x14", 4);
547デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/06(金) 00:05:52.06ID:L6h7mNkA0
実行時間の長い再帰関数(ハノイの塔)を実行しながら過程をglutというOpenGLライブラリで開いたウィンドウに描画させたいのですが方法ありませんか?
ステップ毎に再帰関数を最初から実行するしかないですか?
2017/10/06(金) 01:40:53.41ID:tqIbkLAn0
再帰して、関数を無限に呼ばない。
答えをメモ化しろ

「メモ化」で検索!
549デフォルトの名無しさん (ワッチョイ 558d-wbjw)
垢版 |
2017/10/06(金) 01:51:40.09ID:FhOeSxdK0
-1.400000e+01 2.043459e+01 1.738866e-15
-1.398525e+01 2.029842e+01 3.900652e-01
-1.399008e+01 2.029842e+01 -1.300367e-01

3DデータのSTLと言う形式で使われてるこの様な数字の型は
printfで出力する場合どの型フィールドになるのでしょうか
%e %gだけでは何だか違います
550デフォルトの名無しさん (ワッチョイ 059f-XSap)
垢版 |
2017/10/06(金) 02:18:01.36ID:x0C9073k0
>>549
いやずばり %e だと思うが?
2017/10/06(金) 03:03:00.77ID:RA0YJgv70
>>546
最近出来た関数かな?
552デフォルトの名無しさん (ワッチョイ 059f-TYR1)
垢版 |
2017/10/06(金) 03:37:10.08ID:x0C9073k0
>>551
最近って・・・うーん。
2017/10/06(金) 03:40:43.51ID:aYA4G4wj0
>>547
ハノイの塔の実行スレッド(A)と描画スレッド(B)を別にする
Bは計算過程を変数Cに書き込む
Aは画面リフレッシュのタイミングでCを描画
2017/10/06(金) 03:41:39.90ID:aYA4G4wj0
逆だw
Aは計算過程を変数Cに逐次書き込む
Bは画面リフレッシュのタイミングでCを描画
2017/10/06(金) 04:15:34.73ID:RA0YJgv70
>>552
memcpyとか、strcpyとか、strncpyは知っているし、_s付き
なんてのも知っているけど、これは初めてかな
2017/10/06(金) 06:22:04.70ID:RySAjNni0
スペルミスかと思ったけど合ってるよな
間違い探し難しい

どこが変?
2017/10/06(金) 07:43:06.02ID:p4va+yl10
検索でちゃんと 555 と 546 がヒットするし何か見間違えたんだろうか
2017/10/06(金) 07:45:29.75ID:iQ5MtuBR0
目を細めて見るとstmcpyに… いや無理があるな
2017/10/06(金) 08:33:19.91ID:4Iec6HYc0
老眼がすすんで字が読めなくなったジジイだろ
>>546が本当にスペルミスだったとしても全然面白くないツッコミだし

老害は早く死ねば良いのに
2017/10/06(金) 09:47:31.52ID:RA0YJgv70
str[n]cpyが最後に0を書く条件は?
memcpyを使わない理由は?
561デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/06(金) 10:38:12.40ID:EDz06gtM6
自分のミスはスルー
2017/10/06(金) 10:39:45.78ID:d6jfQR1X0
strncpyは0で終端される条件が毎回わからなくて敬遠していたんです。
でも、strlcpyを使うようになってから肌年齢が10歳若返りました!
今は毎日がとっても楽しいです。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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