X



C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©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
0567デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 15:16:39.88ID:qH0Ei3hn0
>>566
形容詞には比較をつけろ
一年目でおぼえる初歩だろうがボケ
0568デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/06(金) 15:20:28.76ID:B4vVDMXU0
うんち!
0571デフォルトの名無しさん (ワッチョイ b632-rzHd)
垢版 |
2017/10/06(金) 20:42:56.05ID:qH0Ei3hn0
>>569
朝鮮語か日本語かには関係ない
電気屋のルールだ
0572デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/07(土) 14:47:24.49ID:f9dDdlSq0
>>555
>>546にはそのstrncpy()が書かれているが?
0573デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 10:02:50.14ID:iaWD4MFGE
PHPしかできないザコだったけどC言語が楽しい
Cのスタンダードなコーディングスタイルってないですか?
インデントにタブ使ってたりifに{}使ってなかったりするコードをよく見かけますけど
0578デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/08(日) 13:04:33.16ID:SXbZ1Yc30
>>573
ほんまC言語楽しいよな
俺もC#かWeb系スクリプト言語しか使ったことなかったんだが
0580デフォルトの名無しさん (ワッチョイ 0516-5Ff0)
垢版 |
2017/10/08(日) 13:05:13.53ID:SXbZ1Yc30
C++はゴミ
0581デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/08(日) 14:51:03.41ID:c+/m9riq0
>>579
いやタブ1つにして表示幅はスペース4つ分だ。
0582デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/08(日) 14:54:49.62ID:c+/m9riq0
>>576
ああ。もうこのスレはスペース開けるか開けないか改行するかしないか何文字にするか中括弧はどうするか行末にバックスラッシュ入れて次行に書くか書かないかgotoどうするか等の話で延々と10年ぐらい費やされるんだろうな。
もちろんエディタの話に飛び火してviがvimがemacsがとなる。
0585デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/08(日) 16:00:19.88ID:tULmhvm40
ちょっと教えてくださいとあるHPから抜粋
意味が分からないので解説お願いします
私が負荷した文は<<  >>で囲みます

struct Person {
char name[20];
int sex;
// char sex;
int age;
double height;
double weight;
} person_s;               <<←今までの自分の認識:Person構造体のインスタンスperson_sを生成 しかしこの認識は後述@でpがインスタンスであると推定できることから間違っていると推定できる>>
                      << person_sは構造体宣言の為の鋳型と推定 しかし様々なプログラムをチェックするとここでインスタンス宣言している例も見受けられる >>
                      << 変数が構造体宣言の為の鋳型なのかインスタンスなのかはコンパイラが記述から自動判断???>>
person_s p;               << ←pがPerson構造体のインスタンスであることは後述@のメンバ呼び出しで推定できる >> 

とかけば、不要な宣言を減らすことができます。
構造体メンバの初期化
各メンバの初期化方法として次のようなものがあります

person_s p = {"Tom", 0, 20, 175.2, 66.5};  <<←構造体宣言鋳型person_sを使用しpをインスタンス宣言??>>

// または

person_s p;         << 構造体宣言鋳型person_sを使用しpをインスタンス宣言?? >>
p.name = "Tom";     << この記述でpが構造体Personのインスタンスであると推定できる ・・・@ >>
p.sex = 0;

<< person_sは構造体宣言の鋳型 pはインスタンスであると推定できるが >>
<< 何故ダイレクトにPersonを使ってpを宣言しないのか? >>
<< 何故person_sなどという変数を使って間接的に宣言するのか? >>
<< うんちくきぼんぬ >>
0591デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/08(日) 17:16:54.10ID:tULmhvm40
なるほどー ありがとうございました
0592デフォルトの名無しさん (ワッチョイ b68a-YM+x)
垢版 |
2017/10/08(日) 17:26:51.19ID:F9J/pQ0V0
>>590
C++ではtypedefは不要だよ(別にあっても構わないけど)
structとclassはメンバーのデフォルト設定がpublicかprivateかという違いを除けば構文的には全く同じように使える
structで継承することすら出来る
0593デフォルトの名無しさん (ワッチョイ 75b3-qWqy)
垢版 |
2017/10/08(日) 17:32:00.82ID:dE95R3nJ0
>>592
論点はそこじゃなくて
 struct Person { };
 Person p;
