X



C言語なら俺に聞け 150
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (アウアウクー MM57-IE4z)
垢版 |
2019/02/06(水) 13:39:03.21ID:c4bnQMl3M

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

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/

※前スレ
C言語なら俺に聞け 149
https://mevius.5ch.net/test/read.cgi/tech/1540731704/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0002デフォルトの名無しさん (アウアウクー MMb3-IE4z)
垢版 |
2019/02/06(水) 13:43:35.56ID:c4bnQMl3M
ミスってる
!extend:checked:vvvvv:1000:512
を書き込み内容にするためにもう一行書かなければならないのね
0003デフォルトの名無しさん (ワッチョイ df52-5rgS)
垢版 |
2019/02/06(水) 13:53:52.35ID:bwpbLxE30
そうしろって書いてあるじゃん
0004デフォルトの名無しさん (ワッチョイ 7fa5-se+6)
垢版 |
2019/02/06(水) 14:08:04.08ID:6cW+g5Qj0
違うな
シェバンに類似する特殊な一行目は書き込みすると失われる、だろ
だから次の手順説明のために同じものをもう一行増やす

しかも「必ず1行目に入るように」って書いてあるから二行に増やしても先頭に空白行があると受理されないハズだ
もう一行書くだけじゃダメだからな
0006デフォルトの名無しさん (ワッチョイ ffab-vS77)
垢版 |
2019/02/06(水) 16:08:05.73ID:1SbGZlcV0
では、続きをしようか

986 名前:デフォルトの名無しさん (ワッチョイ df01-vS77)[sage] 投稿日:2019/02/06(水) 04:57:27.49 ID:eUM592Vs0
ループから抜けるときに goto使ったらダメなんですか?

for (...) {
for (...) {
if (...) goto LOOP_EXIT;
}
}
LOOP_EXIT:

こういう感じで書いたら先輩に怒られました。
フラグ見てループ抜けるように修正しろと。
指示されたので従いますけど、どうしてダメなのかよく分かりません。

どなたか納得するような理由をご存知でしょうか?
0008デフォルトの名無しさん (ワッチョイ df52-S1Ul)
垢版 |
2019/02/06(水) 16:21:58.32ID:bwpbLxE30
Cにはラベル付きbreak文って無いんだね初めて知った

Javaのラベル付きbreak文
loop_exit: for(...) {
 for(...) {
  if (...) {
   break loop_exit;
  }
 }
}

まぁJavaでもあまり使ったことないけど…。
0011デフォルトの名無しさん (ワッチョイ ff02-vS77)
垢版 |
2019/02/06(水) 19:00:59.18ID:jnwpwdAT0
goto があっても
いいじゃないか
C言語だもの
0012デフォルトの名無しさん (アウアウクー MMb3-rTH6)
垢版 |
2019/02/06(水) 19:48:43.15ID:KUGC24GrM
goto文そのものが悪いわけではない。いまだにgoto文の使用そのものがよくないというやつらのせいでおかしくなっている。

goto文で前のif文内に飛んでみたり、ループのなかに飛んでみたりと、乱用して人間には理解しづらいスパゲティプログラムを作るなという話なのに。

continue文だって実体はgoto文で、コンピュータにとってはメモリ上のマシン語を順番に実行しない場合はすべてメモリのアドレスのジャンプでgoto文。
0013デフォルトの名無しさん (ワッチョイ 7fab-qf6r)
垢版 |
2019/02/06(水) 20:21:21.69ID:WRu6z6Oe0
センサーで取得した計測値を数値では無く文字列で返す関数を作ろうと思ってる。
どんな計測結果が得られるか事前には分からないため文字列のサイズは関数内で
mallocを使ってリサイズする予定。

このとき測定結果が格納された文字列を関数から渡してもらうのに、

a) 引数に文字列のポインタのポインタを渡す
void sokutei( char** buff )
{
・・・
*buff = (char*)malloc( sizeof(char)*length );
・・・
}

と、

b) 関数の返値に文字列のポインタを指定する
char* sokutei(void)
{
・・・
char* buff = (char*)malloc( sizeof(char)*length );
・・・
return (buff);
}

の二つの方法があるけど
一般的にはどっちの方法がお薦め?
0017デフォルトの名無しさん (ワッチョイ df7b-se+6)
垢版 |
2019/02/06(水) 20:50:04.50ID:y48wBDHW0
>>13
> センサーで取得した計測値を数値では無く文字列で返す関数を作ろうと思ってる。
これ自体が糞。
計測値は生で保持して、表示する時だけ文字列に変更しろ。
そうすればprintfだけで行けるだろ。

無駄に可変長のバッファなんて持とうとするから無駄に面倒になる。
初心者だから分からないのだと思うが、そもそも複雑にならないように全体像をまず組むんだよ。
0021デフォルトの名無しさん (ワッチョイ df01-vS77)
垢版 |
2019/02/06(水) 23:32:22.18ID:eUM592Vs0
重要なのは統一するってこと。

標準ライブラリには戻り値に二つの意味を持たせているのが多いから、個人的に好きじゃない。

fopen() 成功時はファイルポインタを返し、失敗時はNULLを返す。

strtol() 成功時は変換結果を返し、失敗時は0を返す。
これじゃ変換結果が0なのか、失敗して0なのか分からない。
で、errnoを見ろってことになってる。

なんでこうなってるかというと、戻り値に処理の成否と結果の二つを持たせているから。
だったら、分ければいいじゃんって話。
0022デフォルトの名無しさん (ワッチョイ df7b-se+6)
垢版 |
2019/02/06(水) 23:38:05.98ID:y48wBDHW0
>>20
多分相場が分かってないのだと思うけど、
正しく初心者の自覚があるのなら、ある程度縛りプレイで行った方がいい。
C言語なんて現役で50年来てるし、そのセンサーだって民生品なら誰かが同様に使ってる。
それでもそれ用のライブラリがないのなら、それはそもそもそういう使い方をする奴がこれまで居なかったということ。
つまり、そのやり方が間違っている、と見ていい。

初心者が自前でライブラリみたいな物をいきなり組まなければならない時点で設計が間違ってる。
それは君らがよく誤用している「無能な働き者」に該当する。
(ただし繰り返すが、Webでの多くは誤用されているので注意)
003213 (ワッチョイ 82ab-/WZR)
垢版 |
2019/02/07(木) 23:25:09.01ID:9IdI5ETg0
a)の方法。空の文字列を渡そうとすると失敗するっぽい

char** str;
sokutei( str );

これやっても有意な文字列はstrに返ってこなかった。
もしこれやるならb)の方法じゃ無いとダメかも↓

cha* str;
str = sokutei();
0033デフォルトの名無しさん (ワッチョイ 495f-QV4H)
垢版 |
2019/02/07(木) 23:38:06.10ID:92YFdzoB0
初心者だから間違ってるかもしれんけど
外でメモリ確保してないからじゃない?
文字列を関数内で作ってたら関数処理終わった後は文字列がそのまま残るかは保証されなかったような気が
外で配列宣言して関数に渡して、関数内でそこにmemcpyさせるとか?
0038デフォルトの名無しさん (スフッ Sd22-QV4H)
垢版 |
2019/02/08(金) 08:37:48.99ID:uDm/bfU0d
>>34
あぁなるほど

char **str;
sokutei(str); // 関数の引数にstrのアドレスがコピーされるだけ

だから関数内で代入してもコピーに再代入してるだけか

char *str;
sokutei(&str); // str自体のアドレスを渡す

これなら外のstrにmallocで確保したアドレスが入るのね
0044デフォルトの名無しさん (ワッチョイ bd5f-1QgP)
垢版 |
2019/02/09(土) 01:59:26.91ID:babOKSMs0
>>26
ANSI Cでは何かしらの値を返さなければいけない。
0045デフォルトの名無しさん (ワッチョイ 9127-feI+)
垢版 |
2019/02/10(日) 10:04:34.79ID:wNxUL6Ap0
どこかのHPで「自分は頭悪くてC言語の命令が覚えられなかったからアセンブラでプログラミングしてた」という記述を見たんだけど
アセンブラの方がよっぽど難しいと思うんだけど、アセンブラできる人からしたら違うのかな?
0050デフォルトの名無しさん (ワッチョイ 868c-gf/b)
垢版 |
2019/02/10(日) 12:55:24.84ID:nnE1Q40B0
CPU設計者じゃないかな
0051デフォルトの名無しさん (ワッチョイ 922d-DOJB)
垢版 |
2019/02/10(日) 13:26:11.80ID:6kY6tuUn0
アーキテクチャや機械語ニーモニックは簡単なんだけど
CPUと直接関係のない、アセンブラ指示子やコマンドを覚えて
エラーなくアセンブル通るようにするのは大変
0055デフォルトの名無しさん (ワッチョイ 91da-feI+)
垢版 |
2019/02/10(日) 16:31:12.43ID:ixgHA2PX0
構造化アセンブラ使っていればいずれCに移行するし
Cで記述できない部分はインラインアセンブラで補うようになる
構造化されているとはいえアセンブラはあくまでアセンブラ
生産性はCには及ばない
元組込みマイコンプログラマより
0056デフォルトの名無しさん (ワッチョイ aeab-feI+)
垢版 |
2019/02/10(日) 17:36:00.24ID:XdgVAt+K0
>>45
アセンブラってのは理屈じゃない決めごとを憶えるだけでいいが
Cやその他の高級言語は構造化だとか処理系依存がどうたらという
どっかの知らん馬の骨が強弁する作法シキタリに付き合わされるから
気が短いやつはプイと出てっちまうのさ
鵜呑みをせず納得ずくでしか動かんやつという意味では大物の素養がある
0057デフォルトの名無しさん (ワッチョイ a17b-D6og)
垢版 |
2019/02/10(日) 17:48:21.83ID:6qUtXmPD0
最初がBASIC小僧だった経験から言わせてもらうと、
サブルーチン(Cでは関数)に値を渡す返すって部分が分からなかったな。
ある計算をさせるサブルーチンにパラメータを与えたいときは
大域変数に入れて共有する、値の返却も同様。
これはアセンブラでも同じでしょ。レジスタで渡す返すも可能だけど。

その後、8bitマシン語少年に進み、Cを勉強した時は
ポインタ加算の自動スケーリングに引っかかった。
int *p = &a[0];
p += 4; // ここで p == &a[4] になるのが納得いかない
新たな p が指す先は a[2] か a[1] (intのサイズに依存)、と考えたわけ。
0059デフォルトの名無しさん (ワッチョイ 6ed2-/WZR)
垢版 |
2019/02/11(月) 08:42:09.13ID:sI6uV93B0
C言語学び始めたときに(BASIC、Z80/8086アセンブラの経験はあった)「C言語の非常識」とかいう本読んで
トラブルになりそうなところを先に学んだんでそう苦労しなかったな。

それより16bit DOS時代だったんでコンパイル設定でメモリモデルがLARGEだのHUGEだのの方が理解でできんかった。
まだ学生で「インターネットください」より前の時代で調べる手段がわからんかったし。
0060デフォルトの名無しさん (ワッチョイ 8602-Z23n)
垢版 |
2019/02/11(月) 16:17:31.30ID:aNfCU32+0
それ30年ぐらい前だよね。
large だの huge だのは本読んだりして覚えたなあ。
0067デフォルトの名無しさん (ワッチョイ 6e63-OF6d)
垢版 |
2019/02/11(月) 17:20:25.05ID:adB+iGat0
なんかそれっぽいw
CADのデータを扱うアプリで、データが大きくなりすぎて
PCによっては読込すら出来なくなってしまい
アプリを立ち上げずに画面表示やプロッター出力する
プログラムを作れという指令が飛んだんです
データ構造は比較的簡単で、先頭部分に部品基本イメージ、
その後ろから、固定長で膨大な描画情報がある感じです
描画情報を64k未満の配列に分割して格納し、
それぞれの配列アドレスを格納した配列経由で操作するイメージでした
0074デフォルトの名無しさん (ワッチョイ 6ed2-/WZR)
垢版 |
2019/02/11(月) 19:06:33.17ID:sI6uV93B0
Ap2でいくら載せてたかなぁ・・・。
20だか30M程度だったと思う。
パリ有りメモリで近所で扱ってる店も無かった時代なんで。

ぐぐったら公式で最大 73.6MB 、非公式で125.6MBまでいけたらしい。

>HDDですら数十MBクラスが普通だったと思うが…
それはSASI HDDじゃないか?VM時代か?

RXで340M、AP2で4G のSCSI HDD使ってたよ。
0075デフォルトの名無しさん (ワッチョイ bdc3-EwQo)
垢版 |
2019/02/12(火) 02:24:51.56ID:xDY2FToe0
Cしかかけませんっていうの
0076デフォルトの名無しさん (ワッチョイ bdc3-EwQo)
垢版 |
2019/02/12(火) 02:25:15.35ID:xDY2FToe0
Cしか書けませんっていうのは新卒就活のときに不利?
他にどんな言語を習得すればいいんだろうか
0077デフォルトの名無しさん (ワッチョイ 49e6-OF6d)
垢版 |
2019/02/12(火) 02:52:19.85ID:wp1a6nq70
まず「他にどんな言語を習得すれば良いんだろうか」なんて言ってること自体がかなり的外れかな
手段と目的の順序が逆

あと面接のときに「何故C言語を習得し、それを何に使ったんですか?」って聞かれてちゃんと答えられる?
0078デフォルトの名無しさん (ワッチョイ 91da-uR/r)
垢版 |
2019/02/12(火) 03:06:28.22ID:jEa3f+fD0
新卒であればプログラム言語そのものより他にアピールした方がいいと思うけどな
組み込みであれば現代制御理論、解析系であれば有限要素解析などC言語のプログラミングを応用する専門分野の知識を売り込んだほうがいいと思う
0079デフォルトの名無しさん (ワッチョイ aebf-feI+)
垢版 |
2019/02/12(火) 05:55:34.89ID:4zHmA9zW0
>>76
俺んとこではそれで充分
ただしCが書けるといってもHello worldの域を出ていないのは書けるうちに入らない
アルゴリズムの基本ができているかどうかを見ている
できていれば他言語が必要になっても泥縄ができるからだ
俺だってもともとアセンブラ屋で正社員3年目くらいのときにCの案件が回ってきて必死こいて憶えた
0081デフォルトの名無しさん (ワッチョイ 868c-gf/b)
垢版 |
2019/02/12(火) 09:06:46.70ID:lJ9WNOSb0
AならばBであるを表現できますか?と聞く
0082デフォルトの名無しさん (ワッチョイ 82d2-CHas)
垢版 |
2019/02/12(火) 09:17:13.28ID:puzbyhsI0
64ビットCPUでもデフォルトの命令のオペランドが32ビットだから
linuxでint_fast32_tを使うのは間違いだったんだな
多分64ビットのアドレス計算も32bitの命令があるからパッディングとかも
起こらないだろうな
0085デフォルトの名無しさん (ワッチョイ 82d2-CHas)
垢版 |
2019/02/12(火) 13:06:03.99ID:puzbyhsI0
>>82の4行目で多分って書いたけど
64ビットのムーブ命令は32ビットなら0埋めされるから
ポインターの引き算をしなければ64ビット整数を使う必要ないということだな
0093デフォルトの名無しさん (ラクペッ MM99-uR/r)
垢版 |
2019/02/12(火) 19:43:56.33ID:9j8xXtILM
いまどきの若者ならみんなPythonに行ってるよ
やや年食ってる連中ならJavaやC#
職人気質で頑固な偏屈者はC++
Cはかつての栄光を引き摺って余生を過ごす老人の言語
0095 ◆QZaw55cn4c (ワッチョイ e247-3ywI)
垢版 |
2019/02/12(火) 22:27:27.41ID:afakhEje0
>>93
でも言語を超えて活用されるライブラリ(libzip, libpng/libjpeg etc)は C で書かれることはあっても、OOP 諸言語で書かれることはないかと思うのですが?
C++ で記述される汎用ライブラリはありますか?
0102デフォルトの名無しさん (ワッチョイ 9127-feI+)
垢版 |
2019/02/13(水) 12:36:20.22ID:FB2A40HJ0
使えるというか、Cが分かるなら「〜の言語でやれ」って言われたらどの言語でも3日で仕事出来るくらいは当然だけどね。
java勢とかが3日でCやれと言われてポインタまみれのコード読むのは無理だろうけど。
0105デフォルトの名無しさん (スッップ Sd22-IyyE)
垢版 |
2019/02/13(水) 13:04:19.59ID:a9PctXZid
まあ新しい言語の勉強始めたら3日目にはそれなりに手が動くようになってるだろうからな。
でも仕事で使おうとするとプロジェクト設定の方法がわからないとかその辺で詰むと思うわ。
0107デフォルトの名無しさん (アウアウウー Sa05-KI3Y)
垢版 |
2019/02/13(水) 13:12:51.57ID:V+opB2+Aa
>>99
ライブラリないの?
0108デフォルトの名無しさん (アウアウウー Sa05-KI3Y)
垢版 |
2019/02/13(水) 13:15:49.92ID:V+opB2+Aa
3日ねえ。まあ、書けるには書けてもその言語の特性をうまく活用できるところまでは行きそうにないな。
0110デフォルトの名無しさん (ワッチョイ 9127-feI+)
垢版 |
2019/02/13(水) 14:38:53.83ID:FB2A40HJ0
>>109
Cしかわからなかったけど、入社して「これわかりやすいから」とjavapressをポンと渡され、3日後にはjavaで養鶏管理のシステムを作らされていたぞ。
業務知識なんて仕様書と上司に聞きながら覚えるものじゃん。業務知識覚えてから仕事って、新卒じゃないんだからw
0111デフォルトの名無しさん (ワッチョイ 49e6-feI+)
垢版 |
2019/02/13(水) 14:42:28.64ID:q5+/i40P0
業務知識覚えてから仕事なんて一言も書いてないけどw
こういう人ってちゃんとドキュメント類読めてるんだろうか
自己解釈でガンガン進めてから修正で苦労してそう