が C++ では文法として通るのは指摘の通り

質問元の記述では
 struct Person { } person_s;
 person_s p;

こうなってるから、これじゃ C++ の文法でも通らないでしょうよ ってことで
0594デフォルトの名無しさん (ワッチョイ b68a-YM+x)
垢版 |
2017/10/08(日) 17:37:28.39ID:F9J/pQ0V0
通るよ
class宣言ではいちいちtypedefなど使わないのと同じように構造体でもtypedefは省略するのが一般的
むしろ先頭の構造体テンプレート名を省略して最後の型名だけ宣言する場合も多い
0602デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 19:03:56.08ID:uO7C8UFXE
コーディングスタイルってたくさんあるんですね
とりあえず検索したらエリートの人達が使ってそうなものを集めてみました

C Coding Standard - CMU (ECE)
https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html
GNU Coding Standards
https://www.gnu.org/prep/standards/html_node/Writing-C.html
NASA C Style Guide
http://homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf
C Coding Style - GNOME Developer Center
https://developer.gnome.org/programming-guidelines/stable/c-coding-style.html.en
CERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
Linux kernel coding style
https://www.kernel.org/doc/html/v4.10/process/coding-style.html

どれも難しそうなのでコーディングスタイル見るのやめようと思います。
githubで適当に見ても全然統一されてないし
とりあえずインデントは空白8個で{}を省略しないルールだけにしたいと思います。
0603デフォルトの名無しさん (エーイモ SEda-2JKf)
垢版 |
2017/10/08(日) 19:04:57.70ID:uO7C8UFXE
空白8個なのはメモ帳で見た時にこのくらいだから合わせてるだけです
0609デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/09(月) 01:05:37.72ID:6VRPxojV0
マンデルブロの描画がうまくいきません。ズームするとすぐに単調になってしまいます。

動画
https://youtu.be/Ompp_YwrLPw

ソースコード
http://codepad.org/mlm33eRT
0612デフォルトの名無しさん (ワッチョイ 7575-5Ff0)
垢版 |
2017/10/09(月) 01:53:40.87ID:6VRPxojV0
>>610
一応クリックするとある境界線付近を拡大するようにプログラムに書いてるのですが...
0616デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/09(月) 08:53:44.75ID:IXUwPWpS6
>>613
変えても同じでした
>>614
>>615
なるほど!家に帰ったらやって見ます!
0620デフォルトの名無しさん (ガックシ 060e-5Ff0)
垢版 |
2017/10/09(月) 12:12:59.35ID:9ioWbZDx6
Linuxのソースコードは?
0622デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:12:40.72ID:98rFBdXp0
■■たびたびお世話になります なにが悪いのかご指摘おねがいします■■

struct I2C_MEM 
{
char DEV_ADR ;
char REG_ADR ;
char DATA[4] ;
} static I2C_MEM[2] ;

task02_tst ( struct I2C_MEM *aaa )
{
char i,a[2],b[2],c[2];
i = 0 ;

while ( i <= 1 )
{
aaa -> DEV_ADR ;
a[i] = *aaa ;         // データタイプがインコンパチでエラーになる char DEV_ADR を参照してくれない?
aaa -> REG_ADR ;
b[i] = *aaa ;        // データタイプがインコンパチでエラーになる char REG_ADR を参照してくれない?
aaa -> DATA ;
c[i] = *aaa         // データタイプがインコンパチでエラーになる char DATA を参照してくれない?
p += 1 ;

i += 1 ;
}
}
0623デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:22:20.38ID:98rFBdXp0
↑単純に関数内で構造体のデータにポインタ+インデックスでアクセスしたい
0624デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 14:26:06.29ID:98rFBdXp0
間違い発見
p += 1 ; は aaa += 1 ; に置き換えてください
0625片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdfa-yc5c)
垢版 |
2017/10/09(月) 14:39:31.76ID:vdfcSFiBd
>>622
何がしたいのかわからない。
代入の左辺は右辺と互換性のある型じゃないといけないし、配列まるごとの代入はできない。
まずは代入の型をそろえないと。
0627デフォルトの名無しさん (ワッチョイ 5ae1-bBfX)
垢版 |
2017/10/09(月) 15:26:29.02ID:G+wiEnLh0
>>622
> aaa -> DEV_ADR ;
> a[i] = *aaa ;

例えばこの部分は a[i] = aaa->DEV_ADR; という処理を意図してるのではないかと思う
ただし aaa->DATA のところは char* 型になるので char 型の c[i] に代入できない
0628デフォルトの名無しさん (ドコグロ MM0d-Nz6W)
垢版 |
2017/10/09(月) 15:56:12.50ID:of8Vs49yM
>>622
エスパーするとたぶんこう言うことだと思う
task02_tst ( struct I2C_MEM *aaa ){
int i;
char a[2],b[2],c[2];
for(i = 0; i < 2; i++){
a[i] = aaa[i].DEV_ADR;
b[i] = aaa[i].REG_ADR;
c[i] = aaa[i].DATA; // ここは >>627 の言う通りなにをしたいのかよくわからん
}
}
0629デフォルトの名無しさん (ワッチョイ 5593-Xc0J)
垢版 |
2017/10/09(月) 17:01:40.23ID:u+Z6y4O20
初心者相手に表記法を変えると理解しにくいかも。
本質から外れた部分が目についてしまうからね。

int i = 0;

while ( i <= 1 )
{
a[i] = aaa -> DEV_ADR ; // ポインタaaaが指す構造体の DEV_ADR メンバの値
b[i] = aaa -> REG_ADR ; // ポインタaaaが指す構造体の REG_ADR メンバの値
c[i] = aaa -> DATA ; // c[i] の型と DATA メンバの型が違うからエラー
aaa += 1 ;

i += 1 ;
}

てな感じかと。
>>627-628 をまとめただけ、だけど。
0630デフォルトの名無しさん (ワッチョイ 059f-huPf)
垢版 |
2017/10/09(月) 17:19:35.64ID:tFlwnlNI0
>>629
c を char *c[2] で宣言しておけばなんとかなるね。
0631デフォルトの名無しさん (ワッチョイ bdd2-qWqy)
垢版 |
2017/10/09(月) 17:34:38.15ID:98rFBdXp0
皆様 どうもありがとうございます
とりあえず代入の書き方が知りたかっただけでありまして
ちなみにインデックスを使用した配列メンバーのアクセスなんだけど
c[i] = aaa -> DATA +0 ;
d[i] = aaa -> DATA +1 ;
e[i] = aaa -> DATA +2 ;
f[i] = aaa -> DATA +3 ;
こんな書き方ってできるの?
0632デフォルトの名無しさん (ワッチョイ 75b3-qWqy)
垢版 |
2017/10/09(月) 17:44:30.12ID:N3YX2Zf80
ポインタを返す場合はそういう書き方
aaa->DATA+3
ポインタの指してる先を求めたい場合は
aaa->DATA[3]

左辺が何を要求しているのか(どういうものを操作したいのか)を頭の中で整理せずに
記述法だけを即物的にトレースするのはとてもまずい
0633デフォルトの名無しさん (ワッチョイ 958a-j1W8)
垢版 |
2017/10/09(月) 18:00:40.01ID:tNKVEDsJ0
task02_tst()の呼び出しが
task02_tst(I2C_MEM)なのか
task02_tst(&I2C_MEM[1])なのかわからん

前者と仮定するとDEV_ADRにアクセスする方法は
1. (*(aaa + i)).DEV_ADR
2. aaa[i].DEV_ADR
3. (aaa + i)->DEV_ADR
なんかが考えられるけど(2は1の糖衣構文)、ドットとアローそれぞれの
左側の違いを理解しないと先には進めないよ
0635デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 10:23:33.14ID:jY+yK3vs6
過疎ってるな
0636デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 11:18:46.53ID:mQ4S5/8+0
ちょっと質問です
↓下記のようなwhileの中身を複製するために使う実体化されない変数iをコンパイラ制御のための変数と明示する書き方ってあるんですか?