あと君が3日で出来るすごい人なのは充分分かったよ
0113デフォルトの名無しさん (ワッチョイ 868c-gf/b)
垢版 |
2019/02/13(水) 14:49:42.00ID:fZcB94Cs0
鶏が何を食っているか新卒で知っている人はいない。
貝殻食っていると知ってた?
0127デフォルトの名無しさん (ワッチョイ 275f-3QuV)
垢版 |
2019/02/14(木) 00:55:10.36ID:eGYXBQeH0
>>124
「はじめてのC」
0128デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/14(木) 07:24:34.92ID:J1vF692V0
鶏の雌雄判別機を作ったらまじで大儲けできる。
0130デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/14(木) 07:42:05.06ID:J1vF692V0
玉子だったらなお良い。
0135デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/14(木) 09:27:48.57ID:9tQDIG7ca
鶏のスレができたと聞いてゆっくり歩いてきました。
0136デフォルトの名無しさん (ササクッテロル Sp7b-mDuQ)
垢版 |
2019/02/14(木) 12:09:08.34ID:EQjYAhePp
>>124
A、B、そしてC言語だ、アホw
0138デフォルトの名無しさん (ササクッテロル Sp7b-mDuQ)
垢版 |
2019/02/14(木) 12:35:11.20ID:EQjYAhePp
っAPL
0140デフォルトの名無しさん (アウアウクー MM7b-3QuV)
垢版 |
2019/02/14(木) 17:42:21.71ID:WWAGjmY5M
>>128
ひよこの時点で選別されている。
0143デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/14(木) 19:22:48.32ID:Jtoe5svL0
雄のひよこの運命はマジでミンチ
0145デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/14(木) 21:15:49.32ID:FnxMJF+Da
昔々小学生の頃に道で売ってたカラーひよこを買って、だいたいは一晩で死ぬわけだがその時は電球で暖めたり色々やったら生き長らえて成長し、立派な鶏に成長し、その後親戚に引き取られて行ったが、すぐに食われた。
0147デフォルトの名無しさん (ワッチョイ 5fab-A2tD)
垢版 |
2019/02/16(土) 00:17:44.31ID:yq1cCgqT0
#include "A.h"
#include "B.h"

A.hとB.hに同じ内容の同じ名前の関数が定義されてると
こうインクルードした時点でコンパイラから二重定義されてるぞ
とおしかりを受けるわけだがどうしたらいいかな?

手作業でA.hないしはB.hから該当する関数を削除しないといけないかな?
0154デフォルトの名無しさん (ラクペッ MM9b-OxnY)
垢版 |
2019/02/16(土) 01:45:16.86ID:0XZqCZxyM
定義の意味が曖昧だけど自分ならヘッダーはプロトタイプ宣言だけなので関数定義そのものが
二重になることはまず無いな
*.cと*.hファイルの関数定義と宣言をきちんと区別していれば同一関数の二重定義なんて事態には
そうならないと思うんだが
0155デフォルトの名無しさん (ワッチョイ 5fab-A2tD)
垢版 |
2019/02/16(土) 03:04:51.53ID:yq1cCgqT0
int型の変数を文字列に変える
INT2STRって関数がバッティングしてる

便利な関数だからいろんなヘッダファイルに仕込んでるんだけど
そういうヘッダファイルを複数includeするとバッティングしちゃうんだよね
0156デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/16(土) 04:31:59.37ID:0BUCSxrk0
バッティングする関数を別のヘッダーにする。
0161デフォルトの名無しさん (ワッチョイ 5f01-3Kdw)
垢版 |
2019/02/16(土) 08:52:07.39ID:q1DAaOKG0
>>155
> INT2STRって関数がバッティングしてる
> 便利な関数だからいろんなヘッダファイルに仕込んでるんだけど
その関数を定義した"int2str.h"を作って
#pragma onceなり#ifndefなりでインクルードガードしておく
各ヘッダーファイルは"int2str.h"をインクルードすればいいだけ
0162デフォルトの名無しさん (ワッチョイ 7f8f-tyEA)
垢版 |
2019/02/16(土) 09:05:18.00ID:P5gjDjW+0
>>155

「便利な関数だからいろんなヘッダファイルに仕込んでるんだけど」

普通は
「便利な関数だからライブラリ化していろんな実装ファイルでインクルードしてる」
とするべきでしょ。

ヘッダファイルの使い方も間違ってるような…
0163デフォルトの名無しさん (ワッチョイ 7f8f-tyEA)
垢版 |
2019/02/16(土) 09:09:29.43ID:P5gjDjW+0
>>161
たぶんint2str.hはヘッダーファイルじゃなくて実装ファイルでインクルードすべき性質のものだよね。

細かいことかもしれないけど、ヘッダーファイルでインクルードすると他のファイルへの影響が増えるから、必要がない限りは実装ファイルの方でインクルードするべきだと思う。
0168デフォルトの名無しさん (ワッチョイ 5fab-A2tD)
垢版 |
2019/02/16(土) 10:58:48.72ID:yq1cCgqT0
ありがとう、みんなが背中押してくれたから決心が付いた(`・ω・´)

ヘッダーファイルint2str.hを作って
関数INT2STRの実体はint2str.cに記述、
int2str.hには

#ifndef _INT2STR_H
#define _INT2STR_H
...
#endif

でくくって多重定義を防ぐ(`・ω・´)b
0169デフォルトの名無しさん (ワッチョイ 5fd2-5nnY)
垢版 |
2019/02/16(土) 13:29:20.93ID:GySit7mC0
#include <stdio.h>

int f(int i){
switch(i){
defalut:
return i;
}
}
int main(void) {
printf("%d\n", f(2));
return 0;
}

このコードを実行するとfの入力が何であっても0が出力されるんですけどなぜですか?
0172デフォルトの名無しさん (ブーイモ MM6b-JXvc)
垢版 |
2019/02/16(土) 14:04:34.91ID:WseEcsSPM
defaultがラベルになる?switch の中に return だけになるのか?switch 素通りして関数の最後に return 無いけど return 0 になるのか?これコンパイルとおるの?
少なくともコンパイル警告は出るはずだから、素人は警告無視すんな
0176デフォルトの名無しさん (ワッチョイ bf02-yQ/S)
垢版 |
2019/02/16(土) 14:41:10.94ID:FAU3Sbcr0
>>169
コピペして実行してみたがこちらでは 4195622 が出力されたw

gcc -Wall でコンパイルしてみると「ラベル ‘defalut’ が定義されていますが使用されていません」が出る。
綴り間違いだな。l と u が入れ違いになっている。
0180デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/16(土) 15:42:31.02ID:GG6HVTci0
バグの大半は手書き
0181デフォルトの名無しさん (ワッチョイ 877b-WJvq)
垢版 |
2019/02/16(土) 16:44:51.50ID:/Su8h7T90
>>175
単一のファイルを複数回、fclose()しないでfopen()するってことかな。
複数の FILE* が単一のファイル(名)を操作してる状態。

FIO24-C. すでにオープンされているファイルをオープンしない
ttps://www.jpcert.or.jp/sc-rules/c-fio24-c.html
↑によると「(前略)同一のファイルを同時に複数回オープンできるかどうかも、
処理系定義とする」ってことだから、一般的には好ましくないね。

すでにfopen()されててまだfclose()されてないファイルに対する
2回目のfopen()が成功する(場合もある)か、常に失敗するかも「処理系定義」だし。
0187デフォルトの名無しさん (ワッチョイ 275f-3QuV)
垢版 |
2019/02/19(火) 17:04:59.95ID:uTkGj35D0
>>185
ああいう問題は実務では存在しないから簡単ではないよ。
0188デフォルトの名無しさん (ワッチョイ 4700-tIDa)
垢版 |
2019/02/19(火) 18:44:17.22ID:BOKvhiPA0
マジで言い訳でもなんでもなく
業務のときと使う脳味噌が全然 違う。
普段 ファイルを単純に移動させるにも 外環境からどういう邪魔が入りうるか
プール単位で跨ぐときどういうセキュリティーホールがあるか
とかいうことを重箱の隅をつつくように考えてるのに

条件分岐を一度も使わずに素数生成しろ みたいな問題が出てくるんだもん
しかも出/入力データの危険性は一切考えない、っていうパターンがほとんど。
0194デフォルトの名無しさん (ワッチョイ 877b-WJvq)
垢版 |
2019/02/20(水) 17:56:41.12ID:V5JGZApS0
「100以下の素数を表示するブログラムを作りなさい」だと
手打ちの固定テーブル(初期化済み配列)って解答もありそうだな。

2重のforループで「エラトステネスのふるい」を回して0/1の配列を生成。
値を表示する/しないは、要素2個の関数ポインタを格納した配列ってトリック。

そもそもfor, whileや三項演算子は「条件分岐」じゃないのか?
みたいな疑問を感じ始めると答えられないね。
0195デフォルトの名無しさん (ワッチョイ 5fda-yQ/S)
垢版 |
2019/02/20(水) 18:03:03.37ID:/pFWY/nZ0
単純に考えれば素数を漏れなく見つけるにはエラトステネスのふるいによるしかない
いかにして無駄な計算を避けるかが重要
プラグラム言語よりもいかに数学的素養の能力を身に着けているかが問われる
馬鹿正直に2から100までループを回すようならまったく実務には向いてない
整数論の基礎だけで100以下の判定に必要な要素は2,3,5,7だけであることはすぐにわかる
プログラムに落とし込む以前の問題
0197デフォルトの名無しさん (スッップ Sd7f-tyEA)
垢版 |
2019/02/20(水) 18:34:58.50ID:MxetRGgJd
俺は拡張性がちらついてエラトステネスにしたくなるわ。どれだけの実行速度が求められるのかわからないとどの方法でやるか決心がつかなくてタイムアップしそうw
0198デフォルトの名無しさん (アウアウウー Sa4b-4Twi)
垢版 |
2019/02/20(水) 18:48:50.68ID:WptMO45ba
>>192
問題の意図や目的を明示せずに解かせた答えだけみても、その人がどんな意図でその回答を出したのかは断定できないから、これだけで実務がどうこう言うのは短絡的だとは思うよ。
よくある性格診断とかで、○○を選んだあなたは××な性格です〜ってのがあるけど、解説を聞いてもまったく説得力のない決めつけがほとんどだし。それよりはいくぶんましだけど。
0203デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/20(水) 19:05:39.41ID:agArr1lpa
>>199
組み込み用でメモリが非常に少ないマシン用のプログラムの場合もう一捻り必要。
0204デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/20(水) 19:07:07.48ID:agArr1lpa
ま、いいや。うちに帰ってから俺が変なプログラム作ってみるよ。
0205194 (ワッチョイ 877b-WJvq)
垢版 |
2019/02/20(水) 19:09:30.26ID:V5JGZApS0
>>196 こんな感じね。
#include <stdio.h>
int main(void)
{
 puts("2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97");
 return 0;
}
どうやって文字列を作ったかはヒミツ。本当に合ってるかは不明。

「素数なら表示し、素数でなければ表示しない」の部分は
テーブルがすでに出来てるとすれば、
tbl[i] && printf("%d\n", i);
てな具合に論理演算子の短絡評価を使う手もあるか。


パズルとしては面白いけど、実用で何の意味があるのか、
金払って受験する資格試験の問題としてどうなのか、疑問だなぁ。
0207デフォルトの名無しさん (ワッチョイ 5fda-iZZg)
垢版 |
2019/02/20(水) 19:33:00.95ID:/pFWY/nZ0
この流れだと

世の中のあらゆる暗号鍵はあらかじめ配列に格納することで突破可能、どうやって配列を作るかは秘密

とか言い出しそうだな
本質が分かってない
素数を高速に表示することが目的ではなく素数を少ない計算量で見つける事が本来の目的
0208デフォルトの名無しさん (ワッチョイ 877b-WJvq)
垢版 |
2019/02/20(水) 19:46:25.77ID:V5JGZApS0
>>188 「条件分岐を一度も使わずに素数生成しろ」
>>192 「100以下の素数を表示するブログラムを作りなさい」

2つの問題に同時に応えてるコメントがあるみたいね。
「条件分岐を使わずに100以下の素数を表示するプログラム」てことで。
かく言う自分もそのクチなんだけど。
0213デフォルトの名無しさん (アウアウクー MM7b-3QuV)
垢版 |
2019/02/20(水) 20:27:13.73ID:EKI9LXSlM
>>192
「100以下の素数を表示するブログラムを作りなさい」

これ素数の定義が問題に記載されておないとただの数学の問題になってしまうな。
0214 ◆QZaw55cn4c (ワッチョイ 5f47-acBj)
垢版 |
2019/02/20(水) 20:30:13.22ID:P8vN2pc30
>>195
>整数論の基礎
素数だけで構成する積による表現がすべて自然数について存在すること、ならびに、この積の表現が一通りであることを証明してください


>整数論の基礎
単に掛け算の交換則だけでいいのでは?
0215 ◆QZaw55cn4c (ワッチョイ 5f47-acBj)
垢版 |
2019/02/20(水) 20:31:37.35ID:P8vN2pc30
>>197
エラトステネスの篩にも欠点があります。
篩の大きさだけ広大なメモリ空間を確保しなければなりません
限られたメモリ容量で超巨大な素数を求めることは可能ですか?
0216 ◆QZaw55cn4c (ワッチョイ 5f47-acBj)
垢版 |
2019/02/20(水) 20:32:29.86ID:P8vN2pc30
>>202
>3以上の素数は奇数であること。
>n以下の素数を調べるときは、ルートn以下の約数を調べればいいこと。

あえて聞きます、証明はどのようなものに?
0220 ◆QZaw55cn4c (ワッチョイ 5f47-acBj)
垢版 |
2019/02/20(水) 20:34:54.39ID:P8vN2pc30
>>207
>素数を少ない計算量で見つける事
個人的には、素数の原始根を求める方法が知りたいです、いまんところ力技で解くしかないかと
0221 ◆QZaw55cn4c (ワッチョイ 5f47-acBj)
垢版 |
2019/02/20(水) 20:37:58.24ID:P8vN2pc30
>>219
たしかに 2 と 3 の公倍数である 6 をもとに
6n + 1, 6n + 5 だけをテーブルに載せる、とかは可能ですね
私はやったことがない、それはどうでもいいとして、これをコード化(coding-realized) したのも見たことがありません、いつか誰かやるだろうと思っていたんですが、なかなか表に表れませんね
0234デフォルトの名無しさん (ワッチョイ 3d7b-Frsa)
垢版 |
2019/02/21(木) 04:51:28.69ID:k7mDakXF0
「3以上の素数は偶数ではない」って、
「2以外の2の倍数は素数ではない」と言い換えられるよね。
対偶命題の真偽は等しい、ってことで。
「3以上」「2以外」の部分の処理がちょいと面倒かも知れんが。
素数の定義から自動的に成立する、トートロジーって気もする。

実用的には、チェックすべき対象が一気に半減するから
決して役に立たないつまらない事実とは言わないけど。
0236デフォルトの名無しさん (ワッチョイ 3d7b-Frsa)
垢版 |
2019/02/21(木) 06:56:30.22ID:k7mDakXF0
たぶん2の倍数に特別に「偶数」って名前がついてるから。

て言うか「2の倍数」を「偶数」と呼び替えるせいで
「3以上の素数は偶数ではない」がそれらしい命題に見える心理的効果。
0239デフォルトの名無しさん (ラクペッ MM65-JHNE)
垢版 |
2019/02/21(木) 10:06:27.81ID:vm8j2cEaM
https://ja.wikipedia.org/wiki/%E5%9C%8F%E8%AB%96

集合論的な数学理論の構成では集合やその元に対して写像や関係を導入し、それらが満たすべき公理を列挙する。その公理を満たすような「構造」を持った個々の集合が理論の具体的な実現を示していて、それら一つ一つの実現に共通の性質が公理から演繹的に証明される。
0241デフォルトの名無しさん (ラクペッ MM65-JHNE)
垢版 |
2019/02/21(木) 11:52:49.43ID:TYXtdJfXM
https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E4%BD%93

一般には、素数は代数体の整数環の素元として定義される(そこでは反数などの同伴なものも素数に含まれる)。このため、有理整数環での素数は有理素数と呼ばれることもある。
自然数あるいは実数の中での素数の分布の様子は高度に非自明で、リーマン予想などの現代数学の重要な問題との興味深い結び付きが発見されている。
0246デフォルトの名無しさん (ラクペッ MM65-JHNE)
垢版 |
2019/02/21(木) 12:48:37.97ID:FW7y2HsrM
https://ja.wikipedia.org/wiki/%E5%90%88%E5%90%8C%E7%AE%97%E8%A1%93

ガウスの貢献はこの集合、今日整数の合同類 の環 ℤ/nℤ と呼ばれる代数系、の構造を詳らかにするものであった。第一に加法に関して考えれば、これは 1 を生成元とする巡回群を定める。第二に乗法に関しては、これは法 n に依存して性質が異なり、法 n が素数ならば体が得られる。このような方法により、計算の記述は簡素化される。
0249デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 20:15:32.30ID:lsmx9sV60
ダメプログラマだらけだな。
0251デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 20:29:14.38ID:lsmx9sV60
「100までの素数」は単にロジックが書けるかどうかの話で、素数の話ではないだろうに。
0255デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 21:25:46.65ID:lsmx9sV60
とりあえず、Cできない娘は受付時に言うとか、ホームページにわかるようにしてくれないとキツイ。
0258デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/22(金) 15:27:06.91ID:bcwEHSMYa
С言語
0262デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/22(金) 21:52:23.52ID:/efpuxREa
納期までに完成させないと大変な事になるというスリルとサスペンスが人間の能力を引き出すのです。
しかしこれは恐怖から逃れようとする行為なので恐怖がなくなる、または度胸がついてしまったらそこで終わりです。
0268デフォルトの名無しさん (ワッチョイ 66aa-ihwj)
垢版 |
2019/02/23(土) 21:41:02.60ID:W1FUX4jY0
プリミティブな定数以外のスイッチって
ものすごく気持ち悪いんだが

長大数渡して色々工夫してスイッチするのと
似たようなことコンパイラがやらなきゃいかんよね
0269デフォルトの名無しさん (ワッチョイ 3d7b-Frsa)
垢版 |
2019/02/24(日) 07:48:44.15ID:RgZ/0jGo0
C の enum は「互いに区別できる一群の整数値の組」で、
具体的な値にさほど拘らない用途で使うべき、っていう
言語機能のそもそも論を言われると、その通りなんだよな。

その意味では case のラベルに enum の値を使うのはいいけど、
配列定義の要素数で使うのは便利にコキ使いすぎ、って感じか。
実際のところ enum で表現できる値の範囲が、
配列の要素数指定に使える範囲(size_t)と一致するか、という
疑問を持って調べたけど、いまいちハッキリせず今も解消してない。
まぁ、それ言うと case ラベルで受け入れられる値の範囲が
enum の範囲と同じか、についても確信ないんだが。


(権威主義に逃げ込む気はないと事前に言い訳した上で)
#define のマクロ値の代わりに enum の値を使うってのは、
カーニハンとパイクの『プログラミング作法』第1章、
「1.5 マジックナンバー」で紹介されてることを付記しておく。
0271デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/24(日) 08:40:26.06ID:7CaxIYof0
以前に組込み用途の8bitマイコン用C言語を使っていた時の話
CPUの機能的にint型は8bitだった
ところが多条件の分岐処理でif-elseを使った時よりenum変数のswitch文使った方が明らかにパフォーマンスが
低下して問題になったことがあった
訳が分からず逆アセンブルして調べてみるとenum変数は何故か16bitに展開されていて条件判定毎に型変換が
発生していたことが原因だっということがあった、という昔の思い出
0272デフォルトの名無しさん (ワッチョイ 5e3e-dS/9)
垢版 |
2019/02/24(日) 13:48:01.77ID:gUJTdPsI0
>>271
int が 8bit という時点で仕様に反しているので
整数演算のいろんなところで暗黙に int に変換してから
計算する C のルールが破綻するんじゃなかろうか。

処理系が必ずしも言語の規格に完全準拠する必要はないけど、
基本的な部分で変えちゃうとどういう挙動になるのか
予想しづらいよな。
0273デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/24(日) 14:00:01.86ID:7CaxIYof0
charがその処理系の最小bit数であることだけは仕様に明記されてるけど
それ以外の整数型は大小関係だけが規定されていてintそのものに
具体的なbit数の決まりはなかったんじゃなかったっけ?
実際その時もchar、short、intが8bitで、longが16bitだったと思う
0274デフォルトの名無しさん (ワッチョイ 5e3e-dS/9)
垢版 |
2019/02/24(日) 14:04:53.91ID:gUJTdPsI0
>>270
C ではこういうルールになっている
・ 列挙定数の値を定義する式は int 型で表現可能な値を持つ整数定数式でなければならない
・ 列挙体 (列挙型のオブジェクト) の大きさは要素の全てを保持可能な大きさをもつ
 がその選択は処理系定義である。
・ 列挙定数の型は (列挙型ではなく) int である

つまり、 C では列挙体と列挙定数の型が異なり、
列挙定数の型は int そのもの。
それは単に int の大きさがそれぞれ違うってだけじゃないの?
だとするとどちらの挙動も仕様通り。

(余談だが C++ では列挙定数の型は列挙型なので、 C とは少し解釈が違う。)
0276デフォルトの名無しさん (ワッチョイ 5e3e-dS/9)
垢版 |
2019/02/24(日) 14:15:23.84ID:gUJTdPsI0
>>273
ビット数という形ではないが、
limits.h で定義される各整数型が表現可能な数値の範囲を表すマクロ
についての最低限度の値という形で間接的に定義されている。
C99 だと 5.2.4.2.1 にある。
int は実質的に 16bit は必要。
0278デフォルトの名無しさん (スッップ Sd0a-5Ibu)
垢版 |
2019/02/24(日) 16:23:47.05ID:9mv8IHEdd
確かにint型は規格的には最低16bit必要みたいだなぁ

C11 N1570 draft
5.2.4.2.1
―int型オブジェクトの最低値
INT_MIN -32767 // -(2^15 - 1)
―int型オブジェクトの最大値
INT_MAX 32767 // 2^15 - 1
6.2.5.5
「単なる」int型オブジェクトは実行環境のアーキテクチャにとって自然な(<limits.h>ヘッダに定義されたINT_MINからINT_MAXまでの任意の値を含むに十分大きい)サイズをもつ。
0280デフォルトの名無しさん (ワッチョイ 6ada-JHNE)
垢版 |
2019/02/24(日) 16:49:38.07ID:7CaxIYof0
言語規格そのものというより標準ライブラリの都合というかヘッダーの仕様だけのような気がするけど
limit.hで最大値と最小値を規定するのであれば-128と127を宣言すればintの範囲を変更した実装も可能ではあるな
厳密には問題があるかも知れないけどC99準拠の実装と言うことでお茶を濁している処理系はあり得そうだ
0281デフォルトの名無しさん (アウアウウー Sa21-sU2d)
垢版 |
2019/02/24(日) 19:23:23.70ID:iK4D+UQia
>>279
組み込み市場的に8ー16bitが主流だけどな。
0284デフォルトの名無しさん (ワッチョイ 6ada-JHNE)
垢版 |
2019/02/24(日) 22:24:41.13ID:7CaxIYof0
組み込みではLinuxどころかOSすら搭載してないシステムも多いよ
ネット家電なんかの一部を除けばエアコン、冷蔵庫、洗濯機など家電製品の殆どはOSもファイルシステムもネットワークスタックも無縁のスタンドアローン動作
電源投入リセット後ひたすら処理ループを回すだけ
CPUコアは8bitか16bitでRAMは数KB、ROMは数十KB程度のワンチップマイコン
0287デフォルトの名無しさん (ワッチョイ 6ada-JHNE)
垢版 |
2019/02/24(日) 22:41:13.06ID:7CaxIYof0
電卓ほど単純ではないけどね
まともにフィードバック制御を実装するにはそれなりの演算負荷は掛かる
センサー入力に応じて出力を迅速安定に目標に追従させるには裏では予測判断も必要
マイコン使っている以上は単調なON/OFF制御では無いよ
0293デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/25(月) 06:19:38.59ID:/Zb+jKgT0
>>291
IOポートを弄るにはそれぞれのSFR(特殊機能レジスタ)を操作する
一般的なメモリマップトIO方式ではSFRはCPUの特定のアドレス空間にマッピングされてる
Cプログラムからはそのアドレス空間をそれぞれ適当な変数に割り当てて基本的にはビット操作で制御する
SFRのイメージが分からなければ適当なマイコンのデータシートでも見てみるとある程度は分かると思うよ
参考として電子工作で有名なPICマイコンのサイト貼っておくので見てみるといいよ
0298デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/25(月) 07:52:33.64ID:/Zb+jKgT0
メモリ(RAM)に割り当てられた変数は演算とその結果に意味がある
IO(SFR)に割り当てられた変数はビットのR/W操作そのものに意味がある
SFR変数上で演算操作を行うとほぼ確実に誤動作、暴走する
0303デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/25(月) 11:12:53.53ID:/Zb+jKgT0
Read動作を確実に実行するためだろう
プログラム上はSFR変数からダミー変数への代入にしか見えないので何の演算にも関与しないと判断されて
コンパイル時の最適化で処理が削除される恐れがある
SFR変数はvolatile宣言しておくのが普通
0308デフォルトの名無しさん (ワッチョイ a6e1-rusg)
垢版 |
2019/02/25(月) 12:15:38.73ID:KHsK1sBo0
>>305
他に何に拘っていると言うんだ?

> 書き込みと読み出しが別のものに繋がっていることもある
 ↑
 何の関係があるんだ
 ↓
> volatileは本来このためにある

答えるか撤回かどうなんだ
0310デフォルトの名無しさん (ワッチョイ a6e1-rusg)
垢版 |
2019/02/25(月) 12:44:45.62ID:KHsK1sBo0
>>309
306は話のすり替えだ
READの回数やタイミングの話なんかしていない
READとWRITEの対象が違うということについてだ
volatileと何の関係があるのか
ただの言い間違えか
どっちだ?
0313デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/25(月) 12:53:40.05ID:/Zb+jKgT0
>>308
知らんがな、>>299本人に聞けよ
一般に言えることはメモリ上の変数の場合は読み込みと書き込みの間には必ず何らかの関連性を持っている
意味もなく読み込みや書き込みを行うことはなくその値は必ず何処かで利用される
利用されなければ変数もろとも普通は最適化で削除される
SFRの変数の場合はRead/Writeその操作の行為そのものが目的であってその結果その値がどうなろうが値そのものには何の意味もない
コンパイラにそのことを明示的に指示する方法がvolatileということ
0316デフォルトの名無しさん (アークセー Sxbd-DIal)
垢版 |
2019/02/25(月) 13:15:23.23ID:QDSDQN71x
>>314
全然難しくはないし、組み込みに限った話じゃないよ。
ただ単に「今見えている処理とは別のとこからそのアドレスの値が更新される可能性があるので最適化しちゃダメよ」ってのを明示的に示すためのvolatileなので。
C#やJavaとかでもスレッドをまたいで不用意にアクセスする変数はvolatileつけないとバグるし。
0318デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/25(月) 13:17:16.26ID:/Zb+jKgT0
横レスだけどWrite属性のSFRの値(この場合CR)をReadしても値は不定だけどね
同一アドレスにマッピングされているRead属性のSFRの値(SR)の値が返ってきて変数に代入されているだけ
普通はWrite属性のSFRの状態を記憶する必要があればバッファ変数に内容を保存しておく
0320デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/25(月) 14:03:17.60ID:/Zb+jKgT0
Read/Write属性というのはあるよ
むしろその方が多い
ただ前レスに出てきたCR(コントロールレジスタ)とSR(ステータスレジスタ)は意図的にその名称通りにWriteまたはRead専用属性の例として
提示してきたんだろ、多分
0322デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/25(月) 14:31:07.16ID:/Zb+jKgT0
すまん
書き込みの意図がいまいちよく分からんのだけど出力形式の切り替えの話か?
オープンコレクタ出力とトーテムポール出力の切り替えか?
というかこの文脈でデコードの意味が分からん、何のこと?
0326デフォルトの名無しさん (スプッッ Sdea-89Xw)
垢版 |
2019/02/25(月) 17:25:52.43ID:8PqGNbvAd
volatileの話が本筋と関係ないなら適当に流して先に進めばよかったんだよ。
それなのに噛みついて話を爆発させてしまったところにコミュニケーション能力の欠如を感じる。
0330デフォルトの名無しさん (ドコグロ MMb1-ZgJD)
垢版 |
2019/02/25(月) 19:02:12.96ID:y5m/9TYHM
>>320
> Read/Write属性というのはあるよ
いやいや、 Read onlyとかWrite onlyって言うのはわかるけどRead/Write属性なんて言う用語を使うか?
って話な

>>324
なんとなくデコードって言うのはアドレスデコードした信号(要するにChip select)にRE(多分Read enable)とかWE(Write enable)をandする話だと思う
ゲートとトーテムポールはよくわからん
0336デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/26(火) 06:45:38.56ID:H5mf7PMC0
>>330
ちょっと亀レス気味だけど、確かに属性というのは一般的ではなかったかな
当時使っていたCコンパイラでは同一アドレスにマッピングされたRead OnlyとWrite OnlyのSFR変数は
共用体unionで宣言するのだけど、それぞれが読み込み/書き込み専用の変数名であることを明示するために
プリプロセッサの#pragmaでいわゆる属性(R, W, R/W)を宣言することが出来た
Read属性変数に代入操作を行なったりするとコンパイル時に警告されるような仕組みになってた
0337デフォルトの名無しさん (アークセー Sxbd-DIal)
垢版 |
2019/02/26(火) 07:46:54.76ID:25yR6Zgwx
write属性レジスタってのは確かに一般的ではないけど、かといって用語としてwrite専用レジスタじゃないといけないって明確なルールもないだろうし、仕様書書いてるわけじゃないので別に雰囲気で伝わるから気にしなくていいんじゃない?
0343デフォルトの名無しさん (ワッチョイ 6ada-rusg)
垢版 |
2019/02/26(火) 13:31:09.42ID:H5mf7PMC0
確かに昔からハードウェア弄ってきた純粋の組込み専門屋にとって、周辺デバイスの制御レジスタをSFR変数として抽象化して捉えることが出来ないとは思ってもなかった
一般的ではなくても属性で話は通じると思ってたんだけどなあ
というか本当にC言語で開発してるのだろうか?
0344デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/26(火) 13:45:18.64ID:hfhf4rvY0
「出来ないとは思ってもなかった」

否定の否定表現でわかりにくい。
0349デフォルトの名無しさん (ワッチョイ 11da-1onY)
垢版 |
2019/02/26(火) 15:07:48.55ID:qT2RVqJL0
C言語の一般的な話題を扱うスレなんだから
特定の人間を排除するような発言をするのはおかしいだろう
そういう特定の話題をしたいならスレを立ててすればいい
ワンチップマイコンは専用スレ立ててそこでやれと言う話
0358デフォルトの名無しさん (アウアウウー Sa21-rusg)
垢版 |
2019/02/26(火) 17:43:39.42ID:k06atLuFa
みんな愛し合っているのさ
0361デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/26(火) 18:35:04.99ID:c2o2e7e/a
>>359
つんでれ
0362デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/26(火) 19:43:38.47ID:hfhf4rvY0
>>346
それ単にプログラム内のルールにすぎない。どんな言語であれ、入れ物を使い分けを限定することで、プログラマのミス防止や可読性、保守性が高まるのは、まともなプログラマなら必ずやっている。

これがハードウェアの機能にあるのか、ソフトウェアの機能にあるのか、それともそんな機能はないのでコーディングルールなのかの違いにすぎない。
0363デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/26(火) 19:52:11.95ID:hfhf4rvY0
>>346
それ単にプログラム内のルールにすぎない。どんな言語であれ、入れ物を使い分けを限定することで、プログラマのミス防止や可読性、保守性が高まるのは、まともなプログラマなら理解している。

これがハードウェアの機能なのか、ソフトウェアの機能なのか、それともそんな機能はないのでコーディングルールなのかの違いにすぎず、現代では常識的な話。

コンピュータにとっては動けばいいわけで、設計の話とアーキテクチャの話をごちゃ混ぜするからよくない。

高水準言語であればあたりまえすぎることだが、C言語は中水準言語で、OS、ハードウェアの組み合わせにより、動きが異なるから、本来は仕様、設計があって考えること。

これがアーキテクチャがこうだから、こういう発想になるというのは順番が逆。
0364デフォルトの名無しさん (ドコグロ MM15-ZgJD)
垢版 |
2019/02/26(火) 19:57:57.62ID:Dl2cSn2NM
普通に一般化してる用語で話せばいいのになぜかオレオレ用語使って指摘されたらわからないのかとか逆ギレw
なんとなくはわかってもそのローカル用語が意図してるものと自分が思ってるものが同じかどうかはわからんから指摘してるのに…
まともなエンジニアじゃないんだろうな
0365デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/26(火) 20:20:38.82ID:c2o2e7e/a
長文が溢れるスレ
0369デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/27(水) 12:55:17.62ID:1o6M4rIDa
そんな一般論だけ書かれても・・・
0372デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/27(水) 21:26:14.35ID:1o6M4rIDa
Bare ボーン
まゆげボーン
0376デフォルトの名無しさん (ワッチョイ d7da-mjQG)
垢版 |
2019/03/01(金) 15:17:20.50ID:ixp8onlm0
すみません、初心者なんですが図書館にプログラミング言語Cという本があったので借りてきて勉強中です。
p105のコード
nはint

if(n / 10)
printd(n / 10)

なんで割り算自体を条件に出来るのですか。
0379デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 15:23:30.96ID:ber2ILYja
>>376
C言語のifは0か0以外かしか見ていないため。
0383デフォルトの名無しさん (ワッチョイ ff2c-Im2K)
垢版 |
2019/03/01(金) 16:01:43.78ID:yZJ4Zkhu0
>>376
こういうように条件文に、実質的なbool 値以外を書いたら、ダメ!

MISRA-C みたいな、安全なコーディング規則があって、禁止事項になってるから、
普通のプログラマーは、変に思うはず
0385デフォルトの名無しさん (ワッチョイ 9f18-W5e4)
垢版 |
2019/03/01(金) 16:59:37.54ID:wVb5PmwP0
説教くせえことを書くならてめーの言葉遣いくらい気をつけろ
boolじゃねえだろ_Boolだ
MISRA-Cが安全だなんて決まりはどこにもねえぞ
コーディング基準はそれを守りさえすれば安全だなんて信じているようだが自分の頭で考えることを放棄した手合いか?
少なくともそういうカスはPGとして普通未満だぜ
0386デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 17:32:32.07ID:ber2ILYja
>>380
そう。比較する演算子を使うとその結果が0または1になるので他の言語でのifと同じようにも使える。
0391デフォルトの名無しさん (スッップ Sdbf-x13U)
垢版 |
2019/03/01(金) 18:24:56.22ID:nQNJhNQvd
>MISRA-Cが安全だなんて決まりはどこにもねえぞ
>コーディング基準はそれを守りさえすれば安全だなんて信じているようだが自分の頭で考えることを放棄した手合いか?
>少なくともそういうカスはPGとして普通未満だぜ

この3行が主張なわけでboolについて話してる時点で話それてないか?w
0392383 (ワッチョイ ff2c-Im2K)
垢版 |
2019/03/01(金) 18:25:12.46ID:yZJ4Zkhu0
漏れが言ってるのは「実質的なbool 値」
特定の物を指していない、一般的な言語での概念

条件文に、実質的なbool 値以外を書いたら、ダメ!
品質基準から減点される

トヨタでも、100点満点中、5点しか取れなかったとか、言ってる人いる

MISRA-C 無しのC 言語は使ってはならないと、決まっている!
0393デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 18:32:42.09ID:ber2ILYja
昔々、int bool = 0; と書いてあって普通に変数として bool が使われている夫馬ログラムを見た事がある。
0395デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 18:33:54.49ID:ber2ILYja
夫馬ってなんやねんw
スマホでの打ち間違いは候補間違いもあるからより変な風になるなあ。
0416383 (ワッチョイ ff2c-Im2K)
垢版 |
2019/03/01(金) 19:56:06.23ID:yZJ4Zkhu0
essentially Boolean (実質的なブール型)

C90にはブール型はないが、真又は偽のブール値を表す式はある。
MISRA-C:2004ではこのような式をブール式と呼んで、数値を表す式と区別しており

if (hoge==TRUE)

このhoge が、実質的にはブール値なら、if (hoge) と書いてもOK
0417デフォルトの名無しさん (アウアウクー MM0b-tQZn)
垢版 |
2019/03/01(金) 19:56:10.11ID:f15qqb/AM
>>404
そういう例はやめた方がいい。二度、評価することをおかしく感じなくなる。
0419383 (ワッチョイ ff2c-Im2K)
垢版 |
2019/03/01(金) 20:02:55.75ID:yZJ4Zkhu0
2値しか取らない、真偽値という概念を作り出して、単純な数値と区別している