task02_tst ( I2C_MEM_typ *p , char i)
{
char i ;
i = 0 ;
while ( i < 2 )
{
p = p + i ;
a[i] = p -> DEV_ADR ;
b[i] = p -> REG_ADR ;
c[i][0] = p -> DATA[0] ;
c[i][1] = p -> DATA[1] ;
c[i][2] = p -> DATA[2] ;
c[i][3] = p -> DATA[3] ;
}
}
0637デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 11:24:19.55ID:mQ4S5/8+0
task02_tst ( I2C_MEM_typ *p )
{
char i ;
i = 0 ;
while ( i < 2 )
{
p = p + i ;
a[i] = p -> DEV_ADR ;
b[i] = p -> REG_ADR ;
c[i][0] = p -> DATA[0] ;
c[i][1] = p -> DATA[1] ;
c[i][2] = p -> DATA[2] ;
c[i][3] = p -> DATA[3] ;
}
}

に修正します
0638デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 11:26:34.34ID:mQ4S5/8+0
task02_tst ( I2C_MEM_typ *p )
{
char i ;
i = 0 ;
while ( i < 2 )
{
p = p + i ;
a[i] = p -> DEV_ADR ;
b[i] = p -> REG_ADR ;
c[i][0] = p -> DATA[0] ;
c[i][1] = p -> DATA[1] ;
c[i][2] = p -> DATA[2] ;
c[i][3] = p -> DATA[3] ;

i += 1 ;
}
}

に修正します
0640デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 12:32:35.60ID:mQ4S5/8+0
こんな感じで構造体をインデックスで指定した転送命令にコンパイルする意図で書いています

p = p + i ;                            //*実体化されない(マシンコード化されない)コード
mov a[0] ,  [構造体I2C_MEMの基底番地+0]
mov b[0] ,  [構造体I2C_MEMの基底番地+1]
mov c[0][0] ,  [構造体I2C_MEMの基底番地+2]
          :
mov c[0][3] ,  [構造体I2C_MEMの基底番地+5]
i += 1 ;                              //*実体化されない(マシンコード化されない)コード


p = p + i ;                            //*実体化されない(マシンコード化されない)コード
mov a[1] ,  [構造体I2C_MEMの基底番地+6]
mov b[1] ,  [構造体I2C_MEMの基底番地+7]
mov c[1][0] ,  [構造体I2C_MEMの基底番地+8]
          :
mov c[1][3] ,  [構造体I2C_MEMの基底番地+11]
i += 1 ;                              //*実体化されない(マシンコード化されない)コード

・・・で意図通りコンパイルしてくれるわけですが

実体化されない(メモリー空間またはレジスタファイルにアサインされない)char iの意味が
希薄になるのでコンパイラに対する変数だよと明示(コンパイラ&設計者に)したいのだが
そんな書き方ある?ということでありまして
0641デフォルトの名無しさん (ワッチョイ c9ea-89ZN)
垢版 |
2017/10/12(木) 12:41:11.33ID:Z8zboj8V0
多少は意図した記述に沿って機械語出力するだろうけど、
保障されてるわけでもないし、最適化他でどうなるかもわからん

「機械語でこうなって欲しい」という目的を達成させるならその部分を機械語で書くか、
(環境によるだろうけど)その部分だけをインラインアセンブラにする
0644デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 13:04:26.04ID:mQ4S5/8+0
うーーん・・・

volatileは最適化抑止(消すなー!)のための記述と認識しているんですが
volatileの逆の機能が欲しいんですよね 実体化するなー!ってやつです
0646デフォルトの名無しさん (ワッチョイ c9ea-89ZN)
垢版 |
2017/10/12(木) 13:45:28.14ID:Z8zboj8V0
実体化するな=機械語としてコードにおくな
ということは、言語上での変数を一切使わずに繰り返し展開するような
テンプレートやマクロでメタプログラミングしたい って話になるが・・・