明瞭になるように、可読性を高めるために、明確に使い方を分けている
0420デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 20:09:43.22ID:ber2ILYja
みそら・・・
0421383 (ワッチョイ ff2c-Im2K)
垢版 |
2019/03/01(金) 20:13:59.03ID:yZJ4Zkhu0
essentially Boolean (実質的なブール型)

hoge が単純な数値なら、if (hoge) とは書けないので、
比較演算子などを使って、( )内を真偽値にしなければならないが、

hoge を2値しか取らず、実質的には真偽値として扱っているなら、そう書いてもよい
0422デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:17:31.73ID:zSE4SpXO0
>>19
なに時代だよ、trueとfalseだろ
0423デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:18:43.90ID:zSE4SpXO0
>>376
そう書くなよ
条件文でかけ
0424デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:20:05.53ID:zSE4SpXO0
>>382
というよりtrueとfalseを使えよ
0425デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:21:09.40ID:zSE4SpXO0
>>385
bool だよ
0434デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/02(土) 01:28:32.24ID:ixsZHls30
if文の仕様がまずかったんだよな。演算子がコマンドで数値を返すところがいまとなってはわかりにくい。
0437デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/02(土) 03:06:19.06ID:ixsZHls30
キャストしないといけないのか
0439デフォルトの名無しさん (ワッチョイ 9fda-W5e4)
垢版 |
2019/03/02(土) 06:31:18.66ID:uyGBCzAL0
_Bool型(stdbool.hインクルード時はboolも可)の値は0か1しか取り得ないのでわざわざキャストする必要は無い
しかしながら自分はC言語では普段は_Boolもboolもどちらも使わない
単純にintなどの数値型を0か非0かだけで判断して使ってる
尤もC++ではbool型は普通に使っているけど
https://i.imgur.com/47mIrVh.png
0440デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/02(土) 06:54:46.28ID:uz1yhwTy0
>>376 を見て、久し振りに『プログラミング言語C』を開いてみたところ、
確かに p.105 に printd() って関数が載ってる(第2版)。
ここのテーマは再帰なので printd() は「1文字出力 putchar() を使って、
整数値を10進数で表示する再帰関数」の例。

話題の if (n / 10) では「n が 10 以上か」を判定してる。
直前で符号の処理をしてるので n が負ではないことは保証される。
(さらに「だだし n == INT_MIN の場合は…」に相当する注記あり)

で if (n / 10) が if ((n / 10) != 0) の意味だってことは、
p.68 第3章 制御の流れ 3.2 If-Else でさらりと説明されてるし、
その前 p.63 の条件式(三項演算子)の部分なんかにも載ってる。
たぶん他にも、あちこちで出てるんだろう。


「真と偽」みたいな独立した項目を立てた方が良かったんじゃないかな。
そうすりゃ索引からも探せるようになるし。

ついでに言えば、この場面では if (n / 10) より if (n >= 10) の方が
やってることが明解だし、処理も軽い気がするなぁ。
0441デフォルトの名無しさん (ワッチョイ 9fda-W5e4)
垢版 |
2019/03/02(土) 07:05:29.88ID:uyGBCzAL0
単純に開発当時のC言語としては処理をシンプルにしてパフォーマンスを稼ぎたかったのだと思うよ
普通のCPUは0か0でないかの判断は得意だけど0か1の判断は手間が掛かる
少しでもパフォーマンスを稼ぎたい場合(現在では組込み用途など)では余計な処理は極力除くように工夫する
0444デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/02(土) 08:01:55.04ID:uz1yhwTy0
いや、さすがに単純な整数値の大小比較と、割り算とで
どちらが速いか実測しなくちゃ分からないってのは
「実測しろ」って原則を無批判に(条件反射的に)
振りかざしてるんじゃないの?
予測は一切禁止ってルールじゃないでしょ。
0447デフォルトの名無しさん (アウアウウー Sa9b-mjQG)
垢版 |
2019/03/02(土) 10:48:59.21ID:op59Vyc6a
でもcのコンパイラって割り算の時は最初に比較があって、n < 10なら比較直後に0返すんじゃなかったかな。
昔アセンブラの実習でやった気がする。
帰ったらみてみよ。
0452デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/02(土) 16:14:23.72ID:ixsZHls30
>>447
割り算はコンピュータにとって簡単なことではない。人間だってそうだろ。
0455はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-3oSp)
垢版 |
2019/03/02(土) 17:04:52.74ID:tMatklv80
C では比較演算子が返すのも、 if の判定にも真偽値型は現れない。
真偽値型は後付けで、言語の中核の意味論には関与しない。
真偽値型は整数型の一種だから何か演算しようとすると整数拡張で int になってから計算するしな。

_Bool で表現してもほとんどの場合にコメントと同程度にしか意味ない。
コメントと同程度に「意図」を表せるならそれはそれで有用ではあるけど、
型システムが間違いを防止する役に立つ場面はあんまりない。

(余談だが C++ では (組込みの) 比較演算子は真偽値型を返すし、
if の条件節は真偽値型にキャストして判定するので C とは解釈が違う)
0463デフォルトの名無しさん (ワッチョイ ff63-3oSp)
垢版 |
2019/03/02(土) 18:07:30.88ID:U++dipsO0
「ばあさん、いただきものは型を意識した応答だろう」
「いいえ、お爺さん型を意識した応答でしたよ」
「そうかい、わしゃまた型を意識した応答だと思ったよ」
0466はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-3oSp)
垢版 |
2019/03/02(土) 18:46:41.44ID:tMatklv80
>>464
双方が int に拡張されて足し算されて 2 になったのが
再び bool にキャストすると 1 になる。

演算子の両方の型が int より小さい場合には
両方が int に拡張されてから計算されるというのが
C の基本的なルール。
(全ての演算子がそうというわけではない。)
0467383 (ワッチョイ ff2c-Im2K)
垢版 |
2019/03/02(土) 19:01:27.14ID:Gk4CLPf80
>>455
MISRA-C は、C89/90に、bool という概念をバックポートした。
それを「実質的なブール型」と呼んで、単純な整数型と区別している

ブールを表現する場合は、整数型を使っていても、
それはブール型ですよってアピールする事で、
技術者間での意思疎通を図り、安全性を高める
0472383 (ワッチョイ ff2c-Im2K)
垢版 |
2019/03/02(土) 19:43:06.08ID:Gk4CLPf80
整数型には加算はあるけど、
ブール型として扱うなら、加算は存在しない

AND, OR, NOT だけしかない

だから技術者間での、こういう共通意識が大切なわけ。
これは「実質的なブール型」として扱っているから、整数型の演算はできません!

ブール型が無かった時代の、
技術者間での意思疎通を図り、安全性を高める、苦肉の策
0474 ◆QZaw55cn4c (ワッチョイ bfe9-IBRN)
垢版 |
2019/03/02(土) 19:56:01.42ID:Ud+LwFnR0
>>467
>それはブール型ですよってアピールする事で、技術者間での意思疎通を図り
そういうのは、わりきってハンガリアンを使う方がいいのでは?
bool を使うことで文法的縛りが導入されないことには意味がない気がします
0477はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-3oSp)
垢版 |
2019/03/02(土) 20:47:30.41ID:tMatklv80
>>467 >>472
コーディング規約・ガイドラインを設けるのは結構だが、
それを守っている組織・プロジェクトの中では意思統一しやすいという話であって、
技術者一般にまで適用できるほど強い権威は MISRA-C には無いよ。

仮に (あくまで仮に!) MISRA-C がとても良い習慣だとしても、
言語仕様としての理屈を理解しておくことは大前提だ。
元の質問者である >>376 みたいなのに MISRA-C を勧めても何のたしにもなりゃしないだろ。

規約としての理屈よりも言語としての理屈をまず説明してわかってもらわんと。
0480デフォルトの名無しさん (ワッチョイ 9f01-dMaL)
垢版 |
2019/03/03(日) 06:55:31.52ID:EUJr/Yte0
>>479
> 最後に評価されるタイミングで一致してりゃなんでもいいんだけどね
とか言うなら内部処理ガーとか言うなよ
って話だろ

> +って相当するのはxorだかorだかわからんという問題もあるね
orはわかるがxorになることなんてあるのか?
0482デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/03(日) 08:25:42.12ID:HIAqsaOR0
ブール値は 0/1 しかとらないから1ビットの整数値、と解釈して
true + true == 1 + 1 == (2進数で)10 → 下位1ビットを採用して結果は 0
よってブール値での加算はビットでの排他的論理和と同等、
という考え方もあるんだわ。

「無符号整数のオーバーフローの方式を1ビット幅まで狭める方向に推し進める」
とでも言おうか。
0483デフォルトの名無しさん (ワッチョイ 9fda-W5e4)
垢版 |
2019/03/03(日) 08:41:37.16ID:ojZ/TgF60
基本的なハーフアダー演算器の考え方だね
キャリーを出力してビットを反転させる
多ビット加算の基本構成
いくら高級アセンブラとしてのC言語であってもキャリーを抽象化した演算を実装するのは結構面倒だけど
多バイト加算はそれなりに手間が掛かる
0485デフォルトの名無しさん (ワッチョイ 9f01-dMaL)
垢版 |
2019/03/03(日) 10:00:14.37ID:EUJr/Yte0
>>482
> よってブール値での加算はビットでの排他的論理和と同等、
> という考え方もあるんだわ。
そんなの聞いたことないw
お前のオレオレ理論じゃないと言うならその考え方を示してる例を出してくれ
0486482 (ワッチョイ d77b-vPGa)
垢版 |
2019/03/03(日) 10:41:34.05ID:HIAqsaOR0
>>485 分かりやすく説明できる自信はないけど、一応答えてみる。
と言っても、新しい情報は出ないので期待されちゃ困る。

>>482 は、そう考える考え方(代数系)が可能、という意味で、
そのように内部処理してるプログラミング言語の処理系が存在する、
という主張とは違うって点をまず断っておく。

その「ブール値の加算を排他的論理和と同等に扱う」体系が
内部的に矛盾を生じないこと、実用的な面で利用価値があり、
現実にも使われているってことは、>>483 がコメントしてくれた
前半部分で、十分に例示されてると思う。
て言うか、俺が下手にクドクド書いてもあのレベルは無理。
0487デフォルトの名無しさん (スププ Sdbf-5O6o)
垢版 |
2019/03/03(日) 10:46:47.10ID:3MaRmCtMd
少なくともC言語である限りは規格に反するんじゃ?
_Bool型は0に等しければ0、その他は1って明記されてる(C11の6.3.1.2)から2進数で10は0に等しくないように思うが
0489デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/03(日) 11:25:33.68ID:HIAqsaOR0
Cの、ビット幅の狭い整数値は int に変換してから計算するってルールにより
true + true → (int)1 + (int)1 == (int)2 → true
という流れで true + true == true であることは納得してるんだ。
型が _Bool でも適用されるよね。勘違いなら訂正求む。


(今回の話とは直接関係ないけど、まるっきり無関係でもない余談)
ただ、これが例えば unsigned int の値を真偽値として扱う場合だと、
unsigned int a = UINT_MAX; // 真偽値としては真
unsigned int b = 1; // 真偽値としては真
a + b == UINT_MAX + 1 == (オーバーフローして)0 → 真偽値では偽!
という事態も起こりうるのでご注意。
0490デフォルトの名無しさん (アウアウカー Sa6b-WzxR)
垢版 |
2019/03/03(日) 11:31:58.04ID:f6/fijs9a
加算てのは常に状態を変える操作なので、論理演算としてはXORの方が似てるんですよ。
もちろん単に似てるという話で、加算は禁止するくらいが正しいといえば正しい。trueとfalseを1と0に割り当てたせいで足し算できそうな気になってしまったのがよくない。
1ビット整数だと考えてもいいが、元々そんなもんないからsizeofも1以上にするしかないという。
構造体に入れたらビットフィールドと同じメモリのレイアウトになるんだろうか。実装としては。
0491デフォルトの名無しさん (ワッチョイ 9fda-W5e4)
垢版 |
2019/03/03(日) 11:46:05.73ID:ojZ/TgF60
C言語の_Bool型(boolはただの別名)のtrueを1以外に割り当てるとC++との互換に問題が生じる
C++のbool型のtrueの内部表現は1
bool(論理型)をcharやintなど(整数型)にcastすると1が返される
C++では論理型同士での四則演算は不可能なので問題は生じないが論理型の存在しないC言語ではどうしようもない
trueを1に割り当てて妥協するしか無いと思う
0493 ◆QZaw55cn4c (ワッチョイ bfe9-IBRN)
垢版 |
2019/03/03(日) 21:09:45.45ID:OccEVyH10
>>444
>「実測しろ」って原則を無批判に(条件反射的に)振りかざしてるんじゃないの?

いいところを突きますね、そうそうその調子、いい感じですよ
百人一首の上の句と下の句をつなげる、みたいな思考力を使わない、言葉のオートマタを批判するのはすばらしい着目です、感心しました
0496デフォルトの名無しさん (ワッチョイ 9fda-W5e4)
垢版 |
2019/03/04(月) 07:32:41.06ID:yZdj1rJq0
昔8bitマイコンの組込みシステム開発で、被除数が24bit長、除数が固定値(値は3)の除算処理が必要となったとき、
C言語の除算処理では実行時間が要求仕様を満足しなかったのでインラインアセンブラで書き下ろしたことがある
処理系そのものは16bit長までしか対応してなかったので、32bit長の汎用演算ライブラリ関数が付属してたのはいいけど
そのライブラリが遅くて使い物にならなかった
0497デフォルトの名無しさん (アウアウウー Sa9b-mjQG)
垢版 |
2019/03/04(月) 09:27:34.36ID:uCsPZ+haa
昔bool型ってのを初めてみたときは、誰が使うんだよ気持ちわりーって思ったな。charで8個もフラグ取れるし、
flg & 04とかで好きな位置のビット取れるし、なんでわざわざtrue,falseと思ったもんだ。
0501デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/04(月) 16:53:38.87ID:TpCWsYE80
>>497
思い切り最適化されて最終的なコードがそうなれば誰も文句言わないんだろうけどな。
0502はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-3oSp)
垢版 |
2019/03/04(月) 17:08:34.72ID:Cw9L4ZBc0
bool は真偽値を格納するのに充分であればいいんだから普通は 1 バイトだろっていうのも昔の話で、
今の主要な処理系はだいたい int と同じ幅だったりしてあんまりリソースの節約にもならんかったりするし。
0503デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/04(月) 17:13:39.42ID:7Cz1/mIW0
ブール値の変数を1ビットで表現して1バイトに8個押し込めば
容量の節約にはなるだろうけど、速度的には損な気がするな。
(これも「実測しなけりゃ何も分からない人」向けの釣り餌かも)

ブール値をバイトなりワードで記憶すれば、CPUによっては
レジスタにロードした時点でゼロフラグに反映されて
ゼロとの比較やマスク演算が不要という利点を得られる場合もある。
0504デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/04(月) 17:16:40.19ID:TpCWsYE80
>>503
CPUしだいだろうね。レジスタに入れないで0かどうかだけ調べる命令があったらそれの方が速いかも知れんし。
0505デフォルトの名無しさん (ワッチョイ 9f2f-W5e4)
垢版 |
2019/03/04(月) 17:18:44.97ID:kNFhD2SD0
                  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                  |CPUしだいだろうね。レジスタに入れないで0かどうかだけ調べる命令があったらそれの方が速いかも知れんし
                  \___________  _______
                                    V
   / ̄ ̄ ̄ ̄ ̄ ミ                      / ̄ ̄ ̄ \
  /   ,――――-ミ                   /         |
 /  /  /   \ |                    ∨∨∨∨∨\ |
 |  /   ,(・) (・) |                    |▲  ▲  ||
  (6       つ  |                    |(・) (・)  6)
  |      ___  |                    | |    ||
  |      /__/ /                    |  ¨     /
/|         /\                    \/\  /\
                                  / ̄ ̄ ̄    \
     ∧
  / ̄   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | なわけねーだろ!!
  \__________________
0506はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf3e-3oSp)
垢版 |
2019/03/04(月) 17:21:36.33ID:Cw9L4ZBc0
真偽値の超巨大な配列が必要な場合ならともかく、
今の時代なら 1MB が 8MB になったくらいならたいした差ではないしな。
ただ、キャッシュにのるかどうかで劇的な差になったりもするから、
そこらへんは状況によるというか、それこそ実測しなきゃわからん。
0511デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/04(月) 18:38:48.94ID:TpCWsYE80
>>505
あれ?そう?そう断言できる根拠あるの?
0512デフォルトの名無しさん (ワッチョイ 9f2f-W5e4)
垢版 |
2019/03/04(月) 18:51:09.16ID:kNFhD2SD0
>>511
レジスタに入れないでって無理
メモリREADサイクルでどのみちラッチするんだから
名前のある公開レジスタか、名前のない非公開レジスタかという違いにしかならない

どうしても疑うんならHDLでCPU書いてみろ
0514503 (ワッチョイ d77b-vPGa)
垢版 |
2019/03/04(月) 19:06:20.72ID:7Cz1/mIW0
自分にツッコミ。
「ブール値の変数を1ビット幅にしてメモリ1バイトに8個押し込む」方式は
Cの規格とは相性悪いね。
&でポインタ取ったときにバイト番地で表現できないとか、
sizeofで1より小さな小数を返すのか、とか。
「ある変数が1バイトより小さな領域しか占めない」って性質が原因だ。

>>509
その点は気がつかなかった。1回の判定しか考えてなかったわ。
1バイトを1回だけ読んでマスク値をシフトしながら判定と、
1バイトずつ8回読むのとで比較しないといけないね。
一度にもっと多く、4バイト単位とかで処理できるかも知れないし。
0515デフォルトの名無しさん (ワッチョイ d701-WeXs)
垢版 |
2019/03/04(月) 19:30:00.46ID:FaqzbzR10
ソフトから見て1命令でも、メモリに対して1バスサイクルでビット操作は不可能だからねぇ。
メモリビット操作命令は裏でマイクロコードが暗躍して結局ロードストアアーキと同じ動きしてる。
lockが必要ない利点はあるけども。
0517デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/05(火) 00:00:07.09ID:VLRAu/TX0
>>512
知らんよ。そういうCPUがあればそうだねってだけの話だし、お前もその自分の体験や知識から言ってるだけで全世界の全CPU調べた上で言ってるわけじゃないだろ?予想外の変なCPUはあるかも知れんから断定はできんだろう。
0518デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/05(火) 00:07:19.93ID:VLRAu/TX0
>>514
一応C言語では構造体にビットフィールドがあってビット単位で扱う事が出来るようになっているな。まああれは数値変数として扱うだけでboolではないわけだけど。効率が良いかどうかはどう最適化されるかに掛ってるかな。
0520KAC (ブーイモ MM3b-KKw9)
垢版 |
2019/03/05(火) 00:55:28.63ID:zhV7s4kGM
>>515
メモリバスがネックになるようなシステムなら、
バス幅のビット分情報が詰まってるほうが、
メモリのアクセス回数減らせるから利点もあるだろう。

なんにしろ、一長一短は有るんだから
正しく理解して正しく使うことが重要かと。
0521デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/05(火) 05:52:07.47ID:Q+OO1XNi0
>>518 1ビット幅のブール変数をビットフィールドと同じ扱い、
つまり「アドレスを求めることもsizeofを適用することもできない」
というルールにする手はあるか。

と言っても、アドレスを取れないとなると、ポインタ経由での操作、
配列に入れてインデクスで順番に走査することもできないわけで
非常に使い勝手の悪いものになってしまうね。
0522デフォルトの名無しさん (ワッチョイ 9fda-W5e4)
垢版 |
2019/03/05(火) 06:03:05.43ID:C3u1nlxm0
ビットフィールド構造体はあくまで構造体であるのでアドレスを返すことは出来る
というか自分ならビットフィールドだけでは使い勝手が悪いので構造体をcharなどと一緒に共用体に纏める
構造体を配列で操作するときなどは同一アドレスのchar変数でビットフィールドを纏めたパッケージとして取り扱う方が使い勝手がいい
0523デフォルトの名無しさん (ワッチョイ bf8c-Q9lp)
垢版 |
2019/03/05(火) 06:15:17.45ID:BSZ7CWqR0
maxima
(%i1) load("bitwise")$
(%i2) bit_not(i);
(%o2) bit_not(i)
(%i3) bit_not(bit_not(i));
(%o3) i
(%i4) bit_not(3);
(%o4) - 4
(%i5) bit_not(100);
(%o5) - 101
(%i6) bit_not(-101);
(%o6) 100
0524デフォルトの名無しさん (ワッチョイ 9fda-W5e4)
垢版 |
2019/03/05(火) 06:34:30.57ID:C3u1nlxm0
typedef struct {
unsigned8 b7 :1; /* bit7 */
unsigned8 b6 :1; /* bit6 */
unsigned8 b5 :1; /* bit5 */
unsigned8 b4 :1; /* bit4 */
unsigned8 b3 :1; /* bit3 */
unsigned8 b2 :1; /* bit2 */
unsigned8 b1 :1; /* bit1 */
unsigned8 b0 :1; /* bit0 */
} BYTE_FIELD;
0526デフォルトの名無しさん (アウアウウー Sa9b-mjQG)
垢版 |
2019/03/05(火) 09:35:09.67ID:XZEd/J30a
>>521
謎だな。
ブールの配列ならint bool やら char boolやらした時点で確保されるメモリをそのまま使って、and or xorあたりでビット操作してshiftで走査したらいいじゃん、ってのが爺の言い分。
どのビットを何に使ってるかってのはコメントに書いておいたり仕様書に書いといたりカンペ回したり。

メモリ確保もロードも最小単位があるんだから、単独1ビットのブール変数ってのは無理だろ。
あ、組込み用のマイコンは知らないけど。
0527デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 12:23:27.77ID:TQUHbSsoa
>>525
君がマウントを取りたいだけのサルということが良くわかった。
ま、頑張れ。
0529デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 12:58:00.63ID:TQUHbSsoa
>>528
マウントご苦労様です。
0531デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 14:27:58.97ID:TQUHbSsoa
>>530
いつもマウントありがとうございます。
0534デフォルトの名無しさん (ワッチョイ b702-IBRN)
垢版 |
2019/03/05(火) 18:58:34.77ID:6hPuHs1J0
intが64ビットの環境で32ビットの変数を扱いたいので、
とりあえず(私の環境で) typedef long INT32;とか定義してるんですが、
longを使うのが普通でしょうか?
環境によって違うらしいとは知っているのですが、
typedefに出来るだけ無難な型を使っときたいという意図です。
0536デフォルトの名無しさん (アークセー Sx0b-WeXs)
垢版 |
2019/03/05(火) 19:08:28.28ID:JrR+GNVhx
レジスタに入れずに直接メモリ上のビット操作はないよ。
そりゃやろうと思えばメモリセルの制御単位を1ビットにしてデータバスを1ビット、アドレスバスのアドレス単位も1ビットにでもすれば1バスサイクルでのビットアクセスができるだろうけど、あまりにも非効率なのでやらないだろう。
そんな汎用CPUはどこにもないと断言しても良いレベル。
0541デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/05(火) 19:25:55.02ID:Q+OO1XNi0
>>538 コンパイラ付属のヘッダファイルも存在しないのかな。
その場合は、コンパイラの取説でも見て、32bitになる整数を選んで
typedef すれば良いかと。

どのみち移植する際には、その辺も含めて丸ごと再検討ってことになるだろうし。
0545デフォルトの名無しさん (アウアウクー MM0b-tQZn)
垢版 |
2019/03/05(火) 20:17:27.37ID:EdVc4MwEM
int型が64ビットの環境で、longという型が32ビットなのは引っかけだな。

あとで見た他人に恨まれるぞ。
0546デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 20:37:31.74ID:TQUHbSsoa
>>537
話の流れとしてそこはビット単位の話ではなくなっている。
0549デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 20:50:49.79ID:TQUHbSsoa
>>548
昼夜を問わず沢山のマウントありがとうございます。
0551デフォルトの名無しさん (ワッチョイ 9f01-dMaL)
垢版 |
2019/03/05(火) 22:33:03.94ID:QKmISP/B0
>>536
すげー昔の話だがメモリー側で論理演算できるようにして1アクセスでビット単位操作を可能にした特許があったな
元々はグラフィック用で図形の重なりの演算をメモリー側でやるようにしたものだったけど
特開昭61-264453
0552デフォルトの名無しさん (ワッチョイ 9fab-IBRN)
垢版 |
2019/03/05(火) 22:51:02.28ID:U66Q7+Ir0
>>551
前世紀の話だが液晶モニタ側にメモリ機能を有して
PCの電源落としても液晶モニタ側に必要な情報が画像として記録されてるから
再起動後すぐにデータを使えるようになる、なんてニュースが真面目に流れてたっけ
0556デフォルトの名無しさん (アークセー Sx0b-WeXs)
垢版 |
2019/03/06(水) 08:08:34.10ID:CUnnY/wEx
そういえばGRAM用にそういうRAMが何種類かあったね。
OpenGLとかで全画面書き換えが当たり前の今では役に立ちそうにないけど。
C言語とは関係ない話題ですまんかった。
0559デフォルトの名無しさん (ワッチョイ 5768-IBRN)
垢版 |
2019/03/06(水) 17:11:17.09ID:5bfpZyLy0
Cはコンパイラにより
型の変数の容量どころかポインターすら変わる
きれいに書くことなどできん!

Cの恐ろしいことは、標準っぽい関数が
リソース開放の事を考えてなかったりする所w
0562デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/06(水) 18:17:51.07ID:t0mzyE2R0
>>559
標準っぽい関数とはなんですか?
0563 ◆QZaw55cn4c (ワッチョイ bfe9-IBRN)
垢版 |
2019/03/06(水) 18:30:39.79ID:pvc8mHD30
>>559
>Cの恐ろしいことは、標準っぽい関数がリソース開放の事を考えてなかったりする所w

それはどの標準関数ですか?具体的に指摘できますか?
0568 ◆QZaw55cn4c (ワッチョイ bfe9-IBRN)
垢版 |
2019/03/06(水) 18:45:49.69ID:pvc8mHD30
>>564
いえいえ、標準っぽい、というのだから、標準関数に近いという主観的判断があるのでしょう
それはそれで私は純粋に好奇心が湧いたのです
0572デフォルトの名無しさん (ワッチョイ ff8f-x13U)
垢版 |
2019/03/06(水) 22:53:39.41ID:s+f1BYLZ0
標準的な関数で痛い目にあったといえばlocaltime()
コイツがスレッドセーフじゃないせいでひどい目にあったよ……
まあ返り値がポインタな時点で疑うべきだったが。
0575デフォルトの名無しさん (アウアウウー Sac3-8zRT)
垢版 |
2019/03/07(木) 18:27:15.02ID:LVW4xgZwa
超*2 初心者です。
#include<studio.h>
int main(void){
int a,b;
b=3*a+4;
a=2*b+3;
printf("a=%d\n",a);
printf("b=%d",b);
return 0;
}
とプログラムして、
a=-2
b=-2
という出力を期待したんですが、
a=3
b=0
と出力されてしまいました。
何が間違っているのでしょうか??
長文スマソ
0579はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1e3e-/kwh)
垢版 |
2019/03/07(木) 18:40:34.01ID:fFrTWbSf0
>>575-576
まずプログラムとして完全に間違っているのは、
b=3*a+4; の評価時点で a は初期化されていない。
初期化されていない自動変数の中身は未規定で、
何が入っているかわからない。

そして第二の間違いとして、
C は二次方程式を解いたりしない。
b=3*a+4; は a の中身に 3 を書けて 4 を足すという処理をしたものを b に入れ
その次に a=2*b+3; の処理、すなわち b に 2 を書けて 3 を足したものを a に入れる。
そんだけ。
これはもう、質問以前の話で、完全に C のごくごく初歩をわかってないので、
普通に入門書を最初から読んで。
0598デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/08(金) 09:39:25.02ID:pv8HlopZa
代入を =: にしている言語あるな。
0599デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/08(金) 09:50:55.62ID:dZ4sYt+j0
>>598
:=
0600デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/08(金) 09:51:39.55ID:dZ4sYt+j0
数学用語を使うやつは馬鹿っぽい
0601デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/08(金) 10:43:26.56ID:pv8HlopZa
>>599
あ、そうだったか。すまん。
0606デフォルトの名無しさん (アークセー Sxc7-BB1s)
垢版 |
2019/03/08(金) 16:00:54.92ID:iK4gPhWEx
はるかの昔からそういったGUIプログラミングツールやCASEツールがあったけど、どれも決定版にはなってないよね。
唯一、車業界でMatlab+Simulinkと自動コードが標準的に使われてるけど、あれはモデル化して徹底的にシミュレーションする目的がメインなのでちょっと汎用的には使いにくい。
実際吐き出されたコードはロジックに問題はなくてもソフト技術者から見ると目も当てられないぐらい悲惨なコードだし。
0623デフォルトの名無しさん (ワッチョイ 1f02-O5uf)
垢版 |
2019/03/09(土) 10:05:30.78ID:UpidnITW0
返り値がポインタの関数って
int *func() {...}
↑みたいに関数名にアスタリスクが付いてるのが違和感あるんだけど何か理由あるの?
意味を考えればint* func()もしくはint * func()にするべきなんじゃないのかな
0624デフォルトの名無しさん (ワッチョイ 168f-P8NU)
垢版 |
2019/03/09(土) 10:44:22.53ID:1jBEzlrN0
複数のポインタ変数を宣言するとき

int *a, *b →OK
int* a, b  →NG

ということがあるので前者の記述にする。
関数についてもそれに揃えてるだけ。

だと思ってるんだが違うかもしれん。
0626デフォルトの名無しさん (ワッチョイ df01-BB1s)
垢版 |
2019/03/09(土) 10:57:28.35ID:MFivwnzo0
昔、*をどこに付けるべきか議論あったね。
「int *」も型なのでスペース空けるのはおかしい、「int*」と書くべきだと主張してる人も結構いて、今もまれによく見かける。
統一してれば良いんじゃね?
0627デフォルトの名無しさん (ワッチョイ de8c-OG2p)
垢版 |
2019/03/09(土) 11:42:25.92ID:TwFYMaY40
>>624
int *a, *b は *aと書くと整数。
0629デフォルトの名無しさん (アウアウクー MM07-LDqw)
垢版 |
2019/03/09(土) 12:13:21.98ID:MaTZH59sM
>>623
それC言語の初期はそっちの方が普通だったんたよ。
0643 ◆QZaw55cn4c (ワッチョイ 1ee9-ouaW)
垢版 |
2019/03/09(土) 14:36:13.79ID:Hu0eNkce0
変数宣言のときと式の評価のときとでは、働きが間逆になる、ときいていますが、私も馬鹿になったので、そういわれていることをそう理解できなくなりました…
0644デフォルトの名無しさん (ワッチョイ 975f-YS+u)
垢版 |
2019/03/09(土) 14:39:16.30ID:Q2jRdDZx0
宣言は演算子とは別じゃなかったっけ?
typedefもできるし規格はpointer typeって書いてるからポインタ型って認識も間違いじゃないと思ってたけど違うんかな
確かに一行での複数宣言だと確かにおかしなことにはなるけども
0647はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1e3e-/kwh)
垢版 |
2019/03/09(土) 15:12:58.76ID:2TgeLAXH0
>>640
意味的には int* は型。
でも文法的には * は変数名と優先的に結合するので、
変なことになってんだよ……。

C++ だと設計者 (stroustrup) が * を型名に寄せる書き方をしてるので、
近頃はそれが C にも流入してる感じ。
0654デフォルトの名無しさん (ワッチョイ ffda-h293)
垢版 |
2019/03/09(土) 18:24:28.10ID:0bE0zR0l0
int* 型はない。型と見なしたら混乱する、俺は。
int *p;は、記号表現としての*pという表現がintという意味。*pで1つのint変数。
だから当然sizeof(int)のメモリも確保される。
int*が型ならアドレス変数のサイズだけ確保され、intオブジェクト分のメモリは確保されないはず。

int a b c *d;などと、まとめて書けるように作ってある
ここで、
*のない変数はアドレスを参照するために&が必要
*がある変数は*を外すだけでいい

&がメモリ上のオブジェクト(変数とか関数)のアドレスを参照するのに対して、アドレスからオブジェクトにアクセスするから*は逆参照演算子と呼ばれる。単項演算子。
0655デフォルトの名無しさん (ワッチョイ df01-BB1s)
垢版 |
2019/03/09(土) 18:41:30.67ID:MFivwnzo0
>>654
いやいや、何を勘違いしてるのか知らないけどint *p;はポインタサイズのみ確保されるんだけど。
結果intとアドレスサイズが一致するとしてもsizeof(int)と同一視すべきではないんでは?
0658デフォルトの名無しさん (ワッチョイ b252-1CkI)
垢版 |
2019/03/09(土) 19:01:45.35ID:ems+thyE0
>>654
お前が混乱しようがint*は型だ。
キャストもtypedefもsizeofもできる。
お前のオレオレ定義はどうでもいいから、標準的な用語で会話できないならいちいち書き込まないでくれ。初心者の理解を妨げる害悪でしかない。
0660デフォルトの名無しさん (アウアウウー Sac3-sJVA)
垢版 |
2019/03/09(土) 19:36:12.32ID:YyCiAm6Za
結合順って左右どっちからかという話だろ?
うまいこと、左に型で右に変数という形では宣言できないという点には関わってくるね。
Cではtypedefでそれがカバーできるので使えばいい。
単にstructの省略のためとかだと微妙だけど。
0663デフォルトの名無しさん (ワッチョイ 975f-YS+u)
垢版 |
2019/03/10(日) 00:16:25.33ID:Yjkm2NzZ0
規約とかで決まってなきゃ思想の問題だし良いんじゃない?
Cでは意味論的には(ポインタ型って書いてあるし)int* pが近くて統語論的には(複数宣言で違和感がないから)int *pが近いっていうイメージ
規格内の例はint *p記法で統一されてるからこっちがCではスタンダードっぽいけど
0664デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/10(日) 00:24:31.01ID:nrbpjhIZ0
>>662
ポインタでポインタが指している先頭アドレスから始まる領域をint型として扱うだから、*intにすべきだった。
0666デフォルトの名無しさん (ワッチョイ 6301-V4pZ)
垢版 |
2019/03/10(日) 01:38:42.67ID:/HGKNCBK0
副業解禁で激変する若者世代とマネージャー世代のキャリア観
http://www.businessinsider.jp/post-107782
フリーランスの職種20個の仕事内容と平均年収をわかりやすく解説
http://www.proof0309.com/entry/shokushu
時給1万円のバイトも。会社員向きのプチ副業を、“バイト芸人”が教える
http://headlines.yahoo.co.jp/article?a=20190226-00127948-bizspa-bus_all
副業が「会社にバレる人」と「バレない人」の大差
http://headlines.yahoo.co.jp/article?a=20190303-00268007-toyo-bus_all
正社員の10%以上が副業 中には過重労働で体調崩す人も
http://headlines.yahoo.co.jp/hl?a=20190227-00010000-wordleaf-bus_all
「副業で年2000万円稼ぐ男」に学ぶキャリア戦略
http://headlines.yahoo.co.jp/article?a=20190221-00266856-toyo-bus_all
加速する「副業社会」正社員の4割が「副業したい」 気になる収入はどれくらい?
http://headlines.yahoo.co.jp/hl?a=20190218-00010001-danro-life
おすすめ副業22選を現役フリーランスが解説【在宅も可能】
http://www.proof0309.com/entry/zaitaku-hukugyou
会社を辞めてフリーランスで働きたいあなたが知っておくべき10のこと
http://www.businessinsider.jp/post-165731
フリーランスと会社員、働き方の根本的な差 広がる「雇用されない働き方」の課題とは何か
http://toyokeizai.net/articles/-/263055
フリーランス人口は増える!今後は仕事もプロジェクト単位になる!?
http://freelance.mts-career.com/population/
どのくらい稼げるの?フリーランスエンジニアの単価・報酬・年収の話
http://findy-code.io/engineer-lab/engineer-unitprice-income
0673デフォルトの名無しさん (ワッチョイ de02-dgqw)
垢版 |
2019/03/10(日) 10:42:33.14ID:IMQ2P2X20
>>662
そういうのは typedef で型名作ってしまうしかないな。
0677デフォルトの名無しさん (アウアウウー Sac3-h293)
垢版 |
2019/03/10(日) 15:42:39.03ID:cKTKsaa/a
int* が型って言うのはどこに書いてありますか?
K&C2版とc99の仕様書見てきたけど、どうしても見つけられないのです。
どこで調べるとint*型や例えばchar*型等の記述を見る事が出来るのでしょうか。
0681デフォルトの名無しさん (ワッチョイ 92a5-tU8h)
垢版 |
2019/03/10(日) 16:10:47.95ID:YmhkZ0UL0
全ての型に付けることが出来て
あたかもメソッド++があるかのように振る舞うオブジェクトの様なものだから混乱する
&や*もやはり何かのメソッドの演算子での表現と見做すと理解が捗る