#define IMP(idx) do { \
a[idx] = p[idx].DEV_ADR; \
b[idx] = p[idx].REG_ADR; \
:
: 以下同じ様に記述
:
c[idx][3] = p[idx].DATA[3] ; } whle(0)

IMP(0);
IMP(1);
IMP(2);

変数を使ってループできないから 繰り返し分リテラルを手で並べる必要あるしー
正直ほめられたやりかたじゃないと思うわ
0647デフォルトの名無しさん (ササクッテロレ Sp45-NqOW)
垢版 |
2017/10/12(木) 14:25:00.48ID:1sF6m3D2p
実体化させたく無いものを記述?
…スラ二本じゃダメなのか?
0648デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:30:09.97ID:9bJ1Vwh10
そういう話ではないでしょ
そもそもループによるコードのキャストは
記述を短縮化するのが目的なんだから

キャストのためのループであることをコンパイラに
推論させるための変数指定の仕組みがあるのかな?ってはなし
0649デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:32:07.54ID:9bJ1Vwh10
まあ 指定しなくても現状でコンパイラは推論してるけれどもねw
なんかキモチ悪いといえばキモチ悪いんで指定できればうれしいってだけです
0650デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 14:36:32.09ID:OhN0e73F6
死ねゴミ
0651デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 14:37:45.66ID:9bJ1Vwh10
なんかすぐ出てこないところをみると
そこらへんはコンパイラまかせなのね
0652デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 14:38:53.90ID:OhN0e73F6
クッサ
0656デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/12(木) 15:03:43.28ID:9bJ1Vwh10
大体わかりました
ありがとうございました
0657デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 15:06:24.03ID:OhN0e73F6
一から10まで足し合わせるプログラムを教えてください。
0659デフォルトの名無しさん (ガックシ 06eb-HijE)
垢版 |
2017/10/12(木) 15:18:14.51ID:OhN0e73F6
>>658
ありがとうございます!
0661デフォルトの名無しさん (ササクッテロレ Sp45-NqOW)
垢版 |
2017/10/12(木) 20:36:00.66ID:1sF6m3D2p
俺は逆だと思っている。
人に上手く思いを伝えられないからこそ、
表現手段を駆使して伝えようと努力するんだよな。
絵とか音楽とか、クリエイターってそんな生き物。
0662デフォルトの名無しさん (ワッチョイ 13b3-itUa)
垢版 |
2017/10/12(木) 21:49:52.42ID:wn8w1zGC0
>>661
> 絵とか音楽とか、クリエイターってそんな生き物。
全然違う
あいつらは自分の思いを伝えられるのは自分の表現法方だけだと思ってる
絵を描く奴で説明文を書いて思いを伝えるやつなんていないだろ
0663デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/12(木) 23:57:59.88ID:5ILt7KpA0
>>645
メモリマップドI/Oに使える。特定のアドレスを読むとキーボードで入力した文字が読めるとか、そういうやつ。
読んだ直後に内容が変わる可能性があるので volatile でないとまずい。
0664デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/13(金) 00:30:38.46ID:neFZx4WS0
共有メモリとか mmap() して複数のプロセスまたはスレッドがアクセスする領域も同じか。
あれ? こんなのちょっと前に話題にならなかったか?
0666デフォルトの名無しさん (ワッチョイ 69d2-89ZN)
垢版 |
2017/10/13(金) 12:09:21.29ID:UePpwGnn0
ちょっとお尋ねします

char *a ;  と記述すると
 ↓
char a ; 実体化
int (&a) ; 非実体化(コンパイラが使用する変数)

が生成される
*の概念が無いと

char a ;    実体化
int a_point ; 実体化(アドレス長=intとする)
a_point = &a ; 実体化

例えばこう書くことになる


ポインタは関数内で宣言できる
その場合そのポインタの寿命は関数内に限定される


こんな感じの認識であってますか?
■ このスレッドは過去ログ倉庫に格納されています

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