つまりポインタまわりだけ大勢の予想に反してオブジェクト指向になってるから混乱する
0682はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1e3e-/kwh)
垢版 |
2019/03/10(日) 16:20:50.08ID:PkJpScAa0
>>677
C99 で 6.7.6 の項目名がそのまま "Type names" やし、
索引もあるし、さらに言えばちょっと前 (>>672) に私が書いてもいるのに、
どこまで節穴なんや……。

型指定子 int と抽象宣言子の * を合わせてひとつの型名ということになる。
0683デフォルトの名無しさん (ワッチョイ ffda-h293)
垢版 |
2019/03/10(日) 16:36:29.29ID:TrIHnbmn0
>>678
c99 6.7.2
void char short int long float double signed unsigned _Bool _Complex _Imaginary
構造体共用体指定子 列挙型指定子 型定義名

>>679 >>680の言うように、ポインタ型はあります。仕様書を見ても、int* でもfloat*でもいいんですけど、それぞれint型へのポインタ型とかfloatへのポインタ型といった説明しか読み取れませんでした。読解力不足でしょうか。

私はint型を指すポインタ、floatを指すポインタなどと言うように、例えば
int* pであれば、ポインタ型pがあり、それはint型を指す
、と言うように独立した物だと理解していました。
どうしてもint*型と言うのがわかりません。
0686デフォルトの名無しさん (アウアウクー MM07-LDqw)
垢版 |
2019/03/10(日) 16:55:14.74ID:FM+9nmuqM
C言語を作ったときにあとから型指定のポインタ変数を付け加えたんだろうな。
0690デフォルトの名無しさん (スフッ Sd32-YS+u)
垢版 |
2019/03/10(日) 18:16:33.04ID:+JKmV4RCd
ポインタ型は派生型(deprived types)の一種で、派生型は他に配列型とか構造体型とかがある(6.2.5.20)
例えば、struct MyStructure {int num;};とかやったとして、struct MyStructureは規格に書いてないから型じゃないって言ってる状況に近いように見えるんだけども
0692KAC (ブーイモ MM63-NE3V)
垢版 |
2019/03/10(日) 18:38:03.60ID:gHkTxZDuM
>>691
「全ての*が演算子である」
という主張は間違えている。

ということは理解できてる?
0696デフォルトの名無しさん (ワッチョイ af14-uGU8)
垢版 |
2019/03/10(日) 19:26:26.65ID:8+bEWcYF0
宣言の中の*は演算子ではない
宣言子の構成要素の中のポインタに含まれる記号だ

演算子の*はポインタを実体にする作用を持つが
宣言の中の*は客体をポインタにする作用を持つ
おおむね逆の作用となっている
0697デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/10(日) 19:31:42.70ID:nrbpjhIZ0
>>687
ポインタが指しているところの型を明示しようとしたのは明らかにあとだよね。
0698デフォルトの名無しさん (スフッ Sd32-YS+u)
垢版 |
2019/03/10(日) 19:31:58.93ID:+JKmV4RCd
そういえば*のオペランドがオブジェクト指してなかったら未定義動作なんだよな
宣言の*が演算子だったらint *p;だけで未定義動作踏んでそう
0700sage (ワッチョイ d602-2aZh)
垢版 |
2019/03/10(日) 21:54:15.58ID:KIApJaj50
C++か
0701デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/10(日) 23:04:24.35ID:nrbpjhIZ0
>>699
代入という言い方をしている時点でわかってないと思うよ。意味が逆になっている。

変数ではなく定数だったら、わからなくもない。

右辺、左辺という言い方も嫌い。
0704デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/11(月) 00:23:08.11ID:QsQqulf80
英語はsubstituteで意味が広いのに、日本語だとすべて「代入」に翻訳してしまったのか。
0705デフォルトの名無しさん (アウアウウー Sac3-h293)
垢版 |
2019/03/11(月) 07:09:33.28ID:7fkCOxJ/a
>>684
型指定子の並び

>>685
それは元からint*型がある、と言うよりもint* p;だったらint*と言う型名になるって話ですよね。

>>690
型じゃない、ではなくて、int*型と言う型はintに*をつけないとありませんよね?typedefを使わなくても作れますけど、int*型というのは元からはありませんよね?自分で作った型名なのにc言語にint*型がある、と言うのは変だと思いませんか?
0706デフォルトの名無しさん (ワッチョイ af14-uGU8)
垢版 |
2019/03/11(月) 07:19:12.62ID:rOT48PNA0
>>705
X 3010:2003 (ISO/IEC 9899:1999)
6.2.5 型
型char,符号付き整数型,符号無し整数型及び浮動小数点型を総称して基本型(basic type)と呼ぶ。

派生型(derived type)は,オブジェクト型,関数型及び不完全型から幾つでも構成することができる。
派生型の種類は,次のとおりとする。
− 配列型
− 構造体型
− 共用体型
− 関数型
− ポインタ型
派生型を構成するこれらの方法は,再帰的に適用できる。
0707デフォルトの名無しさん (アウアウウー Sac3-h293)
垢版 |
2019/03/11(月) 07:32:55.06ID:7fkCOxJ/a
>>706
派生型を構成できる、と言うことは、int*はコード書く人が自分でint*と言う派生型を構成したんですよね?
構成できることを以ってC言語にint*型がある、定義されていると言うのは変だと思いませんか?
0708デフォルトの名無しさん (ワッチョイ 1f7b-1R1m)
垢版 |
2019/03/11(月) 07:43:53.40ID:+tgFX8Zg0
とりあえず、今のところ(>>623 以降)議論になってるのは
「int* は型か、型ではない(int型に*を作用させた何か)か」
「ポインタ変数を宣言する際の * は演算子か演算子ではない何かか」
→ 「変数宣言の * が演算子でないなら何と呼ぶのか」
…あたりかな。

個人的には >>699 の「int a = 3; の = は代入演算子か違うものか」も
ちょいと気になる。
変数定義と代入 int a; a = 3; の省略表記に過ぎないのか、
char s[4] = "yes"; みたいな初期化時の特例になるのか。
0709デフォルトの名無しさん (アークセー Sxc7-BB1s)
垢版 |
2019/03/11(月) 07:54:01.38ID:QaoEDFOQx
変かどうかの主観的な問題ではなく「派生型を定義できる」と決まってるなら、客観的に派生型もやっぱり型だろ。
それを変だと思うならここではなく然るべきワーキンググループに意見すべき。
0710デフォルトの名無しさん (スフッ Sd32-YS+u)
垢版 |
2019/03/11(月) 07:54:59.22ID:yg4bOGVFd
>>706
それを言い出すと派生型は全部その類に含まれる(そもそも構造体型へのポインタ型とか言い出すと規格に書ける訳もないし)
元々int *って型は存在しないって言い出した流れ(たぶん>>640)はint *も型だって話(>>626)の中にしかなかったと思うからそもそも話がだいぶズレたんだろうな
今の流れはざっと見返した限り>>708がまとめてくれた通りだと思う
0712デフォルトの名無しさん (アウアウウー Sac3-h293)
垢版 |
2019/03/11(月) 08:13:44.57ID:7fkCOxJ/a
>>708

>個人的には>>699 の「int a = 3; の = は代入演算子か違うものか」

宣言での=は、初期化宣言子内の区切り子

>「int* は型か、型ではない(int型に*を作用させた何か)か」
>「ポインタ変数を宣言する際の * は演算子か演算子ではない何かか」
>「変数宣言の * が演算子でないなら何と呼ぶのか」

宣言での*は演算子ではなく、ポインタ宣言子の区切り子

6.7.5.1
ポインタ宣言子 
意味規則
宣言
T D1
において,D1 が形式
                * 型修飾子並びopt D
をもつ場合,次のとおりとする。
宣言
T D の ident
に対して指定される型が Tの派生宣言子型並び
であれば, T D1の ident に対して指定される型は
Tへの型修飾子並びをもつポインタの派生宣言子型並びとする。
0713デフォルトの名無しさん (ワッチョイ b252-1CkI)
垢版 |
2019/03/11(月) 08:13:54.01ID:U6Vr66LT0
>>707
お前さんが型と呼びたいものはC言語では基本型であって、C言語における型の一部でしかない。
>>707が挙げてくれている通り、基本型と、再帰的に定義される派生型を合わせてすべて型と見なされる。
この定義によって、どんな型をどんな順序で組み合わせようと、ポインタが何段あろうと、どんな名前をつけられようと、定義に再帰的に合致させられるそれらすべてを型と見なせるとあらかじめ定義されている。
0716708 (ワッチョイ 1f7b-1R1m)
垢版 |
2019/03/11(月) 08:59:57.45ID:+tgFX8Zg0
>>712
「初期化宣言子内の区切り子」っていう言葉がヒントになった。ありがとう。
n1570.pdf (>>1 のリンク参照) 6.7.9 に載ってるね。
英語だから、すらすら読めるわけじゃないけど。

スカラの算術型に関しては「{} で囲んだ初期値を入れられる」
(構造体の初期化と同じ書き方ができる)ってのが代入演算子と違うところかな。
int a = {3}; // 「定義と同時の初期化」では許される
int b;
b = {4}; // エラー: 通常の代入演算子では値を {} で囲めない

だからどうした、って話かも知れないけど、
動作の違いが確かに存在するってのは気分的にすっきりするわ。
0717デフォルトの名無しさん (アウアウウー Sac3-h293)
垢版 |
2019/03/11(月) 09:18:31.95ID:7fkCOxJ/a
>>715
ごめんなさい、int*は型指定子かどうかと言うべきでした。

int*a;
aはなにか、と聞かれるとintへのポインタと答えます。

aの型はなにか、と聞かれるとint*型と答えます。

宣言でのint*の文字の並びは型か、と聞かれると宣言でのint*と言う文字の並びは型指定子intと、ポインタ宣言子の並びであって、結果int*型となるがint*型の指定子ではない、と答えます。
0718デフォルトの名無しさん (アウアウウー Sac3-h293)
垢版 |
2019/03/11(月) 09:28:25.09ID:7fkCOxJ/a
みなさんごめんなさい、私が型指定子とはっきり言わなかったせいで混乱を招いてしまいました。

あ、その前に、
int*p;
のint*は型指定子じゃありませんよね?私の理解合っていますか?
0721デフォルトの名無しさん (ワッチョイ af14-uGU8)
垢版 |
2019/03/11(月) 10:50:24.51ID:rOT48PNA0
>>707
713も言っているように、おまえさん用語の意味を誤解してるんだよ
型は基本型の他に派生型も含まれる用語だ

それから定義の意味もおまえさんおかしいぞ
定義は宣言のうち重複できないものをいう
キーワードは定義できない
0722デフォルトの名無しさん (アウアウウー Sac3-h293)
垢版 |
2019/03/11(月) 13:08:41.49ID:7fkCOxJ/a
>>721
はい、気をつけます。

>>719
>>1のc99 6.7の構文規則でいうと
宣言:
宣言指定子列    初期化宣言子並び opt;
宣言指定子列:
記憶域クラス指定子    宣言指定子列 opt
型指定子    宣言指定子列 opt
型修飾子    宣言指定子列 opt
関数指定子    宣言指定子列 opt
初期化宣言子並び:
初期化宣言子
初期化宣言子並び    ,    初期化宣言子
初期化宣言子:
宣言子
宣言子    =    初期化子

ですから、
int *a,b,c,*d;
という書き方は
宣言指定子列と初期化宣言子並びなのですけど
int*が型指定子だとすると、
宣言指定子列の型指定子がint*、
以降の a,b,c,*d;は初期化宣言子ですから、a,b,c,*dのどれもがint*型になると思うのです。

int*は型指定子ではないから
aはint*,bはint,cはint,dはint*になりますよね。

型指定子かどうかは重要じゃありませんか?
0724デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 14:43:07.78ID:3xf7Y18W0
for文とif文を使って整数nを入力して、2つの1以上10以下の整数x,y(x>=y)の自乗の和がn(n=x^2+y^2)になるx,yとなる組み合わせを求める(n=45のときx=6,y=3みたいな )C言語のプログラムを作りたいんですが、関数って使いますか?
0726デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 15:08:06.95ID:M/w6PjEFa
宿題は宿題スレがあるのでそちらへ
0727デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 15:29:14.81ID:3xf7Y18W0
>>725
分かりました、ありがとうございます。
>>726
どのスレのことか分からないのでそのスレの名前を教えて頂けるとありがたいです。
0729デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 15:50:57.05ID:3xf7Y18W0
>>728
検索した上で分からなかったので聞いています
0733デフォルトの名無しさん (ワッチョイ 1f7b-1R1m)
垢版 |
2019/03/12(火) 17:32:47.14ID:1t7NN+JI0
「宿題」はこの辺かのう。
設立も古いし、何ヶ月も投稿ないから沈んでるのかな。
通常のインターフェースで一覧を見ないんで正確には分からんが。

C/C++の宿題片付けます 170代目
http://mevius.2ch.net/test/read.cgi/tech/1456911928/

C/C++の宿題片付けます 170代目
http://mevius.2ch.net/test/read.cgi/tech/1456647534/


こんなの↓も見つけたけど、これは「宿題」では見つからないタイトルだね。
【C】至急課題のプログラム教えて【アマギフ】
http://mevius.2ch.net/test/read.cgi/tech/1551308087/
0734デフォルトの名無しさん (ワッチョイ eb9d-uGU8)
垢版 |
2019/03/12(火) 17:44:27.56ID:f4lS/kh70
>>724
その目的を直接的に達成する標準関数はない
自乗を求める標準関数ならpowというのがあるが
整数を前提とするその問題には適さない
処理の一部を、おまえさんが関数にする可能性ならある

おまえさん、プログラムを作ってくれなんて言ってないよな
変な妄想してるバカは無視していいぞ
0736デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 18:17:50.08ID:M/w6PjEFa
>>729
何でわからないんだよ。どういう環境で使ってるんだ?
0737デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:18:02.86ID:3xf7Y18W0
明日テストでその過去問にこのような問題が出て、関数が必要なら諦めようかなと思って質問しました。
スレチだったならすみません。答えてくださってありがとうございました。
0738デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:21:35.85ID:3xf7Y18W0
>>736
スマホで専ブラ使ってます。予測はつきましたが、過疎っていたのでそのスレで合っているのか疑心暗鬼でした。今はどのスレのことか分かっています。
0741デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:41:24.28ID:3xf7Y18W0
>>739
ありがとうございます!このような問題です。

for文とif文を使って整数nを入力して、2つの1以上10以下の整数x,y(x>=y)の自乗の和がn(n=x^2+y^2)になるx,yとなる組み合わせを求める(実行例:n=45のときx=6,y=3)C言語のプログラムを作成せよ。そのような組み合わせがない時は、nothingと表示せよ。
0744デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:53:51.90ID:3xf7Y18W0
>>742
答えのプログラムが欲しいです。
0750デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 20:55:37.42ID:M/w6PjEFa
いいんじゃないの?恐らく数学的になんとかしようとするとコンピュータ使わずに解が出て終わってしまうだろうし。
0752デフォルトの名無しさん (ササクッテロ Spc7-OS7W)
垢版 |
2019/03/12(火) 21:37:28.98ID:foIxPF9Op
もう取り繕う理由ないからタメ語で話すけど
簡単な問題に関してめっちゃレスしてしまってすまんな
明日のテスト頑張ってくるわ
説明してくれた人皆ありがとノシ
0756デフォルトの名無しさん (ワッチョイ a701-GQ8d)
垢版 |
2019/03/13(水) 21:09:52.65ID:STGkCaiX0
課題を出されましたが、全くわかりません
このプログラムを作っていただけませんか?
スレ違いなら誘導をお願い致します


@キーボードから任意の文字を入力します。
A先頭が数値の場合
 ・入力を数値に変換して、メモリーに格納します。
 ・格納されている全ての数値を降順(大きい方が先頭)に並び替えます。
B先頭が数値でなければ、現在入力されている数値を並び順の逆順で全て表示する。

尚、数値は100個以上格納できるものとします。
0758デフォルトの名無しさん (ワッチョイ a37b-47Me)
垢版 |
2019/03/14(木) 06:00:16.00ID:SGfhnH0M0
>>756 宿題スレッドへのリンクは >>733 な。今のところまだ有効。

携帯端末(小さい画面)のせいか、スレッドを遡って読むのが難しい人の
質問が増えたようだけど、そういう閲覧環境だと、質問に対する回答の
ソースリストを読むのも一苦労な気がするなぁ。
0761デフォルトの名無しさん (アウアウエー Sadf-kdx8)
垢版 |
2019/03/17(日) 00:34:59.62ID:dzL2D1Cha
Cはじめましたよろしくです。これみてやってください

FILE *fp;
char *p;
char fname[100];
char str[500];

gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp);

while(p != NULL){
printf("%s", str);
p = fgets(str, 500, fp);
 }
 
とやって難なくファイル表示してくれましたが、これpはしょれんじゃね?と思ってこうしてみましたの

gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp);      とりあえず放置

while(str != NULL){       p→strに書き換え
printf("%s", str);
//p = fgets(str, 500, fp);   コメ停止
    fgets(str, 500, fp);      こうしてみた
 }

すると
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・っと無限に続いて
0764デフォルトの名無しさん (アウアウエー Sadf-kdx8)
垢版 |
2019/03/17(日) 00:43:34.56ID:dzL2D1Cha
>>763
もすこしだけおしえてください
fgetがfpに指定したというか登録したファイルから指定数読み込んで、それをpに渡して…
このときに文字終端ならpにNULLも渡ってそれでwhileの条件に合致して止まると思いまして ←ここまであってますか?

なら、pに渡さんでもfgetsが読みに行ったときにもう読む行ないならNULLも引っさげて帰ってくるからstrにNULLがはいってて
じゃーああいうふうに掛けばpいらねんじゃね?と思ったんですがなぜこれだとNULLはいってないんでしょ
0766はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
垢版 |
2019/03/17(日) 00:50:56.68ID:aA4z/LNt0
>>764
str が「どこにあるか」と「何が入っているか」は別物。
NULL と比較するのは「どこにあるか」であって、中身とは関係ない。
何度ループしても str の場所は同じなんだよ。
0770デフォルトの名無しさん (ワッチョイ 035f-QpYv)
垢版 |
2019/03/17(日) 01:47:18.69ID:rgOA/kAB0
>>764
fgets()は成功したら配列の場所を返す(つまりp == str)けど
失敗した場合はNULLを返す(つまりp == NULL)

ここで問題なのは他の人が言ってる通り「引数にとった配列の場所は変わってない」こと

char str[500];
っていうのは(今回はファイルから文字を読み込むために)char型のデータ領域を500個確保するってことで、
わざわざ取った場所を変更したり勝手に消したりはしない

対してNULLはまぁ何もない場所のアドレスって考えでとりあえずはいいと思う
だから、strの領域の(内容は変わってるかもしれないけど)場所はfgets()の結果がNULLでも確保してあるだけだから変わらない

最初の(動いた方の)プログラムで、fgets()した後に
printf("p=%p, str=%p\n", p, str);
とかやってアドレス表示させて途中と最後比べてみたら感覚的に分かるかも
0774はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
垢版 |
2019/03/17(日) 15:32:50.89ID:aA4z/LNt0
暗黙の型変換で配列がポインタになるってのが諸悪の根源なんだよな。
まあそれでだいぶん書くのが楽という面もあるんだけど、
この手の思い違いが連発するのはやっぱりどこか良くない設計だったのかもなと
思わないでもない。
0779デフォルトの名無しさん (ワッチョイ ffda-B/CD)
垢版 |
2019/03/17(日) 17:12:17.93ID:/bg4Vz3i0
>>778
配列Array[]の型はint[]型であるけど、配列名Arrayの型はint*型(値は&Array[0])
関数Func()の型はvoid(*)(void)ではあるけど、関数名Funcの型はvoid*型
暗黙の型変換など関係なくポインタに代入出来る
0787はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
垢版 |
2019/03/18(月) 01:00:19.91ID:YfgH0B4l0
>>786
繰返しになるけど、暗黙の型変換で書くのが楽になってるのは承知してるんだってば。
ただ、初心者が (時にはベテランでも) 変な理解をしがちな理由はこれだろうな
っていう意味での根源は暗黙の型変換にあるっしょ。
0788デフォルトの名無しさん (アウアウエー Sadf-kdx8)
垢版 |
2019/03/18(月) 04:00:43.39ID:P9Yklj5Ga
おじゃまします
printf("[%s][%d][%p]\n", str, str, &str);

こう表示させたとき%sと%pに出る値は意味わかるのですが(文字列とアドレス)
はわかるのですが%dに出る数字の羅列はなにになるんですか
0789はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
垢版 |
2019/03/18(月) 04:05:51.06ID:YfgH0B4l0
>>788
str は char の配列ということでいい?
だとするとアドレス。

str が配列であれば str と &str はアドレス値として見れば同じになるはず。
型は違うけど。
(整数への変換で何が起こるかは言語仕様でははっきりした規定は無い
ので、表現が変わってしまうことな無いとは言えない。)
0795デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/18(月) 14:12:42.17ID:1gtRswz3a
ポインタに対してprintf()で%d指定した時ってアドレスがちゃんと出るって保証されてたっけ?
0801はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
垢版 |
2019/03/18(月) 14:57:23.82ID:YfgH0B4l0
>>795
保証されていない。
というより、値がアドレスには違いないのだけど
その表現がどうなっているか未定義なので、
意味のある値なのかどうかはわからない。
(常識的にはデタラメな値ということもないだろうけど……)

整数とポインタの関係について確実に保証されているのは、
ポインタをポインタのサイズより大きい整数型に入れたなら、
元の型にキャストしなおすと変換前と等しいってことくらい。
0807デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
垢版 |
2019/03/18(月) 17:09:05.92ID:yKiI4G/I0
>>801
未定義じゃねえ処理系定義だ
未定義に該当するためには何らかの禁止を破らねばならない
禁止を破っていないのに決まっていない事項は未規定
未規定のうち文書化されるのが処理系定義だ

先輩方が変な言葉遣いをするから
若いのが勘違いするんだよ
気をつけな
0810デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
垢版 |
2019/03/18(月) 21:11:30.38ID:yKiI4G/I0
>>808

> 「処理系が必ず定義しなければならない」
それが処理系定義
たとえば sizeof(int) が返す値だ

> 「純粋に処理系依存なので、規格としては何も触れない」
これは未規定
たとえば printf("%d %d", getchar(), getchar()); の場合の左右の getchar の実行順序だ

わかってないんなら、ちゃんと規格票で確認しとけ
0813デフォルトの名無しさん (ワッチョイ ff33-h1+v)
垢版 |
2019/03/18(月) 23:23:41.88ID:wuyTgyGr0
>>810
規格で「何も」触れられていないのは未定義 (undefined) なのでは?
禁止を破るほか、規格に定めのないところの動作も含まれます。

規格で示される選択肢のうちのどれを処理系が選ぶかが定められておらず
処理系任せ(文書化も不要)なのが未規定 (unspecified) かと。
0816デフォルトの名無しさん (ワッチョイ ff33-h1+v)
垢版 |
2019/03/19(火) 10:26:28.12ID:gyYe55lf0
>>815
http://kikakurui.com/x3/X3010-2003-01.html#9
> この規格の制約以外の箇所で現れる…(し)なければならない又は…(し)てはならないという要求をプログラムが守っていない場合,その動作は未定義とする。
> この規格では,このほかに,用語 未定義の動作を使うことによるか又は動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
> これらの三つの書き方は強調度において何ら変わりはなく,それらはすべて未定義の動作を規定する。
0817デフォルトの名無しさん (ワッチョイ 93d2-mVPS)
垢版 |
2019/03/19(火) 11:35:26.58ID:71/TIYaC0
未定義な動作っていうのはプログラムが未定義な動作をするわけじゃなくて
コンパイラー製作者が決める動作が未定義だから好きなように動作を決めれるってことだぞ
0822デフォルトの名無しさん (スフッ Sd1f-QpYv)
垢版 |
2019/03/19(火) 17:56:13.66ID:CsLrwzwwd
>>815
JIS X 3010:2003 3.4.3
未規定の動作(unspecified behavior) この規格が,二つ以上の可能性を提供し,個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。

C11 3.4.4
未規定動作
不特定の値の使用、あるいは当国際標準が提示する2つかそれ以上の可能性があり、いずれを選ぶかに関してそれ以上の要求を課さないその他の動作。

一応選択肢は与えてるように見えるな
0823デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
垢版 |
2019/03/19(火) 18:02:59.01ID:LKFNCpsT0
「異常なプログラム」、「正しくないプログラム」、「正しくないデータ」

このへんのキーワードが、なぜ「未定義の動作」という用語をわざわざ作っているのかの存在意義だ
他の「処理系定義の動作」や「未規定の動作」と見比べてみな
「未定義」だけ異質な点はただ1つ
0824デフォルトの名無しさん (ドコグロ MM47-jA9u)
垢版 |
2019/03/19(火) 19:53:17.00ID:/V+FXtnWM
>>820
あほか、そこに「正しくないプログラム構成要素」って書いてあるだろ
規格には正しいプログラムの定義は書いてある
書いてないことは全て正しくないプログラムだよ
そもそも全ての未定義を定義できるわけないことぐらいはアホでもわかるだろw
0825デフォルトの名無しさん (ワッチョイ b302-h1+v)
垢版 |
2019/03/19(火) 20:49:49.43ID:M/rPqWkP0
CとC++のことで少しはまったことがあったので質問です。
はまった部分を単純化して例を挙げます。

1.単純化した例
FuncC.c
#include <stdio.h>

void Func(void) { puts("FuncC"); }

FuncCpp.cpp
#include <stdio.h>

void Func(void) { puts("FuncCpp"); }

main.c
void Func(void);

int main(void) { Func(); return 0; }

上記3つのファイルを gcc *.c *.cpp でコンパイルリンクするとFuncC.cのFuncが呼ばれます。
main.cをmain.cppに名前を変更して同じことをするとFuncCpp.cppのFuncが呼ばれます。
clでも試しましたが同じ結果です。

2.はまったこと
拡張子によって呼ばれる関数が違うことに気づかず延々と的外れなことをやっていた。

3.知りたいこと
1の結果がなぜそうなるのかちゃんとは分かっていません。
なぜそうなるのか分かるサイト等あれば教えてもらえませんか?
0826デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/19(火) 20:58:40.16ID:BI7+7Q7/a
>>825
C++ は extern "C" {} のブロック内にC言語書かないと駄目なんじゃなかったっけ?
で、C++って同じ関数名で引数の違う関数作れるよね。だからCと見た目そっくりでも作られるコードが少し違うんじゃないの?
0827デフォルトの名無しさん (ワッチョイ 2301-QTaE)
垢版 |
2019/03/19(火) 21:04:51.38ID:Dro8a+Ew0
Cは関数名がそのままシンボル名になるけど
C++のほうは関数名に引数の型情報が付加されたmanglingされたシンボル名となるので
リンカーでリンケージする際に区別してる
C++ から C 関数を呼ぶには 明示的に extern "C" と宣言されてないとその機構を突破できない


んじゃなかったかな
0829デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/19(火) 21:14:21.98ID:BI7+7Q7/a
おお。多分そうだ。
あとはもっと詳しい人に任せた。
0830 ◆QZaw55cn4c (ワッチョイ 6fe9-h1+v)
垢版 |
2019/03/19(火) 21:17:38.17ID:45LJYysD0
途中で投げてしまった
私がはまったのは、win32api で、 ::RegisterClass() にて登録する WindowProc を extern "C" しなかったために、凄く困った記憶があります
0834デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
垢版 |
2019/03/20(水) 05:59:53.51ID:Jx7dUCON0
>>824
規格では正しくないプログラムをill-formedという
つまり正しくないプログラムも記載されているということだ

別に規格に限ったことではない
あるものが何であって何でないという境界を明確化するのは
ごく当たり前のものの書き方だ
0835デフォルトの名無しさん (ドコグロ MMdf-jA9u)
垢版 |
2019/03/20(水) 06:44:57.57ID:nNN3jHgVM
>>834
> あるものが何であって何でないという境界を明確化するのは
すでに明確だろ?
「正しいプログラムでないプログラム」は「正しくないプログラム」
正しいプログラムの定義は書いてあるから境界はすでに明確だよ
ill-formedとかの名前がどうのこうのは関係ない
0839デフォルトの名無しさん (ワッチョイ a37b-47Me)
垢版 |
2019/03/20(水) 08:12:13.89ID:SCVZEQpp0
「未定義」と「不定」については Phinloda さんの↓も分かりやすいね。
少々古いのが難だけど、内容は今でも正しいと思う。

初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html


ところで、「不定の動作」であるが「未定義ではない」、
しかも「不定であることの影響をユーザが見ることができる」
コードの例って何かあるだろうか。
ちょいと考えてみたけど、不定の影響を見るために何かすると
そのせいで未定義の領域に突入しちゃうんだよ。
0849デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/20(水) 12:48:55.48ID:OxEz5Koua
[翻訳]あなたがプログラミングに向いていない10のサイン - Qiita
https://qiita.com/hareku/items/4bfc48e23e83e0d300f3

1 好奇心の欠如
2 自律性と機知の欠如
3 問題に直面しても粘り強さが無い
4 問題解決に成功した気持ちはない
5 学習と理解に焦る
6 思考に飽きたり疲れたりする
7 自分のことを考えられない
8 堅く、狭く、そして無秩序な考え
9 複数の答えの間の「良い」と「悪い」の連続性に気付かず、「正しい」答えを望んでいる
10 細部に注意を払っていない
0850デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
垢版 |
2019/03/20(水) 15:33:42.99ID:Jx7dUCON0
>>847
何が間違いか、はっきり丁寧に説明してやっても
結局、自らの間違いを認める潔さを絶望的に欠いていて
まったく話にならない痛いやつであることを
ここの連中は目の当たりにしたばかりなんだが
0855デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
垢版 |
2019/03/20(水) 16:36:56.04ID:Jx7dUCON0
日本語を勉強すべきだの、あほかだのと、無礼な態度は若気の至りと
こちらは目を瞑って色々と箇条番号やらキーワードやら出してやってたが
そろそろ見限る頃だな
0857デフォルトの名無しさん (ワッチョイ a37b-47Me)
垢版 |
2019/03/20(水) 17:24:29.94ID:SCVZEQpp0
>>841 >>843 (少々長くなった、読みにくくてすまぬ)
2つの関数があって、それらを「同時に」使う式で評価順が不定、
しかも未定義ではない、というのは分かるんだ。

int foo(void) {return 1;}
int bar(void) {return 2;}
func(foo(), bar()); // 関数引数の foo(), bar() どちらが先に呼ばれる?
int a = foo() + bar(); // 式中の foo(), bar() どちらが先に呼ばれる?
・どちらが先に呼ばれても同じ結果が得られる(後者では a の値は 3 になる)
・どちらが先に呼ばれたかをユーザが知ることは不可能

ところが、呼ばれた瞬間を捕まえてやろうと、関数に仕掛けを施すと…
int foo(void) {printf("foo()\n"); return 1;}
int bar(void) {printf("bar()\n"); return 2;}
「二つの副作用完了点の間に、オブジェクトの値を2回以上変更」という、
未定義の動作になっちゃうんだよ(俺はここで勘違いをしてるのだろうか?)。
printf() の内部状態もオブジェクトだろうからね。出力バッファとか。
・どちらが先に呼ばれるか表示される、おそらく結果は同じ(a == 3)だろう
・しかし、このプログラムには未定義の動作が含まれている


実際問題としては printf() を差し込んでも動作が変わらないように
うまくライブラリが作られてると思うけどね。
この投稿の趣旨は、「不定の動作であっても、結果を使うだけなら
プログラムとして正しい。しかし、不定の動作の内実を探ろうとすると、
その活動によって未定義動作を含んだプログラムになってしまう」っていう
不確定性原理みたいな何かが規格に仕込まれてるんじゃないか、という疑い。
(別に陰謀論をブチ上げようって意図はないので安心してくれ)
0858デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
垢版 |
2019/03/20(水) 17:44:50.88ID:Jx7dUCON0
>>857
そのコードが未定義かどうかは達成しようとしている目的による

たとえば、こういう場合
int x = 0;
int foo(void) { return ++x; }
int bar(void) { return ++x; }
int main(void)
{
int y = foo() - bar();
assert(y == -1);
}
fooとbarの実行順序に依存すると
実行順序は未規定だが、未規定に依存することは禁止で、
その禁止を破ったせいでmainの動作が未定義となる

これに対して、
int foo(void) {return 1;}
int bar(void) {return 2;}
int main(void)
{
int y = foo() - bar();
assert(y == -1);
}
この例では未規定の動作を含むが
その未規定がどう転んでも影響がない、
つまり依存していないので未定義の動作とはならない
0862デフォルトの名無しさん (スフッ Sd1f-QpYv)
垢版 |
2019/03/20(水) 18:13:55.67ID:xQ4G2GlCd
毎度だけど話がズレるんだよな
>>810に対して>>813で「規格内で触れられてないのは未規定じゃなくて未定義じゃね?」って物言いがついた(未規定の動作は>>822
で、>>816が「規格内で触れられてない場合も未定義」って言おうとしたんでしょ
>>823でなぜか未定義動作は異常(不正)なプログラム云々言い出したので話が分からなくなったんでは?
0868857 == 839 (ワッチョイ a37b-47Me)
垢版 |
2019/03/20(水) 19:18:49.33ID:SCVZEQpp0
>>857>>861 の意味で書いた(前半部分が余計だったのかも)。
最初の4行のコード foo(), bar() に printf() が仕込まれてない方は
「不定」だが「未定義ではない」。

ところが後半 printf() を仕込んだ方は >>858 の出してくれた最初の例、
foo() と bar() が同一のグローバル変数を変更する場合と
本質的に同一の、つまり未定義動作じゃないか、という話。


>>866 これは巧妙だし、思いつかなかった。
考えてみる(調べてみる)ので少々時間をくれ。
0872857 == 839 (ワッチョイ a37b-47Me)
垢版 |
2019/03/20(水) 21:01:55.22ID:SCVZEQpp0
>>866 の案も未定義な感じ。

EXP30-C. 副作用が発生する式の評価順序に依存しない
ttps://www.jpcert.or.jp/sc-rules/c-exp30-c.html

本文冒頭の引用部 (ISO/IEC 9899:2011 セクション 6.5 らしい) より再引用
> スカラオブジェクトへの副作用が、このオブジェクトへの別の副作用、
> または、このオブジェクトの値を使った演算、のいずれかに対して
> 順序が規定されていない場合、未定義の動作となる。

foo() の i=1; が「スカラオブジェクト i への副作用(代入)」
bar() の a[i]=1; が「このオブジェクト i の値を使った演算(配列の添字)」
に該当するかと。


ちなみに前述の Phinloda さんのページだと【未定義の例】にある
二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合、
 又は変更した後で新しい値を得ること以外の目的でそのオブジェクトを
 アクセスしている場合。
の部分と思われるが、ちょいと分かりにくいね。
…いや、自分で紹介しといて、その言い草はないだろ、と我ながら思うけど。
0873857 == 839 (ワッチョイ a37b-47Me)
垢版 |
2019/03/20(水) 21:33:10.02ID:SCVZEQpp0
>>867 返答が前後して失礼。
printf() が持つ(かもしれない)状態ってのは、例えば
出力バッファ(fflush() で強制的に吐き出させるアレ)の
使用量を管理するカウンタかポインタか、そのあたりを考えてた。
もちろん stdout のバッファリングを禁止すれば、この場合に
printf() を安全に使えると考えてるわけでもないのだけど。

むしろ「不定の評価順序を調べるのに printf() を使えるなら、もっと簡単で
末端プログラマに読めるソースコードで実現できるんじゃないか」って感じ。
ライブラリ関数だと、中で実際に何をやってるか見えないからね。


>>849 の 3, 6 あたりに該当してきたので、本日はここまで。
…というか「バーナム効果」って奴じゃないの?
0874デフォルトの名無しさん (ワッチョイ ff01-jA9u)
垢版 |
2019/03/20(水) 22:01:51.83ID:XMH8sO2j0
>>872
> bar() の a[i]=1; が「このオブジェクト i の値を使った演算(配列の添字)」
> に該当するかと。
なるほど
よくよく考えたらそのリンク先の未規定の例を参考にして
int i=0;
int foo(void){i=1; return 0;}
int bar(void){i=2; return 0;}
でいいと思う
0875KAC (ワッチョイ 6f68-YrE5)
垢版 |
2019/03/20(水) 22:13:24.28ID:47yan6gC0
なにやら話がややこしい方向に行ってるけど、
そもそも関数の呼び出しは副作用完了点だぞ?
0876デフォルトの名無しさん (アウアウエー Sac2-v7M6)
垢版 |
2019/03/21(木) 10:46:08.11ID:Jl2vA9O/a
C言語初心者です。
やっとポインタの学習にさしかかったところです。
C言語におけるポインタという概念と、
メモリの間接アドレス指定とは似ていると思ったのですが、
この感覚は間違っていますか?
0882876 (アウアウエー Sac2-v7M6)
垢版 |
2019/03/21(木) 13:15:33.98ID:y6QadYkWa
>>877
>>878
恐縮です
学習の中でつまずいたらまた質問させてください

>>879
>>880
間接アドレス指定のほか直接・相対・即値…などは
基本情報技術者試験の勉強範囲になっているので知りました
C言語もきっかけは基本情報の対策として取り掛かったものです
残念ながらBasicもアセンブラも手付かずです
0889デフォルトの名無しさん (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/23(土) 06:17:45.22ID:jegHMgvE0
確かに for (i = n;;) /* 初期化あり, 継続条件なし, 更新なし */ よりは
i = n; // 初期化
for (;;) // 無限ループ, 終了判定はループ内
の方が for の使い方では見慣れた書き方だよな。

というか for (i = n;;) を見せられたら、いったん立ち止まって
頭の中で2行分けに翻訳して理解すると思うわ。
0894デフォルトの名無しさん (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/23(土) 08:03:50.35ID:jegHMgvE0
>>892
実行結果を見ると、最初に表示されるのは「3回目の処理です」だね。
この 3 はループ変数 i から算出される値。

最初に表示したい値である 3 を if の条件式の中にも書いておく方が
プログラムが何をやってるか(3を表示する状態になるまで continue する)を
読み取りやすいという考え方かと。
if (i < 2) を見て「i < 2 の間は continue される。i == 2 になったら
continue されずに下の処理に進む。すると最初に表示される数字は i + 1 で 3」
と理解するより簡単だろう(とプログラムを書いた人が考えたのだろう)。


実験したところ、ちゃんと最適化されるみたいね。
if (i + 1 < 3) でも、アセンブリの方では 2 との比較になってた。
0900デフォルトの名無しさん (アウアウエー Sac2-0zLl)
垢版 |
2019/03/23(土) 14:07:37.70ID:OxlPANCja
知りたいことが答えてもらえないが文脈からさっすると
for(i = n;;)は ;; こいつが無限ループさせる whileのときの (1)みたいなもんなんかな
そうなると i = n って表記は i が nといっしょやったらずっと無限ループしとけってことになるんかな
んーそうう考えると for(;;)だったら無条件でループやっとけって感じでつかえそうだけど i = nならとかなんか条件はいるなら ;; こんなん
つかわんでももっと他になかったんじゃろかと思うな。 しかしこのテキスト何の説明もなくいきなりあんな技使いやがってやぶりすてたろか
0901デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/23(土) 14:23:08.16ID:Bvojjkpo0
>>900
for 分のカッコ内は必ずセミコロンが2つ必要で、最初の項目は変数の初期化、2番目の項目は終了条件、
3番目の項目はブロックの最後に実行させる(主に変数をインクリメントしたりデクリメントしたりする)処理だ。
この項目が抜けていた場合はその処理に関して何もしない。例えば2番目の項目が抜けていたら終了条件なし
(つまり無限ループ)になる。

まあ入門書見ればわかると思うが、これの置き換えだ。

i = 1;
while (i < 3) {
 /* 何かの処理 */
 i++;
}



for (i = 1; i < 3; i++) {
 /* 何かの処理 */
}

特別なのは終了条件が空の場合は終了させなくなる事だけ。
0902デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/23(土) 14:23:33.00ID:Bvojjkpo0
for 分じゃない for 文だ。
0903デフォルトの名無しさん (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/23(土) 15:44:48.19ID:jegHMgvE0
>>900
すまんね。>>885 の質問を見て、普通の for の使い方、つまり
for (初期化; 継続条件; 再初期化) は理解してると感じたのだ。
その辺の説明は >>901 を見てもらうとして、ちょっと気になった点。

for (i = n;;) の i = n は「i が n に等しければ…」ではなく、
「i に n の値を代入する」だよ。等しいかの判定には == (イコール2個)を使う。
for の普通の使い方では「ループ制御変数 i の値を n に初期化」ということ。


代入の = (イコール1個)と、等値判定の == (イコール2個)は、
携帯端末で見分けにくかったりするのかな。
自分では新式の装置を使わないので、そういう部分に思い至らなくてな。
0904デフォルトの名無しさん (ワッチョイ 6f02-DTGA)
垢版 |
2019/03/23(土) 16:17:36.63ID:dHpVxeMm0
お願いします。OSはcentos7です

メルセンヌツイスタを使って、ひとつだけ乱数を出したいのですが
乱数を出す間隔が非常に狭く、以下の関数でtime(NULL)を用いると
同じ乱数ばっかり出てきてしまいます。

※関数はコレを使ってます
http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html

たとえば、1回関数を実行して、ひとつ乱数を生成。
それを、秒間20や、30繰り返したとしても異なる乱数が出てくる方法ってありませんでしょうか

勝手なお願いですが、できる限り簡単な方法でお願いします。
VBAでパチンコシミュレーターを作ったのですが、
実行速度が非常に遅く、もっと高速化するためにCの勉強を始めたばっかりです
0906デフォルトの名無しさん (ワッチョイ 07f5-rXtv)
垢版 |
2019/03/23(土) 16:52:06.42ID:2BzPzaMr0
>>904
time(NULL) は1秒以上の実行間隔がないとアウト
それ以外の何らかエントロピー源を使わにゃならんということだ
たとえばスペシャルファイルの/dev/randomだとか、
Core-i7ならrdrand命令を使うとか
0908デフォルトの名無しさん (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/23(土) 17:26:50.18ID:jegHMgvE0
>>904
乱数値を1個だけ返すコマンドを作成、シード値に time() を使用。
同じ1秒の間に何度もコマンドを呼ぶと同じ値しか返ってこない。
次の1秒も(さっきまでと違う値だが)同じ値が何度も返ってくる。
…という話なら、しごく当然だね。

元の目的のプログラム、パチンコのシミュレータだっけ?
そっちをCで作り始めて、メルセンヌ・ツイスタの関数を組み込んじゃえば
自動的に解消する問題って気がするけど。

シミュレータの方はVBAで続けて、乱数だけCのコマンドを使うって方針なの?
0910デフォルトの名無しさん (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/23(土) 17:44:46.83ID:jegHMgvE0
>>909 それはその通りだね。
VBAはWindowsで動かして、CentOSの方では「乱数サーバ」を回す、
というクライアント・サーバ・モデルも何か変な感じだし。

だから、全面的にCentOS上のCでの開発に移行する準備として
乱数ルーチンのテスト用に値1個だけ返すコマンドを作ってみたら、
「立て続けに呼ぶと同じ値しか出ないぞ」と心配になったのかな、と。
0916デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/24(日) 13:39:30.48ID:ynFGlX0q0
>>911
おめ
0917デフォルトの名無しさん (ワッチョイ 4e7c-0zLl)
垢版 |
2019/03/25(月) 16:27:08.09ID:7UyvjyQO0
dfコマンドの -h オプションみたいな
数値をヒューマンに優しい表現にしてくれるライブラリって
ありますか?

ddみたいに、ヒューマンから数値にしてくれるやつも欲しい
0919デフォルトの名無しさん (アウアウウー Sa2f-7Ozv)
垢版 |
2019/03/25(月) 20:44:43.02ID:T0osdeZXa
ライブラリは知らんなあ。
でも簡単だから作っちゃうなあ。
あ、そうだ。お題スレのお題にするか。簡単すぎて馬鹿馬鹿しいかも知れんが。
0925デフォルトの名無しさん (アウアウウー Sa2f-7Ozv)
垢版 |
2019/03/26(火) 13:55:17.17ID:PDyA3k9ga
>>923
GNUの複数のコマンドで使われてるからあるかもよ。詳しい人がこのスレ見てないだけで。
まあしかし ls も df もソース公開されてる筈なので探せば何れわかる。
0933デフォルトの名無しさん (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/26(火) 21:26:56.44ID:ExDeReqX0
「GPL汚染」って言葉はGPLへの敵意が感じられるんで避けたのよ。
日頃からGNUさんのおかげで色々便利に使わせてもらってるわけだし。

でも、うっかり1ヶ所でも使うと、プロジェクト全部のソースが
GPLライセンスになって公開を義務付けられたりするのは、
やっぱ「感染」じゃないか、と思う部分もあったり。


よく「車輪の再発明をするのはバカバカしい」とか言うけど、
GPLが「丸い車輪」の利権を押さえてるせいで、
わざわざ自前で「歪んだ車輪」を作って使わざるを得ない
境遇に置かれてる人もいるんじゃないかな、と。

…この場で書くような話でもないんだがネ。
0934デフォルトの名無しさん (ワッチョイ 4a0e-rXtv)
垢版 |
2019/03/26(火) 21:33:22.86ID:rSL1tIwA0
>>931
> 感染性
> これはあたかも、伝染病(それも不治の病)が広がっているかのように見える。
> このため、ソースを公開しないソフトウェアを作る一般的なソフトウェアメーカーや、
> 他のライセンス支持者からは、「感染性のライセンス」「ウイルス性のライセンス」と呼ばれる。

他人事なやつにゃ、あーそー(asshole)でしかないんだろうな
0935デフォルトの名無しさん (ワッチョイ c68c-WX4v)
垢版 |
2019/03/26(火) 21:57:53.69ID:X9x/YQnQ0
でも裁判は自分で起こさなければならない。
0937928 == 933 (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/27(水) 06:47:37.38ID:jMm/WIPk0
>>933 でうっかり「GPLライセンス」と書いたけど、
GPL が GNU General Public License のことなら
GPLライセンスだと「〜ライセンス・ライセンス」だね。
「〜ソースがGPLライセンスになって」は
「〜ソースにGPLが適用されて」あたりの方が適切だったか。

言葉の選択に敏感に気づいてくれたんで、理由の説明に5行ほど使ったが、
半面、「GPL汚染」を知っる人が、感染だと分からないことは予期しなかった。
(これはカマトトにカマトトで応じてるだけ、のつもり、為念)
「GPL汚染」がポピュラーってのは正式な用語ではないことも認識してるんだろうし、
してみると技術用語に対する完璧主義とも違うんだろうな。


…言葉の使い方について、少し言葉を使ってみた、と言う感じのお話。
0939デフォルトの名無しさん (ワッチョイ 0b7b-v3gc)
垢版 |
2019/03/27(水) 07:40:33.52ID:jMm/WIPk0
ありゃりゃ、確かに「GPU汚染」だね。
文脈に基づく先入観で「GPL汚染」としか見えてなかった。
すると、そっちがお誘いだったのかな。節穴で申し訳ない。

ついでにコピーせずに投稿文を手打ちしてることの傍証にもなったね。
0941デフォルトの名無しさん (ワッチョイ 67d2-tGIR)
垢版 |
2019/03/27(水) 09:20:30.29ID:anJ1LIGv0
GPL汚染というのは商用アプリケーションを作る会社が
GPLライセンスのライブラリーを使いたいのに
ソースを公開すると売れなくなるから使いたくないから言ってるのと
ソースをみせたくないひとが言っているんだよ
0942デフォルトの名無しさん (ワッチョイ c602-I58O)
垢版 |
2019/03/27(水) 23:28:49.86ID:oM4knkxt0
まあ味方にもよるよね。GNUの思想を支持する側から見たらプログラムを自由に使えない事は悪だろうし。
0943デフォルトの名無しさん (ワッチョイ c602-I58O)
垢版 |
2019/03/27(水) 23:29:19.56ID:oM4knkxt0
見方だ
0945デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/03/28(木) 12:45:58.19ID:0gfjfVxLa
GNL
0948デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/03/28(木) 21:03:56.02ID:KhTRBxbZa
WBA
0949デフォルトの名無しさん (ワッチョイ ef02-9gjM)
垢版 |
2019/03/28(木) 22:45:08.37ID:WL/rMpQN0
WEP
0951デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 19:45:04.77ID:jbLCE6Gyd
https://i.imgur.com/4iAlV1x.jpg
こうなるように作りたいです
0954デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 19:55:29.51ID:jbLCE6Gyd
>>952
正しくはどうなりますか?すみませんさっぱりわかりません…
0955デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 19:56:17.40ID:jbLCE6Gyd
>>952

>>953
今気づきました!!ありがとうございます!やってみます!
0958デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 21:13:20.24ID:jbLCE6Gyd
>>956
ありがとうございます
そこも間違えてたみたいです
0960デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 22:53:43.19ID:jbLCE6Gyd
https://i.imgur.com/nY9LuSR.jpg
https://i.imgur.com/U46WJvs.jpg
https://i.imgur.com/wwRNBB2.jpg
試してるのですが最後の1文字が表示されないままずっと実行中になってしまいます。3枚目はhello world入力で何回か実行した時の画面です。上の3回は強制終了して、一番下のはフリーズしてるやつです
どなたかわかる方いましたら教えてもらえないでしょうか
何度もすみません🙏
0962デフォルトの名無しさん (アウアウエー Sa3f-RDgh)
垢版 |
2019/03/29(金) 23:10:52.10ID:kPfQN3Sza
>>960
配列の添字も一緒にprintfしてみれば。
あと変数名は意味のあるもんにした方がええよ。 a とか b はあかんわ。
あと配列は初期化した方がいいかもよ。自分で中身を把握してれば別にしなくていいんだけど。
0966デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/30(土) 06:48:18.36ID:+pUtVW5zd
>>961
>>965
無事解決しました
大変ありがとうございました(^ω^)
0970デフォルトの名無しさん (ワッチョイ ef02-9gjM)
垢版 |
2019/03/31(日) 18:22:14.86ID:x4Dlbn8C0
>>968
OCRでできるかもね。
0977デフォルトの名無しさん (アウアウエー Sa3f-XwTE)
垢版 |
2019/04/01(月) 21:33:02.04ID:v6mAk26Pa
「要素型がint型で要素数がnの配列を受け取って、
全要素に添字と同じ値を代入する関数set_idx」を作成しました。
http://codepad.org/krsZoljq

配列aの要素数はマクロ定義で#define NUMBER 10とし、
問題なく動作しました。
ところが、この要素数10を60に書き換えてみたところ、
コンパイルされたexeファイルを実行しても動作しません。
コンパイラはMinGW(gcc)です。
思い当たる原因を教えていただけないでしょうか。
0980977 (アウアウエー Sa3f-XwTE)
垢版 |
2019/04/01(月) 22:08:10.15ID:v6mAk26Pa
>>978
>>979さんの仰る通りint a[NUMBER]={0};と書いたら意図通りに動作しました。
a[]と宣言するのでは、配列に割り当てる適正なメモリサイズが確保できないということでしょうか、、、
0983977 (アウアウエー Sa3f-qsRO)
垢版 |
2019/04/01(月) 22:29:36.01ID:v6mAk26Pa
>>981
社会人で完全に独学なので、質問するとしたらこういう場しかなくて…
初歩的な質問でスレ汚し申し訳ないです。
ちなみに教科書は柴田望洋『新・明解C言語(入門編)』を使っています

>>982
なるほど!
とてもわかりやすいです
0984デフォルトの名無しさん (ワッチョイ 0f8f-068C)
垢版 |
2019/04/01(月) 22:51:19.76ID:Mx+j7LaB0
私も「ド素人&独学でしかやってない&プライベートでしか使ってない」ってかんじですが
set_idx関数がバッファオーバーラン対策を全くやってないのが気になるかも

int *set_idx(int n) とかいう風な、ポインタを返す関数に書き換え、関数内でmallocというのが考えられるけど
正確にセキュアな方法はワカラン


https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b06_02.html が参考になるかも知れないし
「まだ早い」ということになるかも知れないし、何とも言えない
0987デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/04/02(火) 09:36:27.96ID:exqjvsIla
>>977
そのURLのページ昨日から開けなくてなんだかわからない。
0989デフォルトの名無しさん (ワッチョイ 0f8f-068C)
垢版 |
2019/04/02(火) 11:18:36.80ID:SQXqRaAc0
>>985
そうっすね

「c言語 おすすめしない理由」でググると
https://www.sejuku.net/blog/3619
https://takachan.hatenablog.com/entry/2018/06/21/233111
https://kiseki-shoji.com/recommended-programming-language/

とか


ところで、このスレって次スレ立てるタイミングは
どんな慣習なんでしょうか
減速しないと確実にヤバイ域かも
0992デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/04/02(火) 12:23:08.20ID:exqjvsIla
おつ
0993デフォルトの名無しさん (ワッチョイ 0f8f-068C)
垢版 |
2019/04/02(火) 12:54:10.21ID:SQXqRaAc0
>>989 の補足というかスレチというか…

Windows 環境なら hta を javascript で書くというのも良いかもですね
コピペプログラミングベースで良いなら、ウィンドウを表示するプログラムを作ってチョコチョコとカスタマイズする位なら30分掛からない
「javascript 全く知らん&Excel VBAやマクロは少し分かる」なら hta を vbscript で書くのも良いかも


…このスレの人達からしたら忌み嫌われかねない環境かも…?
0995はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ef3e-r4m/)
垢版 |
2019/04/02(火) 13:07:35.24ID:vU9CoLi+0
>>993
Windows だけでよければ electron みたいな重量級のフレームワークをあらためて導入する必要もなく
ウェブ系の GUI デザインの延長で使える HTA は楽だとは思う。

「忌み嫌う」というよりは C とはまるで使いどころが違うので、
C を必要だと判断して始めた (その判断が正しいかどうかは別として) 人に対して状況を確認することなく
何か他の言語や環境を勧めるのは意味わからんという感じだと思う。
0998デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/04/03(水) 20:52:13.33ID:GUjlsyjta
    _,,...,_
  /_~,,..::: ~"'ヽ
 (,,"ヾ  ii /^',)
    :i    i"
    | (,,゚Д゚) ・・・
    |(ノ  |)   
    |    |
    ヽ _ノ
     U"U
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 56日 10時間 47分 19秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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