X



C言語なら俺に聞け 150

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (アウアウクー 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
2デフォルトの名無しさん (アウアウクー MMb3-IE4z)
垢版 |
2019/02/06(水) 13:43:35.56ID:c4bnQMl3M
ミスってる
!extend:checked:vvvvv:1000:512
を書き込み内容にするためにもう一行書かなければならないのね
3デフォルトの名無しさん (ワッチョイ df52-5rgS)
垢版 |
2019/02/06(水) 13:53:52.35ID:bwpbLxE30
そうしろって書いてあるじゃん
2019/02/06(水) 14:08:04.08ID:6cW+g5Qj0
違うな
シェバンに類似する特殊な一行目は書き込みすると失われる、だろ
だから次の手順説明のために同じものをもう一行増やす

しかも「必ず1行目に入るように」って書いてあるから二行に増やしても先頭に空白行があると受理されないハズだ
もう一行書くだけじゃダメだからな
2019/02/06(水) 14:19:35.82ID:NIgQMFwf0
>>1 乙です、ドンマイ
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:

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

どなたか納得するような理由をご存知でしょうか?
2019/02/06(水) 16:09:43.98ID:1SbGZlcV0
若き日の俺は、gotoの他にフラグも無闇に使うなと教わったものだが
フラグはいいってことになったのは、いつからだ? どういう経緯でだ?
2019/02/06(水) 16:21:58.32ID:bwpbLxE30
Cにはラベル付きbreak文って無いんだね初めて知った

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

まぁJavaでもあまり使ったことないけど…。
2019/02/06(水) 16:41:15.95ID:1SbGZlcV0
#define break goto
みたいなしょーもないことしても本質的に何も変わっちゃいねえ
2019/02/06(水) 18:02:39.46ID:CtZpHCTya
gotoよりフラグがやばいよな。
11デフォルトの名無しさん (ワッチョイ ff02-vS77)
垢版 |
2019/02/06(水) 19:00:59.18ID:jnwpwdAT0
goto があっても
いいじゃないか
C言語だもの
12デフォルトの名無しさん (アウアウクー MMb3-rTH6)
垢版 |
2019/02/06(水) 19:48:43.15ID:KUGC24GrM
goto文そのものが悪いわけではない。いまだにgoto文の使用そのものがよくないというやつらのせいでおかしくなっている。

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

continue文だって実体はgoto文で、コンピュータにとってはメモリ上のマシン語を順番に実行しない場合はすべてメモリのアドレスのジャンプでgoto文。
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);
}

の二つの方法があるけど
一般的にはどっちの方法がお薦め?
2019/02/06(水) 20:30:53.85ID:1SbGZlcV0
>>12
機械語が分岐命令になる高級言語のステートメントを全否定というのは
構造化とはまったく違う話だな
2019/02/06(水) 20:31:48.22ID:1SbGZlcV0
>>13
別にどっちでも
2019/02/06(水) 20:34:02.27ID:WRu6z6Oe0
>>15
そ、そう・・・
2019/02/06(水) 20:50:04.50ID:y48wBDHW0
>>13
> センサーで取得した計測値を数値では無く文字列で返す関数を作ろうと思ってる。
これ自体が糞。
計測値は生で保持して、表示する時だけ文字列に変更しろ。
そうすればprintfだけで行けるだろ。

無駄に可変長のバッファなんて持とうとするから無駄に面倒になる。
初心者だから分からないのだと思うが、そもそも複雑にならないように全体像をまず組むんだよ。
2019/02/06(水) 21:37:14.88ID:CtZpHCTya
voidにするならポインタ返した方がいいと思うよ。
正しさでいうと、既存のライブラリ使ってシリアライズするのが正しい。
2019/02/06(水) 22:39:39.17ID:eUM592Vs0
関数の戻り値は処理の成否のみを返す。
正常終了なら0、異常終了なら非ゼロ。
入出力は引数で渡す。

と、決めて統一するのが良いと思う。
2019/02/06(水) 22:43:12.36ID:WRu6z6Oe0
助言ありがとう
確かに関数の戻り値は処理の成否のみに限定するのはスッキリしていいかも

> 文字列で返すのが糞

確かにその通りで(;^ω^)
2019/02/06(水) 23:32:22.18ID:eUM592Vs0
重要なのは統一するってこと。

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

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

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

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

初心者が自前でライブラリみたいな物をいきなり組まなければならない時点で設計が間違ってる。
それは君らがよく誤用している「無能な働き者」に該当する。
(ただし繰り返すが、Webでの多くは誤用されているので注意)
2019/02/07(木) 00:06:12.90ID:AP44nO75a
副作用がメインならともかく、欲しいものを素直にreturnすればいいよ。
2019/02/07(木) 00:29:49.70ID:92YFdzoB0
strtol()は変換できなかった時の戻り値が曖昧だから0やらLONG_MAX、LONG_MINに固定してるだけだと思ってたんだけど
2019/02/07(木) 00:29:57.91ID:xA+ztU7B0
バカかコイツラNaNが出たらどーすんだよ
文字列が正しいだろJK
2019/02/07(木) 05:23:13.49ID:TUp6R+x+F
>>20
C言語の戻り値って、エラーのみで返して、正の値って無いから、C++だな、C++言語に行くように
2019/02/07(木) 06:44:41.17ID:3iAi8jGM0
>>19
それやだ
んなことするくらいならsetjmpだ
2019/02/07(木) 07:00:15.05ID:zkf2ry7x0
>>13
ほんとうはaのときは引数にエラーがいるし、bのときは戻り地を
エラーにしないといけないからあまり変わらない
2019/02/07(木) 17:48:23.42ID:hewX2k170
くっそ初心者なんだがガウスの消去法でn次連立方程式を解くようにしたいんだがn次を入力させてからやるにはどうやりゃいいんだ?
2019/02/07(木) 17:57:54.86ID:trMMLIP2d
行列の格納先に配列のかわりにmallocで動的に確保する。
2019/02/07(木) 21:03:55.08ID:2L3KkQ6GM
n以外はどうやって入力させるつもりだったの?
2019/02/07(木) 23:25:09.01ID:9IdI5ETg0
a)の方法。空の文字列を渡そうとすると失敗するっぽい

char** str;
sokutei( str );

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

cha* str;
str = sokutei();
2019/02/07(木) 23:38:06.10ID:92YFdzoB0
初心者だから間違ってるかもしれんけど
外でメモリ確保してないからじゃない?
文字列を関数内で作ってたら関数処理終わった後は文字列がそのまま残るかは保証されなかったような気が
外で配列宣言して関数に渡して、関数内でそこにmemcpyさせるとか?
2019/02/07(木) 23:41:01.38ID:2ez4owIb0
>>32
それやるなら、こうじゃね?

char* str;
sokutei(&str);
2019/02/07(木) 23:59:08.20ID:92YFdzoB0
あぁmallocしてんのね…
aは何でchar**なんだろう
2019/02/08(金) 00:24:25.67ID:ssW/5KIMa
ちゃ
2019/02/08(金) 07:47:48.49ID:Mb3d412j0
>>29
C99以後ならVLAという手もある
int n;
scanf("%d", &n);
double mat[n][n + 1];
2019/02/08(金) 08:37:48.99ID:uDm/bfU0d
>>34
あぁなるほど

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

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

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

これなら外のstrにmallocで確保したアドレスが入るのね
2019/02/08(金) 09:08:14.73ID:kNpkYNE/0
渡した引数を書き換えてくれるインターフェースは
scanf() の使い方と同じくするしかない
2019/02/08(金) 13:03:58.19ID:VZqJ7QJN0
Cに未来はあるのか
2019/02/08(金) 21:04:27.25ID:umhqtjI80
>>37
VLA は廃れていく方向のダメな子じゃないですか?c++ からも linux からも追放されたようですし
2019/02/08(金) 21:05:05.81ID:umhqtjI80
>>40
たくさんの人に使ってもらいたいライブラリを書くのなら、現状 C しかないと思います
2019/02/08(金) 21:45:38.59ID:Mb3d412j0
>>41
C++にはもともと導入されてないから追放とかじゃない
vectorがあるからいらんかったというだけ
44デフォルトの名無しさん (ワッチョイ bd5f-1QgP)
垢版 |
2019/02/09(土) 01:59:26.91ID:babOKSMs0
>>26
ANSI Cでは何かしらの値を返さなければいけない。
2019/02/10(日) 10:04:34.79ID:wNxUL6Ap0
どこかのHPで「自分は頭悪くてC言語の命令が覚えられなかったからアセンブラでプログラミングしてた」という記述を見たんだけど
アセンブラの方がよっぽど難しいと思うんだけど、アセンブラできる人からしたら違うのかな?
2019/02/10(日) 10:40:12.32ID:FPonLwYC0
単に、新しいものを覚えるより使い慣れたアセンブラのままでやった方が早いという話じゃないかな。
あるいは情報処理試験の話だったとか。
2019/02/10(日) 10:47:05.06ID:nPt8HxnAa
おそろしく英語がわからんプログラマーを見ると少し哀れみを感じる
2019/02/10(日) 10:48:33.87ID:/aZS7s8b0
>>45
ものにもよるけど理解するのはアセンブラのほうが単純なぶん簡単。
2019/02/10(日) 12:53:55.02ID:C8AJlGLg0
一部には変数概念を理解できなかった御仁もいるらしい
50デフォルトの名無しさん (ワッチョイ 868c-gf/b)
垢版 |
2019/02/10(日) 12:55:24.84ID:nnE1Q40B0
CPU設計者じゃないかな
2019/02/10(日) 13:26:11.80ID:6kY6tuUn0
アーキテクチャや機械語ニーモニックは簡単なんだけど
CPUと直接関係のない、アセンブラ指示子やコマンドを覚えて
エラーなくアセンブル通るようにするのは大変
2019/02/10(日) 13:34:57.75ID:fhaaLeE2a
わかりやすいアセンブラ作るとCになると思うよ
2019/02/10(日) 13:41:05.68ID:nGIVWkyn0
>>52
ならないですね…
2019/02/10(日) 14:46:39.63ID:vOpxNkmL0
構造化アセンブラとかあったな
結局流行らなかったけど
2019/02/10(日) 16:31:12.43ID:ixgHA2PX0
構造化アセンブラ使っていればいずれCに移行するし
Cで記述できない部分はインラインアセンブラで補うようになる
構造化されているとはいえアセンブラはあくまでアセンブラ
生産性はCには及ばない
元組込みマイコンプログラマより
2019/02/10(日) 17:36:00.24ID:XdgVAt+K0
>>45
アセンブラってのは理屈じゃない決めごとを憶えるだけでいいが
Cやその他の高級言語は構造化だとか処理系依存がどうたらという
どっかの知らん馬の骨が強弁する作法シキタリに付き合わされるから
気が短いやつはプイと出てっちまうのさ
鵜呑みをせず納得ずくでしか動かんやつという意味では大物の素養がある
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のサイズに依存)、と考えたわけ。
2019/02/10(日) 18:06:18.52ID:ialxvDQ60
プリプロセッサで MASM の REPT句と同じようなのが欲しいいかも と思ったことはある
2019/02/11(月) 08:42:09.13ID:sI6uV93B0
C言語学び始めたときに(BASIC、Z80/8086アセンブラの経験はあった)「C言語の非常識」とかいう本読んで
トラブルになりそうなところを先に学んだんでそう苦労しなかったな。

それより16bit DOS時代だったんでコンパイル設定でメモリモデルがLARGEだのHUGEだのの方が理解でできんかった。
まだ学生で「インターネットください」より前の時代で調べる手段がわからんかったし。
60デフォルトの名無しさん (ワッチョイ 8602-Z23n)
垢版 |
2019/02/11(月) 16:17:31.30ID:aNfCU32+0
それ30年ぐらい前だよね。
large だの huge だのは本読んだりして覚えたなあ。
2019/02/11(月) 16:27:55.76ID:nk0/BZLe0
nearとfar
懐かしいな
2019/02/11(月) 16:39:10.95ID:adB+iGat0
数百MBの配列データを扱うときにコンパクトモデル利用したな
2019/02/11(月) 16:57:59.18ID:/r6pt/Ls0
30 年前に C コンパイラにアセンブラソース出させて C を学んだけど
ひょっとして普通はしないことなの?
2019/02/11(月) 16:58:51.46ID:7mPrdtBm0
>>62
CPUはなんでしたか?
2019/02/11(月) 17:08:20.36ID:adB+iGat0
MS-DOSでPC98使ってました
多分80386だったんじゃないかな?
2019/02/11(月) 17:11:09.55ID:CRK5hAp10
RA21
2019/02/11(月) 17:20:25.05ID:adB+iGat0
なんかそれっぽいw
CADのデータを扱うアプリで、データが大きくなりすぎて
PCによっては読込すら出来なくなってしまい
アプリを立ち上げずに画面表示やプロッター出力する
プログラムを作れという指令が飛んだんです
データ構造は比較的簡単で、先頭部分に部品基本イメージ、
その後ろから、固定長で膨大な描画情報がある感じです
描画情報を64k未満の配列に分割して格納し、
それぞれの配列アドレスを格納した配列経由で操作するイメージでした
2019/02/11(月) 17:31:32.52ID:3tLemvMU0
DXFのENTITIESセクションとかかな 頭に部品イメージ云々
2019/02/11(月) 17:40:57.96ID:adB+iGat0
そんな感じです
ソフトは有名な高額ソフトではありません
スタンドアロンのMS-DOSで動作可能なほど
コンパクトなものでした(名前失念w)
2019/02/11(月) 17:51:01.28ID:Hh2Z/MAZ0
>>63
コードが最適化されるのが前提なところがあるので
今はしたくてもちょっと難しい気がする
できることはできるけど、イマイチ学習効果が薄そう
2019/02/11(月) 17:52:29.43ID:MkFOBvt90
そもそもPC-98シリーズで数百MBのメモリー載る機種あるのか?
HDDですら数十MBクラスが普通だったと思うが…
2019/02/11(月) 18:00:50.47ID:adB+iGat0
>>71
メガバイトって事は無いですね
初期の無印98で128KB、MAX640KBだったかな
386乗せたRAシリーズだと標準で640KB+1024KBだったと思う
2019/02/11(月) 18:55:56.19ID:ItYOkWkR0
あれ?
98note 使ってたけどメモリ増設で16MB 積むか12MBで妥協するかで悩んでいた記憶が…
勘違いかな?
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使ってたよ。
75デフォルトの名無しさん (ワッチョイ bdc3-EwQo)
垢版 |
2019/02/12(火) 02:24:51.56ID:xDY2FToe0
Cしかかけませんっていうの
76デフォルトの名無しさん (ワッチョイ bdc3-EwQo)
垢版 |
2019/02/12(火) 02:25:15.35ID:xDY2FToe0
Cしか書けませんっていうのは新卒就活のときに不利?
他にどんな言語を習得すればいいんだろうか
2019/02/12(火) 02:52:19.85ID:wp1a6nq70
まず「他にどんな言語を習得すれば良いんだろうか」なんて言ってること自体がかなり的外れかな
手段と目的の順序が逆

あと面接のときに「何故C言語を習得し、それを何に使ったんですか?」って聞かれてちゃんと答えられる?
2019/02/12(火) 03:06:28.22ID:jEa3f+fD0
新卒であればプログラム言語そのものより他にアピールした方がいいと思うけどな
組み込みであれば現代制御理論、解析系であれば有限要素解析などC言語のプログラミングを応用する専門分野の知識を売り込んだほうがいいと思う
2019/02/12(火) 05:55:34.89ID:4zHmA9zW0
>>76
俺んとこではそれで充分
ただしCが書けるといってもHello worldの域を出ていないのは書けるうちに入らない
アルゴリズムの基本ができているかどうかを見ている
できていれば他言語が必要になっても泥縄ができるからだ
俺だってもともとアセンブラ屋で正社員3年目くらいのときにCの案件が回ってきて必死こいて憶えた
2019/02/12(火) 06:06:40.84ID:QnKLUVRS0
>>76
冗談抜きで一番大事な言語は日本語と英語。
開発職に論理的な表現力は重要。
81デフォルトの名無しさん (ワッチョイ 868c-gf/b)
垢版 |
2019/02/12(火) 09:06:46.70ID:lJ9WNOSb0
AならばBであるを表現できますか?と聞く
2019/02/12(火) 09:17:13.28ID:puzbyhsI0
64ビットCPUでもデフォルトの命令のオペランドが32ビットだから
linuxでint_fast32_tを使うのは間違いだったんだな
多分64ビットのアドレス計算も32bitの命令があるからパッディングとかも
起こらないだろうな
2019/02/12(火) 09:24:10.34ID:Y0SH8Lt40
>>82 どこが間違いなの?
2019/02/12(火) 09:29:01.84ID:puzbyhsI0
>>83
linuxはint_fast32_tが64ビットになってるから
2019/02/12(火) 13:06:03.99ID:puzbyhsI0
>>82の4行目で多分って書いたけど
64ビットのムーブ命令は32ビットなら0埋めされるから
ポインターの引き算をしなければ64ビット整数を使う必要ないということだな
2019/02/12(火) 13:19:08.47ID:4zHmA9zW0
ポインタの引き算に使うんならptrdiff_tだね
int_fast32_tが何ビットかには関係ない
2019/02/12(火) 15:07:18.06ID:s+eQ0w2IM
>>84
amd64では64bitが最速でないのに64bitが選ばれるのはおかしいっていう主張?
2019/02/12(火) 15:11:10.99ID:puzbyhsI0
>>86
わからん

>>87
正解
2019/02/12(火) 18:52:25.91ID:2Rlz0B+x0
このスレの平均年齢って幾つなんだ…(驚愕)
Cってもう若者は触らないっていう感じなんですかね。
2019/02/12(火) 19:06:37.74ID:5/zfp5Xa0
ここに書き込みしているのは、人間じゃないから
2019/02/12(火) 19:13:42.99ID:QnKLUVRS0
若者のC言語離れが叫ばれて久しいからな。
2019/02/12(火) 19:16:16.52ID:5/zfp5Xa0
50年前は、概ね若者だった
2019/02/12(火) 19:43:56.33ID:9j8xXtILM
いまどきの若者ならみんなPythonに行ってるよ
やや年食ってる連中ならJavaやC#
職人気質で頑固な偏屈者はC++
Cはかつての栄光を引き摺って余生を過ごす老人の言語
2019/02/12(火) 19:46:30.05ID:5/zfp5Xa0
Lunuxのソースって言語はなんだっけ?
2019/02/12(火) 22:27:27.41ID:afakhEje0
>>93
でも言語を超えて活用されるライブラリ(libzip, libpng/libjpeg etc)は C で書かれることはあっても、OOP 諸言語で書かれることはないかと思うのですが?
C++ で記述される汎用ライブラリはありますか?
2019/02/12(火) 22:30:48.71ID:Jl2Y8iQt0
Cの使い手が減ったんじゃなくて他の言語の仕事が増えてるんじゃないの。
もともとサーバー側のシステム開発をCでやったりはレアでしょ。
2019/02/12(火) 22:31:50.68ID:Jl2Y8iQt0
むしろ立場が怪しいのはjavaじゃないか?
2019/02/12(火) 22:33:34.82ID:CAePQpAGa
>>95
やっぱりアプリよりになっちゃうのは確かだね。
XMLのパーサとかだとオブジェクト指向の有り難みがある。
2019/02/12(火) 22:38:44.87ID:Jl2Y8iQt0
jsonをcで扱うのは涙がでますよ……
2019/02/12(火) 22:57:01.03ID:CAePQpAGa
Cでがんばろうと思うと、glibみたいな形になっちゃいますね。
2019/02/13(水) 12:23:21.90ID:ds2YQTN50
俺は有名な言語はほとんど全種類使えるから適材適所で使い分けてるは
2019/02/13(水) 12:36:20.22ID:FB2A40HJ0
使えるというか、Cが分かるなら「〜の言語でやれ」って言われたらどの言語でも3日で仕事出来るくらいは当然だけどね。
java勢とかが3日でCやれと言われてポインタまみれのコード読むのは無理だろうけど。
2019/02/13(水) 12:50:19.10ID:j9mDOCj4x
極端だけど、突然Prologでやれ!と言われても3日じゃまともに使えないと思う。
2019/02/13(水) 12:57:25.03ID:oF8nMyvD0
3日でできてしまう仕事ってお粗末そうだな
2019/02/13(水) 13:04:19.59ID:a9PctXZid
まあ新しい言語の勉強始めたら3日目にはそれなりに手が動くようになってるだろうからな。
でも仕事で使おうとするとプロジェクト設定の方法がわからないとかその辺で詰むと思うわ。
2019/02/13(水) 13:07:22.57ID:oF8nMyvD0
練達言語でさえ3日つーとやっつけ仕事くせえぞ
107デフォルトの名無しさん (アウアウウー Sa05-KI3Y)
垢版 |
2019/02/13(水) 13:12:51.57ID:V+opB2+Aa
>>99
ライブラリないの?
108デフォルトの名無しさん (アウアウウー Sa05-KI3Y)
垢版 |
2019/02/13(水) 13:15:49.92ID:V+opB2+Aa
3日ねえ。まあ、書けるには書けてもその言語の特性をうまく活用できるところまでは行きそうにないな。
2019/02/13(水) 13:23:21.11ID:q5+/i40P0
百歩譲って自分がもし言語が3日で出来たとしても業務知識や専門知識は3日では身に付かんから無理だわw
2019/02/13(水) 14:38:53.83ID:FB2A40HJ0
>>109
Cしかわからなかったけど、入社して「これわかりやすいから」とjavapressをポンと渡され、3日後にはjavaで養鶏管理のシステムを作らされていたぞ。
業務知識なんて仕様書と上司に聞きながら覚えるものじゃん。業務知識覚えてから仕事って、新卒じゃないんだからw
2019/02/13(水) 14:42:28.64ID:q5+/i40P0
業務知識覚えてから仕事なんて一言も書いてないけどw
こういう人ってちゃんとドキュメント類読めてるんだろうか
自己解釈でガンガン進めてから修正で苦労してそう

あと君が3日で出来るすごい人なのは充分分かったよ
2019/02/13(水) 14:42:57.53ID:Fe5QsHU80
業務知識を知ってから作るんだろう
新卒じゃないと知識なしに作り始めるのか
113デフォルトの名無しさん (ワッチョイ 868c-gf/b)
垢版 |
2019/02/13(水) 14:49:42.00ID:fZcB94Cs0
鶏が何を食っているか新卒で知っている人はいない。
貝殻食っていると知ってた?
2019/02/13(水) 15:10:52.45ID:Fe5QsHU80
仕様書に書いてあるんだろう
上司に教えてもらいながら開発するベテランさんは
知っていることなのかな?
2019/02/13(水) 15:11:22.39ID:4FvVMQftM
マジかよ、仕様書に貝殻ボタン追加しないと
2019/02/13(水) 15:28:42.70ID:ERyLIjVv0
貝殻というか石や砂など砂嚢(砂肝)に飲み込むものなら何でも良いんじゃないの?
2019/02/13(水) 15:30:11.62ID:q5+/i40P0
皆さん鶏に詳しすぎません?w
もしかして:鶏 飼ってる
2019/02/13(水) 15:31:15.00ID:ds2YQTN50
卵うむにはカルシウムがいるだろう
2019/02/13(水) 15:32:23.03ID:Fe5QsHU80
カルシウムが不足すると、イライラしてくる
貝殻囓ると多少は改善する
2019/02/13(水) 15:34:17.67ID:FB2A40HJ0
Cが出来るなら仕事で求められる程度のコーディングは3日で皆も出来るでしょというだけのお話だったのになぜか餌の話になっててワロタw
2019/02/13(水) 15:40:57.70ID:d5jEja6x0
Cのスレに書き込んでてかつ鶏飼育してるってすげー組み合わせ
2019/02/13(水) 15:43:10.55ID:q5+/i40P0
ここの人たちはマイコンで全自動の餌やり制御とか余裕で作ってそうだからなぁ
2019/02/13(水) 15:54:21.06ID:Q5DduoYTM
むしろ全自動鶏作ろう。
2019/02/13(水) 18:00:49.65ID:2WlGbphz0
まぁ、C言語のCはChickenの頭文字だからね。
2019/02/13(水) 18:16:41.77ID:i20vW39tM
ここでスベるとか…
2019/02/13(水) 18:19:31.10ID:q5+/i40P0
おじいさまたち、しっかりたのみますよ
127デフォルトの名無しさん (ワッチョイ 275f-3QuV)
垢版 |
2019/02/14(木) 00:55:10.36ID:eGYXBQeH0
>>124
「はじめてのC」
128デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/14(木) 07:24:34.92ID:J1vF692V0
鶏の雌雄判別機を作ったらまじで大儲けできる。
2019/02/14(木) 07:33:43.74ID:5EPJ06Po0
鶏ではなくてひよこの雌雄判別だろ
130デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/14(木) 07:42:05.06ID:J1vF692V0
玉子だったらなお良い。
2019/02/14(木) 07:45:47.66ID:MhXZGfUyd
それは機械学習の世界だからなpythonでやるべきだな
2019/02/14(木) 07:52:15.98ID:5EPJ06Po0
機械学習の段階に持っていく以前にどうやって特徴点を抽出するんだよ
2019/02/14(木) 08:01:05.34ID:bVlNWlBE0
>>130
レーザー使って卵のうちにてのはもうあるらしい
2019/02/14(木) 08:44:29.64ID:MhXZGfUyd
>>132
AIを信じろ、心を無にして写真を撮り続けるんだ。
135デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/14(木) 09:27:48.57ID:9tQDIG7ca
鶏のスレができたと聞いてゆっくり歩いてきました。
136デフォルトの名無しさん (ササクッテロル Sp7b-mDuQ)
垢版 |
2019/02/14(木) 12:09:08.34ID:EQjYAhePp
>>124
A、B、そしてC言語だ、アホw
2019/02/14(木) 12:31:22.40ID:eoj/2xbH0
B (programming language) が A programming language の流れを汲んでいるとは初耳だな
138デフォルトの名無しさん (ササクッテロル Sp7b-mDuQ)
垢版 |
2019/02/14(木) 12:35:11.20ID:EQjYAhePp
っAPL
2019/02/14(木) 16:09:27.74ID:7mjvw7zr0
Bは聞いたことがあるが、Aがあるのは初めて知ったw
140デフォルトの名無しさん (アウアウクー MM7b-3QuV)
垢版 |
2019/02/14(木) 17:42:21.71ID:WWAGjmY5M
>>128
ひよこの時点で選別されている。
2019/02/14(木) 17:54:09.12ID:5EPJ06Po0
ひよこ鑑定士
https://furikake.doda.jp/article/2018/09/10/90.html
2019/02/14(木) 17:55:33.11ID:dTIeIK2I0
まじかよプログラム書いてる場合じゃない
143デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/14(木) 19:22:48.32ID:Jtoe5svL0
雄のひよこの運命はマジでミンチ
2019/02/14(木) 20:04:09.42ID:lvuH5t8P0
ひよこ鑑定士の雌雄判定プログラムになるわ
145デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/14(木) 21:15:49.32ID:FnxMJF+Da
昔々小学生の頃に道で売ってたカラーひよこを買って、だいたいは一晩で死ぬわけだがその時は電球で暖めたり色々やったら生き長らえて成長し、立派な鶏に成長し、その後親戚に引き取られて行ったが、すぐに食われた。
2019/02/15(金) 09:35:49.46ID:PLZ5J6XD0
ヒヨちゃん、ミケ、チョビ
2019/02/16(土) 00:17:44.31ID:yq1cCgqT0
#include "A.h"
#include "B.h"

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

手作業でA.hないしはB.hから該当する関数を削除しないといけないかな?
2019/02/16(土) 00:26:14.00ID:BHwuOYP40
ヘッダーで関数を定義するのが悪いんじゃ
2019/02/16(土) 00:31:06.99ID:DIoBwVhC0
#pragma onceではダメですか?
そういう話ではない?
2019/02/16(土) 00:35:57.27ID:QGJnkP2m0
AB共にその関数使用でインクルードするソースが多数あるのであれば
どちらか一方は関数削除し代わりにもう片方をインクルード
2019/02/16(土) 00:57:35.72ID:BxPlGezW0
いや普通に二重で定義せずに名前変えろよ
2019/02/16(土) 01:15:06.97ID:P5gjDjW+0
うん、事情によらず同じ名前の関数定義があっちゃだめでしょ。
2019/02/16(土) 01:16:19.79ID:BHwuOYP40
そのヘッダーをインクルードするソースが複数あったら、
やはりリンク時に二重定義とならないか?
2019/02/16(土) 01:45:16.86ID:0XZqCZxyM
定義の意味が曖昧だけど自分ならヘッダーはプロトタイプ宣言だけなので関数定義そのものが
二重になることはまず無いな
*.cと*.hファイルの関数定義と宣言をきちんと区別していれば同一関数の二重定義なんて事態には
そうならないと思うんだが
2019/02/16(土) 03:04:51.53ID:yq1cCgqT0
int型の変数を文字列に変える
INT2STRって関数がバッティングしてる

便利な関数だからいろんなヘッダファイルに仕込んでるんだけど
そういうヘッダファイルを複数includeするとバッティングしちゃうんだよね
156デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/16(土) 04:31:59.37ID:0BUCSxrk0
バッティングする関数を別のヘッダーにする。
2019/02/16(土) 05:23:54.50ID:mG+jUdie0
関数宣言だけなら多重でも文句はいわれない
マクロやtypedefに構造体の衝突ならインクルードガード施してそれだけをヘッダーに
};
2019/02/16(土) 07:51:21.96ID:cXYf2t9G0
#ifdef
#ifndef
#endif

の出番?
2019/02/16(土) 08:25:13.37ID:VTuLU8k00
ライブラリのヘッダ見てマネればいいじゃん


#ifndef _STDIO_H
#define _STDIO_H 1
...
#endif
2019/02/16(土) 08:47:05.29ID:DIoBwVhC0
みなさんpragma onceじゃなくてifndef派なんですね
2019/02/16(土) 08:52:07.39ID:q1DAaOKG0
>>155
> INT2STRって関数がバッティングしてる
> 便利な関数だからいろんなヘッダファイルに仕込んでるんだけど
その関数を定義した"int2str.h"を作って
#pragma onceなり#ifndefなりでインクルードガードしておく
各ヘッダーファイルは"int2str.h"をインクルードすればいいだけ
2019/02/16(土) 09:05:18.00ID:P5gjDjW+0
>>155

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

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

ヘッダファイルの使い方も間違ってるような…
2019/02/16(土) 09:09:29.43ID:P5gjDjW+0
>>161
たぶんint2str.hはヘッダーファイルじゃなくて実装ファイルでインクルードすべき性質のものだよね。

細かいことかもしれないけど、ヘッダーファイルでインクルードすると他のファイルへの影響が増えるから、必要がない限りは実装ファイルの方でインクルードするべきだと思う。
2019/02/16(土) 09:19:18.44ID:mG+jUdie0
関数の実体をヘッダーにおいているのか
inline キーワードが使えるなら… という話かな?
2019/02/16(土) 09:40:04.81ID:suSnt5KvM
>>163
いやそんなことはみんなわかっててでも本人やりたいならこうすればいいよって言ってるだけだろ
2019/02/16(土) 09:59:46.09ID:t+1YRxqBa
これはみんなボケてるの?
2019/02/16(土) 10:56:39.56ID:BHwuOYP40
ワザとだろう
2019/02/16(土) 10:58:48.72ID:yq1cCgqT0
ありがとう、みんなが背中押してくれたから決心が付いた(`・ω・´)

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

#ifndef _INT2STR_H
#define _INT2STR_H
...
#endif

でくくって多重定義を防ぐ(`・ω・´)b
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が出力されるんですけどなぜですか?
2019/02/16(土) 13:46:58.56ID:3/SZoFmmd
>>169
一応手元で試したらちゃんと2がでたよ。
printfでなくてmain関数の結果を表示してるとか?
2019/02/16(土) 13:49:29.31ID:BHwuOYP40
>>169
defalut:
2019/02/16(土) 14:04:34.91ID:WseEcsSPM
defaultがラベルになる?switch の中に return だけになるのか?switch 素通りして関数の最後に return 無いけど return 0 になるのか?これコンパイルとおるの?
少なくともコンパイル警告は出るはずだから、素人は警告無視すんな
2019/02/16(土) 14:11:52.03ID:BHwuOYP40
ラベルは、警告出ないだろう
これ昔ハマったことあるw
2019/02/16(土) 14:29:47.26ID:z2OC1C8Ix
あー、これね。
これそのものじゃないけどcaseを書き忘れて同じようにハマった経験あるわ。
2019/02/16(土) 14:34:18.78ID:h+JOL/Xg0
初心者なんですけどファイルをfopenで開いてからcloseせずに別のモードでまたfopenするのは問題ありですか?
176デフォルトの名無しさん (ワッチョイ bf02-yQ/S)
垢版 |
2019/02/16(土) 14:41:10.94ID:FAU3Sbcr0
>>169
コピペして実行してみたがこちらでは 4195622 が出力されたw

gcc -Wall でコンパイルしてみると「ラベル ‘defalut’ が定義されていますが使用されていません」が出る。
綴り間違いだな。l と u が入れ違いになっている。
2019/02/16(土) 14:58:25.69ID:GySit7mC0
ありがとうございました!
綴が違っていたことに気づきませんでした!
2019/02/16(土) 15:18:12.53ID:jgcdGKnj0
なるほど -Wreturn-type とか -Wall つけないと int 型の関数に return が無くても警告出ないのか
2019/02/16(土) 15:31:05.97ID:3/SZoFmmd
>>170
コピペせずに手打ちでやったから "defalut" に気づかなかった。。
180デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/16(土) 15:42:31.02ID:GG6HVTci0
バグの大半は手書き
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()が成功する(場合もある)か、常に失敗するかも「処理系定義」だし。
2019/02/16(土) 18:01:42.08ID:OrPj8CII0
>>159,168 予約識別子はやめとこう。
2019/02/16(土) 19:51:50.72ID:h+JOL/Xg0
>>181
詳しい説明ありがとうございます
2019/02/17(日) 08:39:19.73ID:uUoaBuH/0
んじゃこうだな

#ifndef STDIO_H_
#define STDIO_H_ 1
...
#endif
2019/02/19(火) 10:01:13.72ID:IvpU5OFea
おまいらならFEのC言語問題余裕の全問正解なわけ?10分もかからんくらい?
2019/02/19(火) 10:15:05.54ID:+p6oUoec0
少し古いが第一種情報とエンベデッドスペシャリスト程度はクリアしてる
即答クイズじゃないんだから時間気にするのは間抜けだぞ
187デフォルトの名無しさん (ワッチョイ 275f-3QuV)
垢版 |
2019/02/19(火) 17:04:59.95ID:uTkGj35D0
>>185
ああいう問題は実務では存在しないから簡単ではないよ。
2019/02/19(火) 18:44:17.22ID:BOKvhiPA0
マジで言い訳でもなんでもなく
業務のときと使う脳味噌が全然 違う。
普段 ファイルを単純に移動させるにも 外環境からどういう邪魔が入りうるか
プール単位で跨ぐときどういうセキュリティーホールがあるか
とかいうことを重箱の隅をつつくように考えてるのに

条件分岐を一度も使わずに素数生成しろ みたいな問題が出てくるんだもん
しかも出/入力データの危険性は一切考えない、っていうパターンがほとんど。
2019/02/19(火) 18:54:53.10ID:BVj1SDNF0
>>188
>条件分岐を一度も使わずに素数生成しろ
おもしろい問題じゃないですか、三項演算子 OK ならできそうですね
2019/02/19(火) 18:56:33.83ID:+p6oUoec0
そういった類の具体的な問題対処能力を試してみたいのであればスペシャリスト系の過去問でも見てみれば?
エンベデッドかデータベース試験の午後の記述問題あたりがいいと思う
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html
2019/02/19(火) 19:25:12.60ID:rpeG63p80
情報処理試験は実務やってたらAPよりスペシャリストのほうが簡単だわ。
2019/02/20(水) 17:11:05.26ID:5682Vwfvx
「100以下の素数を表示するブログラムを作りなさい」
どんなプログラムを作るかで実務向きかどうかを判断できるらしい。
2019/02/20(水) 17:34:21.53ID:yWD0fIVX0
で、実務向きと判断される人はどういう風に回答するんだろうかw
2019/02/20(水) 17:56:41.12ID:V5JGZApS0
「100以下の素数を表示するブログラムを作りなさい」だと
手打ちの固定テーブル(初期化済み配列)って解答もありそうだな。

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

そもそもfor, whileや三項演算子は「条件分岐」じゃないのか?
みたいな疑問を感じ始めると答えられないね。
2019/02/20(水) 18:03:03.37ID:/pFWY/nZ0
単純に考えれば素数を漏れなく見つけるにはエラトステネスのふるいによるしかない
いかにして無駄な計算を避けるかが重要
プラグラム言語よりもいかに数学的素養の能力を身に着けているかが問われる
馬鹿正直に2から100までループを回すようならまったく実務には向いてない
整数論の基礎だけで100以下の判定に必要な要素は2,3,5,7だけであることはすぐにわかる
プログラムに落とし込む以前の問題
2019/02/20(水) 18:09:44.13ID:yWD0fIVX0
該当する素数一覧が埋め込まれた文字列を表示するプログラムが一番速そう
2019/02/20(水) 18:34:58.50ID:MxetRGgJd
俺は拡張性がちらついてエラトステネスにしたくなるわ。どれだけの実行速度が求められるのかわからないとどの方法でやるか決心がつかなくてタイムアップしそうw
2019/02/20(水) 18:48:50.68ID:WptMO45ba
>>192
問題の意図や目的を明示せずに解かせた答えだけみても、その人がどんな意図でその回答を出したのかは断定できないから、これだけで実務がどうこう言うのは短絡的だとは思うよ。
よくある性格診断とかで、○○を選んだあなたは××な性格です〜ってのがあるけど、解説を聞いてもまったく説得力のない決めつけがほとんどだし。それよりはいくぶんましだけど。
2019/02/20(水) 18:51:44.09ID:yWD0fIVX0
実務的には、「要求を満たし、簡潔にして高速で間違いがないこと」位かな
2019/02/20(水) 18:53:27.21ID:onU160B4F
>>199
いや拡張性をサッとそえとく心配りは必要だろ
2019/02/20(水) 18:55:22.57ID:MxetRGgJd
夜な夜な素数配列DBをどんどん作ってくれるプログラムと、素数配列DBから値を引っ張ってくれるプログラムの組み合わせでファイナルアンサーだ!
2019/02/20(水) 18:55:39.06ID:AQq/x/Ljd
3以上の素数は奇数であること。
n以下の素数を調べるときは、ルートn以下の約数を調べればいいこと。

整数論を勉強したなら、これくらいは知っておいて欲しい。
203デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/20(水) 19:05:39.41ID:agArr1lpa
>>199
組み込み用でメモリが非常に少ないマシン用のプログラムの場合もう一捻り必要。
204デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/20(水) 19:07:07.48ID:agArr1lpa
ま、いいや。うちに帰ってから俺が変なプログラム作ってみるよ。
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);
てな具合に論理演算子の短絡評価を使う手もあるか。


パズルとしては面白いけど、実用で何の意味があるのか、
金払って受験する資格試験の問題としてどうなのか、疑問だなぁ。
2019/02/20(水) 19:12:37.32ID:AQq/x/Ljd
素数の知識がなければ暗号解読やハッキングができないかも。
2019/02/20(水) 19:33:00.95ID:/pFWY/nZ0
この流れだと

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

とか言い出しそうだな
本質が分かってない
素数を高速に表示することが目的ではなく素数を少ない計算量で見つける事が本来の目的
2019/02/20(水) 19:46:25.77ID:V5JGZApS0
>>188 「条件分岐を一度も使わずに素数生成しろ」
>>192 「100以下の素数を表示するブログラムを作りなさい」

2つの問題に同時に応えてるコメントがあるみたいね。
「条件分岐を使わずに100以下の素数を表示するプログラム」てことで。
かく言う自分もそのクチなんだけど。
2019/02/20(水) 19:56:53.43ID:jAMIqMc60
>>207
そのアイディアに近いものはレインボーテーブルと呼ばれていて、すでに実用化されている。
2019/02/20(水) 20:08:03.07ID:/pFWY/nZ0
>>209
レインボーテーブルはハッシュの検索高速化のための技術だと認識してたけど、素数を利用した暗号鍵の
Decryptにも実用レベルで応用できるのか?
2019/02/20(水) 20:23:16.84ID:jAMIqMc60
一般的なコンピューターでは素数暗号の解読は困難だね。A5/1 Security Projectが進めばどうなるかわからないが。
2019/02/20(水) 20:25:26.46ID:jAMIqMc60
Windowsのユーザーアカウントくらいなら数日あれば。。。
213デフォルトの名無しさん (アウアウクー MM7b-3QuV)
垢版 |
2019/02/20(水) 20:27:13.73ID:EKI9LXSlM
>>192
「100以下の素数を表示するブログラムを作りなさい」

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


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

あえて聞きます、証明はどのようなものに?
2019/02/20(水) 20:33:15.91ID:P8vN2pc30
>>205
それは表示した数が、果たして素数かどうか、を示してはいませんよね
2019/02/20(水) 20:33:54.09ID:P8vN2pc30
>>206
RSA 暗号はもう古いです、今は elgamal 暗号がトレンドです
2019/02/20(水) 20:33:59.13ID:jAMIqMc60
>>215
「ある整数の倍数の存在が周期的であること」を利用すれば、メモリーを節約できる。
2019/02/20(水) 20:34:54.39ID:P8vN2pc30
>>207
>素数を少ない計算量で見つける事
個人的には、素数の原始根を求める方法が知りたいです、いまんところ力技で解くしかないかと
2019/02/20(水) 20:37:58.24ID:P8vN2pc30
>>219
たしかに 2 と 3 の公倍数である 6 をもとに
6n + 1, 6n + 5 だけをテーブルに載せる、とかは可能ですね
私はやったことがない、それはどうでもいいとして、これをコード化(coding-realized) したのも見たことがありません、いつか誰かやるだろうと思っていたんですが、なかなか表に表れませんね
2019/02/20(水) 20:44:12.93ID:jAMIqMc60
>>216
3以上の素数pが奇数でない、すなわち偶数であれば、偶数の定義より、pは2で割り切れるが、pに2以外の約数があれば素数でない。矛盾。□
2019/02/20(水) 20:48:00.19ID:ZC/ijL840
>>201
サーバー側ならこれが攻守最強だな。隙がねぇ……
2019/02/20(水) 20:56:41.09ID:jAMIqMc60
>>216
時間切れ。すまん。
2019/02/20(水) 20:59:36.97ID:P8vN2pc30
>>222
>pに2以外の約数があれば
ここがおかしい
2019/02/20(水) 21:00:10.59ID:jAMIqMc60
>>221
素数プログラミングの競技に参加してやってみれば?
2019/02/20(水) 21:01:27.72ID:jAMIqMc60
>>225
「約数2があれば」に訂正。
2019/02/20(水) 21:02:29.11ID:P8vN2pc30
>>227
うむ、それでいい感じですね
2019/02/20(水) 21:06:35.67ID:jAMIqMc60
倍数の周期性を使えばBuzzFizz問題の応用(多重化)でメモリーが節約できるはず。
2019/02/20(水) 21:10:58.63ID:jAMIqMc60
バッチ処理で素数生成するなら、途中から計算を再開できるようにしておくとよい。
2019/02/20(水) 21:12:34.79ID:jAMIqMc60
>>216
「素数生成 ルート」でWeb検索。
2019/02/20(水) 21:39:38.70ID:IdoLDUDuM
巨大な素数の一覧
https://ja.wikipedia.org/wiki/%E5%B7%A8%E5%A4%A7%E3%81%AA%E7%B4%A0%E6%95%B0%E3%81%AE%E4%B8%80%E8%A6%A7

1億桁を超える素数を発見すれば懸賞金が手に入るぞ
お前ら頑張れ
2019/02/20(水) 22:33:31.62ID:bRSP0nNv0
大学の授業でやってるがわけわからん
2019/02/21(木) 04:51:28.69ID:k7mDakXF0
「3以上の素数は偶数ではない」って、
「2以外の2の倍数は素数ではない」と言い換えられるよね。
対偶命題の真偽は等しい、ってことで。
「3以上」「2以外」の部分の処理がちょいと面倒かも知れんが。
素数の定義から自動的に成立する、トートロジーって気もする。

実用的には、チェックすべき対象が一気に半減するから
決して役に立たないつまらない事実とは言わないけど。
2019/02/21(木) 05:47:41.57ID:0ZBMuCH70
なぜ「nの倍数」のうち「2の倍数」だけを特別視するんだ?
2019/02/21(木) 06:56:30.22ID:k7mDakXF0
たぶん2の倍数に特別に「偶数」って名前がついてるから。

て言うか「2の倍数」を「偶数」と呼び替えるせいで
「3以上の素数は偶数ではない」がそれらしい命題に見える心理的効果。
2019/02/21(木) 07:07:07.36ID:0ZBMuCH70
じゃあ例えば3の倍数を俺数と呼ぶことにすれば
「5以上の素数は俺数ではない」がそれらしい命題に見えるわけか
2019/02/21(木) 09:23:02.63ID:hmZcoRew0
>>237
実際にそういう理屈で俺数をちゃんと名前つけて定義してた気がする
2019/02/21(木) 10:06:27.81ID:vm8j2cEaM
https://ja.wikipedia.org/wiki/%E5%9C%8F%E8%AB%96

集合論的な数学理論の構成では集合やその元に対して写像や関係を導入し、それらが満たすべき公理を列挙する。その公理を満たすような「構造」を持った個々の集合が理論の具体的な実現を示していて、それら一つ一つの実現に共通の性質が公理から演繹的に証明される。
2019/02/21(木) 10:43:14.10ID:hP/J64Xh0
10進数で扱ったときに下一桁だけで素数でないか判定できるし
2019/02/21(木) 11:52:49.43ID:TYXtdJfXM
https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E4%BD%93

一般には、素数は代数体の整数環の素元として定義される(そこでは反数などの同伴なものも素数に含まれる)。このため、有理整数環での素数は有理素数と呼ばれることもある。
自然数あるいは実数の中での素数の分布の様子は高度に非自明で、リーマン予想などの現代数学の重要な問題との興味深い結び付きが発見されている。
2019/02/21(木) 12:21:11.52ID:9bhJdGzC0
>>240
意味ないじゃん
下位一桁で素数か判定できるなら有り難いが
2019/02/21(木) 12:24:22.12ID:ZaAjcalq0
2の倍数は1個となりにあるけれど3の倍数は2個となりにあるわけじゃないからだろ
2019/02/21(木) 12:26:58.45ID:hP/J64Xh0
世界の半数の人間を一気に殺せるとしたら、スゴイ兵器だろう
2019/02/21(木) 12:45:09.74ID:AfMCgFa5H
もういいからいいかげんCの話しろよ
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 が素数ならば体が得られる。このような方法により、計算の記述は簡素化される。
2019/02/21(木) 13:04:43.82ID:SFQD6HMZx
やっぱり理系はみんな素数が好きなのねん
2019/02/21(木) 13:23:11.53ID:ZaAjcalq0
平方剰余の相互法則は奇数の素数でしかなりたたないから2は特別らしい
249デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 20:15:32.30ID:lsmx9sV60
ダメプログラマだらけだな。
2019/02/21(木) 20:25:59.92ID:m+qFL4AC0
プログラマ以前のただのC言語の評論家の集まりだからな
数学の素養どころか一般的な定番アルゴリズムすら理解しているのか怪しいのがいくらでもいる
251デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 20:29:14.38ID:lsmx9sV60
「100までの素数」は単にロジックが書けるかどうかの話で、素数の話ではないだろうに。
2019/02/21(木) 20:33:10.06ID:m+qFL4AC0
配列に数字を並べて表示するだけの処理の何処にロジックがあるのやら
あれではただのゴリ押しだ
2019/02/21(木) 20:52:13.17ID:S9yUyDkx0
誰かがこの問題から実務向きかどうかがわかる、なんて言うからいけない
2019/02/21(木) 21:00:34.34ID:3Jj6vI7vd
最近知ったことだが、clangとclang++には、-pedantic -Wallの他に-Weverythingというオプションがある。これを使えば最大限に警告してくれる。
255デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 21:25:46.65ID:lsmx9sV60
とりあえず、Cできない娘は受付時に言うとか、ホームページにわかるようにしてくれないとキツイ。
2019/02/21(木) 21:49:34.71ID:hP/J64Xh0
ロジックはアタマの中に
2019/02/22(金) 11:10:49.03ID:Wvys6/Wz0
>192
「オッケーグーグル、『100以下の素数を表示するブログラム』を端末にダウンロードして!」
258デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/22(金) 15:27:06.91ID:bcwEHSMYa
С言語
2019/02/22(金) 15:32:39.50ID:MGDdaAr30
偶素数と奇素数
2019/02/22(金) 21:00:52.74ID:JBg0shn90
C言語とか勉強じゃなくて仕事だったり動くもの作らないと覚えられないと思うんだけど
何をすることでC出来るようになったの?
2019/02/22(金) 21:11:58.58ID:FtBJuZ9s0
勉強だったとしても動くもの作り続ければだろうよ
262デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/22(金) 21:52:23.52ID:/efpuxREa
納期までに完成させないと大変な事になるというスリルとサスペンスが人間の能力を引き出すのです。
しかしこれは恐怖から逃れようとする行為なので恐怖がなくなる、または度胸がついてしまったらそこで終わりです。
2019/02/23(土) 16:48:48.66ID:RKMUv84W0
#defineじゃなくてconstすすめてくるやつは机上の空論だな
constつかったら最適ななしにするとswitchのラベルにつかえないじゃないか
2019/02/23(土) 17:14:59.00ID:7GKXwuwj0
>>263
C++ では const 変数を case ラベルに使えるから、混同してる人かも。
2019/02/23(土) 17:46:54.59ID:7GKXwuwj0
C なら「名前のついた整数」は enum だね。
スコープ効くし case のラベルにも配列定義の要素数の指定にも使える。
2019/02/23(土) 20:56:53.69ID:Ez7Plxd90
Cのenumはenum-baseがないから
どでかい定数には使えない
2019/02/23(土) 21:13:59.35ID:tyf/JAHu0
enumはあくまで値の大小は関係なくユニークな識別子であって、大きな値が問題になるような用途に使うのはいかがなものか。
2019/02/23(土) 21:41:02.60ID:W1FUX4jY0
プリミティブな定数以外のスイッチって
ものすごく気持ち悪いんだが

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

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


(権威主義に逃げ込む気はないと事前に言い訳した上で)
#define のマクロ値の代わりに enum の値を使うってのは、
カーニハンとパイクの『プログラミング作法』第1章、
「1.5 マジックナンバー」で紹介されてることを付記しておく。
2019/02/24(日) 08:31:42.99ID:fxLM3JpE0
enum
{
a = 4294967297
};

int main()
{
printf("%d\n", sizeof a);
printf("%llx\n", a);
}

gcc:
8
100000001

cl:
4
1

どっちが正しい?
とりあえずはコケるほうに合わせるが
2019/02/24(日) 08:40:26.06ID:7CaxIYof0
以前に組込み用途の8bitマイコン用C言語を使っていた時の話
CPUの機能的にint型は8bitだった
ところが多条件の分岐処理でif-elseを使った時よりenum変数のswitch文使った方が明らかにパフォーマンスが
低下して問題になったことがあった
訳が分からず逆アセンブルして調べてみるとenum変数は何故か16bitに展開されていて条件判定毎に型変換が
発生していたことが原因だっということがあった、という昔の思い出
2019/02/24(日) 13:48:01.77ID:gUJTdPsI0
>>271
int が 8bit という時点で仕様に反しているので
整数演算のいろんなところで暗黙に int に変換してから
計算する C のルールが破綻するんじゃなかろうか。

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

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

(余談だが C++ では列挙定数の型は列挙型なので、 C とは少し解釈が違う。)
2019/02/24(日) 14:05:53.36ID:yQAH7TUL0
>>273
気持ちとしては賛成したいんだが
残念なことにISO/IEC9899 5.2.4.2.1 Sizes of integer types <limits.h>に、
INT_MAX +32767と書いてあるんだ
腹立たしいクソ規定だがそうなっている
2019/02/24(日) 14:15:23.84ID:gUJTdPsI0
>>273
ビット数という形ではないが、
limits.h で定義される各整数型が表現可能な数値の範囲を表すマクロ
についての最低限度の値という形で間接的に定義されている。
C99 だと 5.2.4.2.1 にある。
int は実質的に 16bit は必要。
2019/02/24(日) 15:01:36.58ID:eMMK67XW0
整数型をワードより大きくしなきゃいけない
なんてなったら使い物にならんよな
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までの任意の値を含むに十分大きい)サイズをもつ。
2019/02/24(日) 16:36:11.63ID:BJ3WFlaM0
>>271
そのせいで組み込みでswitch使うな伝説が発生したんだな
逆に16ビット以上なら使っても問題ないということか
2019/02/24(日) 16:49:38.07ID:7CaxIYof0
言語規格そのものというより標準ライブラリの都合というかヘッダーの仕様だけのような気がするけど
limit.hで最大値と最小値を規定するのであれば-128と127を宣言すればintの範囲を変更した実装も可能ではあるな
厳密には問題があるかも知れないけどC99準拠の実装と言うことでお茶を濁している処理系はあり得そうだ
281デフォルトの名無しさん (アウアウウー Sa21-sU2d)
垢版 |
2019/02/24(日) 19:23:23.70ID:iK4D+UQia
>>279
組み込み市場的に8ー16bitが主流だけどな。
2019/02/24(日) 22:09:42.91ID:8/luM3Zk0
一時期、組み込みもLinuxに席巻されそうになったこともあるけど昨今のIoTブームで16bit以下の超省電力が復権してきたイメージあるわ。
2019/02/24(日) 22:14:44.36ID:uaNZoE2Ca
でもそういう機器ってメモリの読み書きしかすることねえもんな。
あんまりおもろない。
2019/02/24(日) 22:24:41.13ID:7CaxIYof0
組み込みではLinuxどころかOSすら搭載してないシステムも多いよ
ネット家電なんかの一部を除けばエアコン、冷蔵庫、洗濯機など家電製品の殆どはOSもファイルシステムもネットワークスタックも無縁のスタンドアローン動作
電源投入リセット後ひたすら処理ループを回すだけ
CPUコアは8bitか16bitでRAMは数KB、ROMは数十KB程度のワンチップマイコン
2019/02/24(日) 22:29:53.46ID:7CaxIYof0
メモリの読み書きよりもIOポートを制御するのがメインの仕事
2019/02/24(日) 22:33:57.82ID:2wDVhIfR0
殆ど電卓だな
2019/02/24(日) 22:41:13.06ID:7CaxIYof0
電卓ほど単純ではないけどね
まともにフィードバック制御を実装するにはそれなりの演算負荷は掛かる
センサー入力に応じて出力を迅速安定に目標に追従させるには裏では予測判断も必要
マイコン使っている以上は単調なON/OFF制御では無いよ
2019/02/24(日) 22:49:58.22ID:gSQz1x8q0
欲深い人間のことだからどうせすぐいろんなことをさせたくなる
2019/02/24(日) 23:23:28.26ID:wTcw/8fo0
IoTなら制御はサーバー側じゃないの?
2019/02/24(日) 23:28:06.97ID:2wDVhIfR0
Fog computing がキーワードだそうだ
2019/02/25(月) 00:12:03.18ID:dk4D1NQWa
IOポート制御とメモリ読み書きの違いがわからない
2019/02/25(月) 00:27:51.25ID:LzC1voP10
メモリーバスが I/O につながってることもあるしな。
2019/02/25(月) 06:19:38.59ID:/Zb+jKgT0
>>291
IOポートを弄るにはそれぞれのSFR(特殊機能レジスタ)を操作する
一般的なメモリマップトIO方式ではSFRはCPUの特定のアドレス空間にマッピングされてる
Cプログラムからはそのアドレス空間をそれぞれ適当な変数に割り当てて基本的にはビット操作で制御する
SFRのイメージが分からなければ適当なマイコンのデータシートでも見てみるとある程度は分かると思うよ
参考として電子工作で有名なPICマイコンのサイト貼っておくので見てみるといいよ
2019/02/25(月) 06:22:12.63ID:/Zb+jKgT0
ごめん
リンク貼り忘れた
https://www.microchip.co.jp/download/index.php
2019/02/25(月) 07:08:32.40ID:YApQAEs00
>>274
だな
あのあとgcc -pedanticとやってみたら
ちゃんと警告出たわ
2019/02/25(月) 07:37:13.02ID:p9N2Idf00
組み込みマイコンでI/O空間がx86みたいに別なマイコンってあるかな
2019/02/25(月) 07:40:18.98ID:dk4D1NQWa
>>293
だから、区別ないじゃん
2019/02/25(月) 07:52:33.64ID:/Zb+jKgT0
メモリ(RAM)に割り当てられた変数は演算とその結果に意味がある
IO(SFR)に割り当てられた変数はビットのR/W操作そのものに意味がある
SFR変数上で演算操作を行うとほぼ確実に誤動作、暴走する
2019/02/25(月) 07:58:55.56ID:51Y60IO10
>>297
I/Oポートの挙動はメモリと同じとは限らない
書き込みと読み出しが別のものに繋がっていることもある
volatileは本来このためにある
2019/02/25(月) 08:52:03.76ID:OZaxYFd40
本当か?
揮発性だぞ
2019/02/25(月) 08:52:04.55ID:QDSDQN71x
>>296
あるよ。AVRはメモリマップされたIO空間にin/out命令で効率的にアクセスできる。
2019/02/25(月) 10:42:31.86ID:KHsK1sBo0
>>299
READアクセスでSR、WRITEアクセスでCRというケースは珍しくないが
なんで突然volatileが出てくるんだ? 全然関係ないぞ
2019/02/25(月) 11:12:53.53ID:/Zb+jKgT0
Read動作を確実に実行するためだろう
プログラム上はSFR変数からダミー変数への代入にしか見えないので何の演算にも関与しないと判断されて
コンパイル時の最適化で処理が削除される恐れがある
SFR変数はvolatile宣言しておくのが普通
2019/02/25(月) 11:41:24.89ID:KHsK1sBo0
それはREADの回数やタイミングの話だろ
READとWRITEで対象が異なる場合があることと何の関係があるんだよ
2019/02/25(月) 11:52:53.97ID:/Zb+jKgT0
そこに拘っていたのか
てっきりメモリとIOによる変数の扱いの注意点のことかと思っていたわ
2019/02/25(月) 11:58:40.63ID:QDSDQN71x
volatileなしだと、同じsfrにwriteした直後にreadすると最適化により実際にはreadされないことがある。
2019/02/25(月) 12:03:53.38ID:s/jxdMxMa
メモリとIOは違うっていっても、要は裏でなんかやってるだけだし。
だからvolatileなんて話も出てくる。
2019/02/25(月) 12:15:38.73ID:KHsK1sBo0
>>305
他に何に拘っていると言うんだ?

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

答えるか撤回かどうなんだ
2019/02/25(月) 12:41:00.22ID:QDSDQN71x
>>308
>>306
2019/02/25(月) 12:44:45.62ID:KHsK1sBo0
>>309
306は話のすり替えだ
READの回数やタイミングの話なんかしていない
READとWRITEの対象が違うということについてだ
volatileと何の関係があるのか
ただの言い間違えか
どっちだ?
2019/02/25(月) 12:48:10.76ID:QDSDQN71x
>>310
CRにwriteした直後に同じアドレスのSRをreadした時に最適化され、write値がそのままread値に使われるのをvolatileなしでどうやって回避するのん?
2019/02/25(月) 12:49:09.15ID:y5m/9TYHM
>>308
横からだけど>>305の2行目ぐらい読んでやれよ
それとも俺様に謝らないと許せないってか? w
2019/02/25(月) 12:53:40.05ID:/Zb+jKgT0
>>308
知らんがな、>>299本人に聞けよ
一般に言えることはメモリ上の変数の場合は読み込みと書き込みの間には必ず何らかの関連性を持っている
意味もなく読み込みや書き込みを行うことはなくその値は必ず何処かで利用される
利用されなければ変数もろとも普通は最適化で削除される
SFRの変数の場合はRead/Writeその操作の行為そのものが目的であってその結果その値がどうなろうが値そのものには何の意味もない
コンパイラにそのことを明示的に指示する方法がvolatileということ
2019/02/25(月) 12:57:22.86ID:P8ZqxZ/40
こうして見るとやはりC言語は組み込み屋専門ということか
話が難しすぎてついていけねえw
2019/02/25(月) 12:59:43.43ID:KHsK1sBo0
>>311
という説明ができるの、あんただけみたいだな
頓珍漢なレスばっかでイラついてたわ
2019/02/25(月) 13:15:23.23ID:QDSDQN71x
>>314
全然難しくはないし、組み込みに限った話じゃないよ。
ただ単に「今見えている処理とは別のとこからそのアドレスの値が更新される可能性があるので最適化しちゃダメよ」ってのを明示的に示すためのvolatileなので。
C#やJavaとかでもスレッドをまたいで不用意にアクセスする変数はvolatileつけないとバグるし。
2019/02/25(月) 13:16:39.48ID:X/kVtIsHa
組込専門、みたいなひとって抽象的な話のできないクソ多いよ。
コードもクソが多い。sleepせずにビジーウェイト使うタイプ。
2019/02/25(月) 13:17:16.26ID:/Zb+jKgT0
横レスだけどWrite属性のSFRの値(この場合CR)をReadしても値は不定だけどね
同一アドレスにマッピングされているRead属性のSFRの値(SR)の値が返ってきて変数に代入されているだけ
普通はWrite属性のSFRの状態を記憶する必要があればバッファ変数に内容を保存しておく
2019/02/25(月) 13:49:48.67ID:KHsK1sBo0
write属性なんて用語あったっけ
ゲートだけ出てるのはREでデコード
トーテムポールになってるのをWEでデコード
というのは属性か?
2019/02/25(月) 14:03:17.60ID:/Zb+jKgT0
Read/Write属性というのはあるよ
むしろその方が多い
ただ前レスに出てきたCR(コントロールレジスタ)とSR(ステータスレジスタ)は意図的にその名称通りにWriteまたはRead専用属性の例として
提示してきたんだろ、多分
2019/02/25(月) 14:20:45.00ID:KHsK1sBo0
いやーないだろ
ゲートが出てるだけのユニットにWRITEサイクルを実行なんてしねえし
2019/02/25(月) 14:31:07.16ID:/Zb+jKgT0
すまん
書き込みの意図がいまいちよく分からんのだけど出力形式の切り替えの話か?
オープンコレクタ出力とトーテムポール出力の切り替えか?
というかこの文脈でデコードの意味が分からん、何のこと?
2019/02/25(月) 14:45:57.95ID:P9mrobVPa
キモい奴だなおい
2019/02/25(月) 14:54:09.36ID:ruBOF67JM
誰かわかる奴いるのか?
俺も>>319は意味わからん
2019/02/25(月) 15:17:20.76ID:80dSpUWIM
何となくだけど入出力兼用ポートの設定か?
2019/02/25(月) 17:25:52.43ID:8PqGNbvAd
volatileの話が本筋と関係ないなら適当に流して先に進めばよかったんだよ。
それなのに噛みついて話を爆発させてしまったところにコミュニケーション能力の欠如を感じる。
2019/02/25(月) 17:28:47.58ID:t1ehA5N1M
このスレはC言語という話題を通じてマウント取り合うスレなので、今日も平和に通常運転。
2019/02/25(月) 18:07:46.57ID:Gp/kzS5R0
ゲートが出てるのがオープンコレクタとかもう
そのうち電圧が流れるとか言い出しそうな勢いだな
2019/02/25(月) 18:39:15.96ID:HIs9VhePM
volatileまではまだ分かる
ゲートやトーテムポールやデコードの単語の羅列は意味不明
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する話だと思う
ゲートとトーテムポールはよくわからん
2019/02/25(月) 20:16:10.80ID:UvFSeIeRM
>>330
そういうことか
マイコン内蔵デバイスの話ではなくてガチのハードウェア回路設計のアドレスデコードとコントロール信号の話か
唐突過ぎて訳が分からなかった
2019/02/25(月) 20:28:08.49ID:QIf4DqH5M
ReadやWriteではなくて入力信号と出力信号だな
2019/02/25(月) 20:33:09.01ID:8ylBAHsD0
内部or外部CPUバスのことを言ってるにしても、Write onlyがないってとこに繋がらない。
やっぱ解読不可だわ。
2019/02/25(月) 20:33:17.49ID:MFA8pp4Y0
そういえばread-modify-writeっのを思い出したな
もう10年以上前の事だが
2019/02/25(月) 20:50:44.04ID:QIf4DqH5M
懐かしい話題だな
わざわざラッチ回路を設けて問題回避したりしていたな
2019/02/26(火) 06:45:38.56ID:H5mf7PMC0
>>330
ちょっと亀レス気味だけど、確かに属性というのは一般的ではなかったかな
当時使っていたCコンパイラでは同一アドレスにマッピングされたRead OnlyとWrite OnlyのSFR変数は
共用体unionで宣言するのだけど、それぞれが読み込み/書き込み専用の変数名であることを明示するために
プリプロセッサの#pragmaでいわゆる属性(R, W, R/W)を宣言することが出来た
Read属性変数に代入操作を行なったりするとコンパイル時に警告されるような仕組みになってた
2019/02/26(火) 07:46:54.76ID:25yR6Zgwx
write属性レジスタってのは確かに一般的ではないけど、かといって用語としてwrite専用レジスタじゃないといけないって明確なルールもないだろうし、仕様書書いてるわけじゃないので別に雰囲気で伝わるから気にしなくていいんじゃない?
2019/02/26(火) 08:50:06.80ID:Dl2cSn2NM
一般的な用語じゃないとそこにどんな機能が含まれてるかわからんからな
>>336見りゃわかると思うがそもそもレジスタの機能ですらなかったわけだし
2019/02/26(火) 09:19:26.09ID:8U12byKKM
議論の流れで大体わかるけどな
さすがにプログラム言語やマイコンの話の中でいきなり回路設計の話が出てきた時は
しばらく話について行けなかったが
2019/02/26(火) 12:28:24.64ID:Dl2cSn2NM
>>339
お前はわかるのかも知れんが>>319みたいにちゃんと確認しようとする奴もいる
そもそも一般的で無い用語を使う理由もないだろ
2019/02/26(火) 12:41:52.52ID:25yR6Zgwx
これぐらいのことが話の流れで推測できないなんて、生き辛そう。
お大事に。
2019/02/26(火) 12:49:02.64ID:7/JIXwXVM
>>317で指摘されているけど抽象的な話のできない人というのは確かにいるからな
2019/02/26(火) 13:31:09.42ID:H5mf7PMC0
確かに昔からハードウェア弄ってきた純粋の組込み専門屋にとって、周辺デバイスの制御レジスタをSFR変数として抽象化して捉えることが出来ないとは思ってもなかった
一般的ではなくても属性で話は通じると思ってたんだけどなあ
というか本当にC言語で開発してるのだろうか?
344デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/26(火) 13:45:18.64ID:hfhf4rvY0
「出来ないとは思ってもなかった」

否定の否定表現でわかりにくい。
2019/02/26(火) 14:19:05.67ID:QncW9pKQH
SFRって特定アーキテクチャの特殊用語じゃん。何勝手に一般化してるん。
2019/02/26(火) 14:38:19.53ID:WUqkAqLeM
ワンチップマイコン使ったことが無いのなら口を挟まないほうがいいよ
どこの製品でもSFRで話は通じる
2019/02/26(火) 14:46:05.57ID:qT2RVqJL0
分かったからワンチップマイコンは別の所でやれ
2019/02/26(火) 14:55:37.46ID:4VLeDBYTd
もしかして組み込み以外の話は
【初心者歓迎】C/C++室 Ver.104【環境依存OK】
で聞いた方がいいのか?
2019/02/26(火) 15:07:48.55ID:qT2RVqJL0
C言語の一般的な話題を扱うスレなんだから
特定の人間を排除するような発言をするのはおかしいだろう
そういう特定の話題をしたいならスレを立ててすればいい
ワンチップマイコンは専用スレ立ててそこでやれと言う話
2019/02/26(火) 15:14:00.56ID:XovqVjcQM
今や純粋なC言語の所理系は初心者の学習用途か組込み開発用途くらいでしか使われていない
スレに組込み開発経験者が集まるのは自然な流れ
2019/02/26(火) 15:18:02.00ID:XovqVjcQM
どちらかといえばC言語学習者は高圧的で排他的な気はする
2019/02/26(火) 15:29:48.44ID:qT2RVqJL0
集まるのは良いが、「黙ってろ」はないな
2019/02/26(火) 15:45:14.31ID:vHMOYNHiM
妥当な発言なら問題ないんだけどね
挑発的な発言が目に余るので煽り発言は控えたほうがいいと言ってるだけ
2019/02/26(火) 15:46:01.71ID:qT2RVqJL0
そういう発言自体が荒らしになるとは思わないのか
2019/02/26(火) 15:48:03.09ID:qT2RVqJL0
そもそもワンチップマイコンの知識は
C言語の話題をやり取りする上で必須ではないだろう
そういう話題を話したいなら専用スレを立てろと言っている
2019/02/26(火) 15:48:26.91ID:vHMOYNHiM
人にとやかく言う前に自分の発言見直して見れば?
2019/02/26(火) 16:10:12.93ID:lxe9rt7zM
相変わらずみんな仲いいな。
今日も平和に通常運転。
358デフォルトの名無しさん (アウアウウー Sa21-rusg)
垢版 |
2019/02/26(火) 17:43:39.42ID:k06atLuFa
みんな愛し合っているのさ
2019/02/26(火) 18:00:07.68ID:4VLeDBYTd
現実から目をそらすな。明らかに仲悪そうだぞ。
2019/02/26(火) 18:03:23.92ID:UtNGjYRh0
大嫌い 大嫌い 大嫌い 大好き☆
361デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/26(火) 18:35:04.99ID:c2o2e7e/a
>>359
つんでれ
362デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/26(火) 19:43:38.47ID:hfhf4rvY0
>>346
それ単にプログラム内のルールにすぎない。どんな言語であれ、入れ物を使い分けを限定することで、プログラマのミス防止や可読性、保守性が高まるのは、まともなプログラマなら必ずやっている。

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

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

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

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

これがアーキテクチャがこうだから、こういう発想になるというのは順番が逆。
2019/02/26(火) 19:57:57.62ID:Dl2cSn2NM
普通に一般化してる用語で話せばいいのになぜかオレオレ用語使って指摘されたらわからないのかとか逆ギレw
なんとなくはわかってもそのローカル用語が意図してるものと自分が思ってるものが同じかどうかはわからんから指摘してるのに…
まともなエンジニアじゃないんだろうな
365デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/26(火) 20:20:38.82ID:c2o2e7e/a
長文が溢れるスレ
2019/02/26(火) 20:45:40.56ID:rW40iFORM
知識や能力の不足に対する自己防衛反応みたいなものだから流し読みしてればいい
2019/02/26(火) 21:45:18.69ID:7TQlJfaY0
>>366
>>353, >>356
2019/02/27(水) 12:00:03.35ID:wHsSBDML0
具体例なしで一般論しか言わないやつは信用できない
特徴は具体的な質問されると話をそらすか黙り込むやつ
369デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/27(水) 12:55:17.62ID:1o6M4rIDa
そんな一般論だけ書かれても・・・
2019/02/27(水) 17:52:20.13ID:n00Gq01P0
>>346
あ? ベアメタル系のプロだが
おまえみたいな手合いがSFRとかどういう意味で言ってるのかは警戒するぞ
2019/02/27(水) 18:37:51.02ID:OX9NrkAd0
ベアメタル系のプロの意味がよく分からないけどC言語と何か関係あるの?
372デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/27(水) 21:26:14.35ID:1o6M4rIDa
Bare ボーン
まゆげボーン
2019/02/27(水) 22:06:45.86ID:n00Gq01P0
貴様が知る必要はない
2019/02/27(水) 23:34:44.12ID:OqYQPgaeM
大体何と勘違いしたのか予測はつくがおそらく間違ってるぞ
少なくともx86系では通用しない
2019/02/28(木) 08:01:20.41ID:7nNuTdUM0
だから具体例を書けよ
2019/03/01(金) 15:17:20.50ID:ixp8onlm0
すみません、初心者なんですが図書館にプログラミング言語Cという本があったので借りてきて勉強中です。
p105のコード
nはint

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

なんで割り算自体を条件に出来るのですか。
2019/03/01(金) 15:19:35.58ID:24bVz3/E0
出来るかどうかは自分で試した方がいい
その上で、なんでそうなるかを考え、
分からないときに聞きにおいで
2019/03/01(金) 15:20:45.58ID:7MuZNvWwd
>>376
わり算の結果(この場合は整数)がゼロじゃなかったら論理値の真(true)と見なされる。
379デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 15:23:30.96ID:ber2ILYja
>>376
C言語のifは0か0以外かしか見ていないため。
2019/03/01(金) 15:38:09.31ID:ixp8onlm0
>>378 >>378
ありがとうございます、==とか>とかでの比較しか頭になかったんですけど、ifは0かどうかだけなんですね。
2019/03/01(金) 15:53:16.08ID:nQNJhNQvd
他の言語でいえば
1:true
0:false
って感じですな
2019/03/01(金) 15:54:07.94ID:nQNJhNQvd
>>381
この表現は語弊があるので忘れてください、すみません
2019/03/01(金) 16:01:43.78ID:yZJ4Zkhu0
>>376
こういうように条件文に、実質的なbool 値以外を書いたら、ダメ!

MISRA-C みたいな、安全なコーディング規則があって、禁止事項になってるから、
普通のプログラマーは、変に思うはず
2019/03/01(金) 16:53:12.47ID:omZ6F1i00
他の言語ならともかくC言語プログラマ的には普通だな
2019/03/01(金) 16:59:37.54ID:wVb5PmwP0
説教くせえことを書くならてめーの言葉遣いくらい気をつけろ
boolじゃねえだろ_Boolだ
MISRA-Cが安全だなんて決まりはどこにもねえぞ
コーディング基準はそれを守りさえすれば安全だなんて信じているようだが自分の頭で考えることを放棄した手合いか?
少なくともそういうカスはPGとして普通未満だぜ
386デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 17:32:32.07ID:ber2ILYja
>>380
そう。比較する演算子を使うとその結果が0または1になるので他の言語でのifと同じようにも使える。
2019/03/01(金) 17:49:40.28ID:lMpRUADOa
boolも予約語だと思うよ。ただの別名だけど。
2019/03/01(金) 18:05:13.76ID:wVb5PmwP0
ISO/IEC 9899:2011 7.18 Boolean type and values <stdbool.h> には
マクロと書いてあるが、どこかに予約語と書いてあるのか?
ISO/IEC 9899:2011 6.4.1 Keywords にはねえぞ
2019/03/01(金) 18:07:32.60ID:OVLCgqzva
まあboolでもいいってことだな
2019/03/01(金) 18:17:05.43ID:wVb5PmwP0
話そらすな
boolは予約語か違うのか
2019/03/01(金) 18:24:56.22ID:nQNJhNQvd
>MISRA-Cが安全だなんて決まりはどこにもねえぞ
>コーディング基準はそれを守りさえすれば安全だなんて信じているようだが自分の頭で考えることを放棄した手合いか?
>少なくともそういうカスはPGとして普通未満だぜ

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

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

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

MISRA-C 無しのC 言語は使ってはならないと、決まっている!
393デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 18:32:42.09ID:ber2ILYja
昔々、int bool = 0; と書いてあって普通に変数として bool が使われている夫馬ログラムを見た事がある。
2019/03/01(金) 18:33:26.36ID:5vu7ZTEs0
昔はintの別名でマクロ定義してたな
今は予約語だったのか
395デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/01(金) 18:33:54.49ID:ber2ILYja
夫馬ってなんやねんw
スマホでの打ち間違いは候補間違いもあるからより変な風になるなあ。
2019/03/01(金) 18:37:31.49ID:V2sWjbOV0
boolが予約語というのは聞いたことない。
<stdint.h>で使えるのは知ってるけど。
2019/03/01(金) 18:37:42.66ID:wVb5PmwP0
>>392
決まってねえよ
嘘書くんじゃねえ
2019/03/01(金) 18:38:42.45ID:wVb5PmwP0
>>391
ほう論点が2つあるのをおまえの脳内では話がそれたと言うのか
2019/03/01(金) 18:40:37.97ID:V2sWjbOV0
https://www.wdic.org/w/TECH/_Bool
2019/03/01(金) 18:41:18.61ID:nQNJhNQvd
>>398
いやすまん、boolについては論点にしてないと勘違いしていた。
2019/03/01(金) 18:42:35.19ID:V2sWjbOV0
<stdbool.h>の間違いだった。すまぬ。
2019/03/01(金) 18:44:20.24ID:nQNJhNQvd
またひとつ勉強になったよ
2019/03/01(金) 18:47:58.98ID:corsBm1i0
やっぱり相変わらずみんな仲いいな。
今日も平和に通常運転。
2019/03/01(金) 19:14:14.07ID:HVxvwZsK0
>>376
>if(n / 10)
は if(n / 10 != 0)
に読み替えてください
2019/03/01(金) 19:15:03.21ID:HVxvwZsK0
>>383
MISRA-C は馬鹿が使うものと聞いていますので、あなたも馬鹿の一人なんですね
2019/03/01(金) 19:16:07.43ID:HVxvwZsK0
>>385
C99 の _Bool はいろいろと残念な仕様なので、そんなものを使っていたら馬鹿呼ばわりされてもしかたがないと思います…
2019/03/01(金) 19:16:49.73ID:HVxvwZsK0
>>392
その「実質的」という単語の定義を教えていただけませんか?
2019/03/01(金) 19:18:02.41ID:corsBm1i0
>>404
いやーそこはちゃんとカッコをつけて
if((n / 10) != 0)
じゃないとMISRA通らないだろー。
と煽ってみる。
2019/03/01(金) 19:18:18.17ID:HVxvwZsK0
>>394
C の予約語に asm が存在したことがあっても、bool なんて金輪際ございません…
2019/03/01(金) 19:19:07.26ID:HVxvwZsK0
>>408
なんだか misra っていろいろうるさいですね…馬鹿が使うものの典型と理解しました
2019/03/01(金) 19:20:44.13ID:wVb5PmwP0
>>406
俺もそう思う
2019/03/01(金) 19:21:00.10ID:corsBm1i0
>>410
そのとーり。
MISRAはfool proofのための規格だよね。
あんなもん、クソの役にも立たんわ。
2019/03/01(金) 19:24:31.92ID:WfqePbUuM
>>392
Rubyガイジ死ねよ
2019/03/01(金) 19:26:29.24ID:omZ6F1i00
実際の開発現場ではMISRA-Cも_Boolも頭の片隅に意識する(人がいる)程度であまり意味はない
そんなことより他に考えることはいくらでもある
2019/03/01(金) 19:28:21.64ID:HVxvwZsK0
>>411
久々に私の意見に賛成する人がおられましたね…
2019/03/01(金) 19:56:06.23ID:yZJ4Zkhu0
essentially Boolean (実質的なブール型)

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

if (hoge==TRUE)

このhoge が、実質的にはブール値なら、if (hoge) と書いてもOK
417デフォルトの名無しさん (アウアウクー MM0b-tQZn)
垢版 |
2019/03/01(金) 19:56:10.11ID:f15qqb/AM
>>404
そういう例はやめた方がいい。二度、評価することをおかしく感じなくなる。
2019/03/01(金) 19:59:51.05ID:HVxvwZsK0
>>417
マクロ関係ではないから、二度評価問題は関係ないのでは?もう少し詳しく教えていただけますか?
2019/03/01(金) 20:02:55.75ID:yZJ4Zkhu0
2値しか取らない、真偽値という概念を作り出して、単純な数値と区別している

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

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

hoge を2値しか取らず、実質的には真偽値として扱っているなら、そう書いてもよい
422デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:17:31.73ID:zSE4SpXO0
>>19
なに時代だよ、trueとfalseだろ
423デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:18:43.90ID:zSE4SpXO0
>>376
そう書くなよ
条件文でかけ
424デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:20:05.53ID:zSE4SpXO0
>>382
というよりtrueとfalseを使えよ
425デフォルトの名無しさん (ワッチョイ 37b3-tPEd)
垢版 |
2019/03/01(金) 20:21:09.40ID:zSE4SpXO0
>>385
bool だよ
2019/03/01(金) 20:59:57.85ID:YTopxKYTd
>>424
2019/03/01(金) 21:08:03.60ID:xM2kasch0
C++か他の言語か勘違いしてないかな?
C言語の枠内では(以下略
2019/03/01(金) 21:13:58.29ID:V2sWjbOV0
#include <stdbool.h>すれば、C言語でもbool, false, trueが使える。C99から。
2019/03/01(金) 21:27:08.50ID:xM2kasch0
マクロなのか 乱暴な解決法と見るか予約語にしなかった・できなかった理由があったのだろうか
2019/03/01(金) 22:01:55.94ID:HVxvwZsK0
>>428
bool 型は C99 では _Bool 型となり「bool」そのままではありません
2019/03/01(金) 22:19:15.38ID:wVb5PmwP0
>>425
#undef bool
あと死ね
2019/03/01(金) 22:36:40.53ID:4P/9ohSca
>>413
口調が似てると思ったら、やっぱりあいつだったのね
2019/03/02(土) 00:57:50.68ID:SIJCHEbM0
>>418
if ((n / 10 != 0) != 0) とは書かないのですか?
if (((n / 10 != 0) != 0) != 0) とは書かないのですか?

if (n / 10) で充分だろ
434デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/02(土) 01:28:32.24ID:ixsZHls30
if文の仕様がまずかったんだよな。演算子がコマンドで数値を返すところがいまとなってはわかりにくい。
2019/03/02(土) 02:00:30.74ID:tMatklv80
C の _Bool は完全に後付けだし、
true, false の型は int (整数リテラルの 1 や 0 に展開されるマクロ) ってのも
C らしい歴史的経緯ってやつだよねぇ……。
2019/03/02(土) 02:41:15.96ID:LTb7iLna0
なんでもいいがboolは使った方がいいよ
キャストするとちゃんと0と1になるよ
437デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/02(土) 03:06:19.06ID:ixsZHls30
キャストしないといけないのか
2019/03/02(土) 04:52:10.38ID:x2TrvqAV0
#define TRUE (1==1)
#define FALSE (!TRUE)

昔はこう書いて使ってたっけなあ
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
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) の方が
やってることが明解だし、処理も軽い気がするなぁ。
2019/03/02(土) 07:05:29.88ID:uyGBCzAL0
単純に開発当時のC言語としては処理をシンプルにしてパフォーマンスを稼ぎたかったのだと思うよ
普通のCPUは0か0でないかの判断は得意だけど0か1の判断は手間が掛かる
少しでもパフォーマンスを稼ぎたい場合(現在では組込み用途など)では余計な処理は極力除くように工夫する
2019/03/02(土) 07:30:56.47ID:0NQezXSh0
>>440
処理が軽いかどうかはちゃんと実測で比べろ
妄想だけで完結するアフォがよくいる
2019/03/02(土) 07:57:45.28ID:THGEifYn0
CPU/ハード毎に違い出るだろ。
2019/03/02(土) 08:01:55.04ID:uz1yhwTy0
いや、さすがに単純な整数値の大小比較と、割り算とで
どちらが速いか実測しなくちゃ分からないってのは
「実測しろ」って原則を無批判に(条件反射的に)
振りかざしてるんじゃないの?
予測は一切禁止ってルールじゃないでしょ。
2019/03/02(土) 09:30:10.68ID:+HGsrEwZM
>>433
n / 10

(n / 10) != 0
の型を意識しない底辺乙 w
2019/03/02(土) 09:37:08.49ID:Co1I1oSR0
>>444
そもそも>>440が言いたかったのは「やってることが明解だし」の方だろうしな
なんにでも噛み付く老害なんでしょ、スルー推奨
2019/03/02(土) 10:48:59.21ID:op59Vyc6a
でもcのコンパイラって割り算の時は最初に比較があって、n < 10なら比較直後に0返すんじゃなかったかな。
昔アセンブラの実習でやった気がする。
帰ったらみてみよ。
2019/03/02(土) 10:57:46.09ID:x2TrvqAV0
n / 10 と (n / 10) != 0 とで違うコード吐くとか?
オプティマイザなめんなよ
2019/03/02(土) 11:32:55.24ID:TCm6U75d0
>>439
最新のwindowsでもフォントにアンチエイリアス掛かってないのか
Mac唯一の利点だな
2019/03/02(土) 11:41:06.22ID:x3fQB5qB0
唯一ってw
2019/03/02(土) 13:58:43.76ID:S/SxCgBS0
MSゴシック以外のとこはアンチエイリアスかかってるだろ
452デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/02(土) 16:14:23.72ID:ixsZHls30
>>447
割り算はコンピュータにとって簡単なことではない。人間だってそうだろ。
2019/03/02(土) 16:42:33.79ID:/q2pZC1F0
>>445
0〜1以外を取るかどうかが違うだけで型は同じでは?
等価演算子(==と!=)は真の時に1、偽の時に0を返すとしか明記されてないでしょ
2019/03/02(土) 16:43:44.00ID:/q2pZC1F0
>>453
自己レス、型はintって書いてあったわ
2019/03/02(土) 17:04:52.74ID:tMatklv80
C では比較演算子が返すのも、 if の判定にも真偽値型は現れない。
真偽値型は後付けで、言語の中核の意味論には関与しない。
真偽値型は整数型の一種だから何か演算しようとすると整数拡張で int になってから計算するしな。

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

(余談だが C++ では (組込みの) 比較演算子は真偽値型を返すし、
if の条件節は真偽値型にキャストして判定するので C とは解釈が違う)
2019/03/02(土) 17:20:40.95ID:vTA45/dSM
>>453-454
型が同じだから区別不要?
昭和の老害かよw
2019/03/02(土) 17:23:51.58ID:U++dipsO0
若さを売りにするしか無くなったかw
2019/03/02(土) 17:29:25.11ID:Dgo9YwRe0
>>456
「昭和」言いたかっただけだろがw
2019/03/02(土) 17:38:17.44ID:/q2pZC1F0
>>456
「型は同じ」って言っただけで区別不要とはどこにも書いてない訳だが
2019/03/02(土) 17:53:06.93ID:vTA45/dSM
いや、マジで型安全とか知らなさそうで可哀想ですらあるんだが…
2019/03/02(土) 17:55:42.96ID:vTA45/dSM
>>459
> 型を意識しない底辺乙 w
にレスしてるのに?
なら結局何を言いたかったんだ?
2019/03/02(土) 18:05:39.73ID:/q2pZC1F0
>>461
言い方として「型を〜」っていうのが(あくまでC言語として)おかしいなと思っただけだよ
別に!=0をつけた方が分かりやすいことは否定しないし
2019/03/02(土) 18:07:30.88ID:U++dipsO0
「ばあさん、いただきものは型を意識した応答だろう」
「いいえ、お爺さん型を意識した応答でしたよ」
「そうかい、わしゃまた型を意識した応答だと思ったよ」
2019/03/02(土) 18:18:58.15ID:5yoALKCSa
boolの1と1足したら1になるよね?
2019/03/02(土) 18:45:34.07ID:NrjYyiWtM
>>464
ならんよ
2019/03/02(土) 18:46:41.44ID:tMatklv80
>>464
双方が int に拡張されて足し算されて 2 になったのが
再び bool にキャストすると 1 になる。

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

ブールを表現する場合は、整数型を使っていても、
それはブール型ですよってアピールする事で、
技術者間での意思疎通を図り、安全性を高める
2019/03/02(土) 19:16:00.81ID:eb7NT9g3d
>>466
なる場合とならない場合がある。
古いコンパイラではならない。
2019/03/02(土) 19:16:54.91ID:5yoALKCSa
あれ、ぶーる同士足し算できないの?
ちょっと信じがたい気はするけど
2019/03/02(土) 19:29:15.37ID:sCjKfj9s0
1bit計算のインストラクションなんぞ
わざわざ作らないだろ
そもそもbool型ってなんだよ
気持ち悪いな
2019/03/02(土) 19:31:09.19ID:DKrIFalvd
要は
bool a = 1;
bool b = 1;
として、
bool c = a + b;
ができたとしても、内部的には
bool c = (_Bool)(((int)a) + ((int)b));
になるってことじゃないの
2019/03/02(土) 19:43:06.08ID:Gk4CLPf80
整数型には加算はあるけど、
ブール型として扱うなら、加算は存在しない

AND, OR, NOT だけしかない

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

ブール型が無かった時代の、
技術者間での意思疎通を図り、安全性を高める、苦肉の策
2019/03/02(土) 19:48:16.19ID:vmi2lFb5d
bool a = true, b = true;
int c = a + b;
これは2
2019/03/02(土) 19:56:01.42ID:Ud+LwFnR0
>>467
>それはブール型ですよってアピールする事で、技術者間での意思疎通を図り
そういうのは、わりきってハンガリアンを使う方がいいのでは?
bool を使うことで文法的縛りが導入されないことには意味がない気がします
2019/03/02(土) 20:00:32.34ID:/q2pZC1F0
仕様の話とコーティング規約とか作法の話が混ざってるからややこしくなってるのでは
2019/03/02(土) 20:02:44.72ID:uyGBCzAL0
MSVCではbool変数同士の論理和でも加算でも再評価されて0か1のいずれかが再設定されてる
内部処理は全く同じ
gccの内部処理は分からんけど
https://i.imgur.com/3EzADoO.png
2019/03/02(土) 20:47:30.41ID:tMatklv80
>>467 >>472
コーディング規約・ガイドラインを設けるのは結構だが、
それを守っている組織・プロジェクトの中では意思統一しやすいという話であって、
技術者一般にまで適用できるほど強い権威は MISRA-C には無いよ。

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

規約としての理屈よりも言語としての理屈をまず説明してわかってもらわんと。
2019/03/02(土) 21:01:54.09ID:0outH6mLM
>>476
内部処理は全く同じ?
逆汗までしたのにどこ見て言ってんの?
2019/03/02(土) 22:47:35.40ID:WsmBPiyqa
最後に評価されるタイミングで一致してりゃなんでもいいんだけどね
+って相当するのはxorだかorだかわからんという問題もあるね
2019/03/03(日) 06:55:31.52ID:EUJr/Yte0
>>479
> 最後に評価されるタイミングで一致してりゃなんでもいいんだけどね
とか言うなら内部処理ガーとか言うなよ
って話だろ

> +って相当するのはxorだかorだかわからんという問題もあるね
orはわかるがxorになることなんてあるのか?
2019/03/03(日) 07:58:48.98ID:ojZ/TgF60
ついでにいくつか検証
xorは排他なので当然true同士はfalseに反転する
2項演算や0/1以外の値の代入(boolの範囲外の値であっても)は内部処理は共通
単項演算のインクリメントやデクリメントはコンパイル時に1か0を割り当てるため別の処理らしい
https://i.imgur.com/STxUA6o.png
2019/03/03(日) 08:25:42.12ID:HIAqsaOR0
ブール値は 0/1 しかとらないから1ビットの整数値、と解釈して
true + true == 1 + 1 == (2進数で)10 → 下位1ビットを採用して結果は 0
よってブール値での加算はビットでの排他的論理和と同等、
という考え方もあるんだわ。

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

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

その「ブール値の加算を排他的論理和と同等に扱う」体系が
内部的に矛盾を生じないこと、実用的な面で利用価値があり、
現実にも使われているってことは、>>483 がコメントしてくれた
前半部分で、十分に例示されてると思う。
て言うか、俺が下手にクドクド書いてもあのレベルは無理。
2019/03/03(日) 10:46:47.10ID:3MaRmCtMd
少なくともC言語である限りは規格に反するんじゃ?
_Bool型は0に等しければ0、その他は1って明記されてる(C11の6.3.1.2)から2進数で10は0に等しくないように思うが
2019/03/03(日) 11:22:47.67ID:EUJr/Yte0
>>486
ハーフアダーはキャリーとセットで話すべきものだからハーフアダー云々は頓珍漢過ぎる
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 → 真偽値では偽!
という事態も起こりうるのでご注意。
2019/03/03(日) 11:31:58.04ID:f6/fijs9a
加算てのは常に状態を変える操作なので、論理演算としてはXORの方が似てるんですよ。
もちろん単に似てるという話で、加算は禁止するくらいが正しいといえば正しい。trueとfalseを1と0に割り当てたせいで足し算できそうな気になってしまったのがよくない。
1ビット整数だと考えてもいいが、元々そんなもんないからsizeofも1以上にするしかないという。
構造体に入れたらビットフィールドと同じメモリのレイアウトになるんだろうか。実装としては。
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に割り当てて妥協するしか無いと思う
2019/03/03(日) 20:59:55.81ID:7VSfwDmM0
>>444
おまえ除算器作ったことあるの?
2019/03/03(日) 21:09:45.45ID:OccEVyH10
>>444
>「実測しろ」って原則を無批判に(条件反射的に)振りかざしてるんじゃないの?

いいところを突きますね、そうそうその調子、いい感じですよ
百人一首の上の句と下の句をつなげる、みたいな思考力を使わない、言葉のオートマタを批判するのはすばらしい着目です、感心しました
2019/03/03(日) 21:11:38.16ID:OccEVyH10
>>492
作ったことはあります、最初 C でちょろちょろっと書いたのが、いつのまにか成長してまとまったものになりました、まだまだ改善は必要ですが
https://mevius.5ch.net/test/read.cgi/tech/1434079972/51
2019/03/04(月) 06:25:09.82ID:kNFhD2SD0
>>494
違う
ハードウエア除算器だ
2019/03/04(月) 07:32:41.06ID:yZdj1rJq0
昔8bitマイコンの組込みシステム開発で、被除数が24bit長、除数が固定値(値は3)の除算処理が必要となったとき、
C言語の除算処理では実行時間が要求仕様を満足しなかったのでインラインアセンブラで書き下ろしたことがある
処理系そのものは16bit長までしか対応してなかったので、32bit長の汎用演算ライブラリ関数が付属してたのはいいけど
そのライブラリが遅くて使い物にならなかった
2019/03/04(月) 09:27:34.36ID:uCsPZ+haa
昔bool型ってのを初めてみたときは、誰が使うんだよ気持ちわりーって思ったな。charで8個もフラグ取れるし、
flg & 04とかで好きな位置のビット取れるし、なんでわざわざtrue,falseと思ったもんだ。
2019/03/04(月) 09:33:39.42ID:7yhUbPfx0
貧民の発想だな
2019/03/04(月) 12:25:39.90ID:LMssFTDPM
貧民てか脳がアセンブラに侵されてる
Pascalから入った俺はintでBooleanの代用とかサボりすぎだろって思ったわ
2019/03/04(月) 15:44:36.25ID:kNFhD2SD0
当初から予想された抵抗だ
Pascal教に対する宗教改革じゃけえの
501デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/04(月) 16:53:38.87ID:TpCWsYE80
>>497
思い切り最適化されて最終的なコードがそうなれば誰も文句言わないんだろうけどな。
2019/03/04(月) 17:08:34.72ID:Cw9L4ZBc0
bool は真偽値を格納するのに充分であればいいんだから普通は 1 バイトだろっていうのも昔の話で、
今の主要な処理系はだいたい int と同じ幅だったりしてあんまりリソースの節約にもならんかったりするし。
2019/03/04(月) 17:13:39.42ID:7Cz1/mIW0
ブール値の変数を1ビットで表現して1バイトに8個押し込めば
容量の節約にはなるだろうけど、速度的には損な気がするな。
(これも「実測しなけりゃ何も分からない人」向けの釣り餌かも)

ブール値をバイトなりワードで記憶すれば、CPUによっては
レジスタにロードした時点でゼロフラグに反映されて
ゼロとの比較やマスク演算が不要という利点を得られる場合もある。
504デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/04(月) 17:16:40.19ID:TpCWsYE80
>>503
CPUしだいだろうね。レジスタに入れないで0かどうかだけ調べる命令があったらそれの方が速いかも知れんし。
2019/03/04(月) 17:18:44.97ID:kNFhD2SD0
                  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                  |CPUしだいだろうね。レジスタに入れないで0かどうかだけ調べる命令があったらそれの方が速いかも知れんし
                  \___________  _______
                                    V
   / ̄ ̄ ̄ ̄ ̄ ミ                      / ̄ ̄ ̄ \
  /   ,――――-ミ                   /         |
 /  /  /   \ |                    ∨∨∨∨∨\ |
 |  /   ,(・) (・) |                    |▲  ▲  ||
  (6       つ  |                    |(・) (・)  6)
  |      ___  |                    | |    ||
  |      /__/ /                    |  ¨     /
/|         /\                    \/\  /\
                                  / ̄ ̄ ̄    \
     ∧
  / ̄   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | なわけねーだろ!!
  \__________________
2019/03/04(月) 17:21:36.33ID:Cw9L4ZBc0
真偽値の超巨大な配列が必要な場合ならともかく、
今の時代なら 1MB が 8MB になったくらいならたいした差ではないしな。
ただ、キャッシュにのるかどうかで劇的な差になったりもするから、
そこらへんは状況によるというか、それこそ実測しなきゃわからん。
2019/03/04(月) 17:42:05.47ID:VsmIFGpH0
>503
ロードストアに比べて
ALUの制約は少ない
だから詰めたほうがいいとなる

スペックシート読めずに
実測して速い遅い語ってる人は
遅くなると断言しよう
2019/03/04(月) 18:01:28.91ID:jkGA6AVca
プリミティブな静的変数のビットフィールドにアクセスするときってロック意味あると思う?
2019/03/04(月) 18:13:29.18ID:9wLIIjqc0
>>508
しらん

>>503
フラグを全部使うなら8回ロードと一回ロード+マスクする
をくらべないとだめだろ
2019/03/04(月) 18:18:11.00ID:kNFhD2SD0
10進で2桁程度の「整数値」にもintを使えという主張に似ているな
511デフォルトの名無しさん (ワッチョイ bf02-wVf3)
垢版 |
2019/03/04(月) 18:38:48.94ID:TpCWsYE80
>>505
あれ?そう?そう断言できる根拠あるの?
2019/03/04(月) 18:51:09.16ID:kNFhD2SD0
>>511
レジスタに入れないでって無理
メモリREADサイクルでどのみちラッチするんだから
名前のある公開レジスタか、名前のない非公開レジスタかという違いにしかならない

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

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

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

と言っても、アドレスを取れないとなると、ポインタ経由での操作、
配列に入れてインデクスで順番に走査することもできないわけで
非常に使い勝手の悪いものになってしまうね。
2019/03/05(火) 06:03:05.43ID:C3u1nlxm0
ビットフィールド構造体はあくまで構造体であるのでアドレスを返すことは出来る
というか自分ならビットフィールドだけでは使い勝手が悪いので構造体をcharなどと一緒に共用体に纏める
構造体を配列で操作するときなどは同一アドレスのchar変数でビットフィールドを纏めたパッケージとして取り扱う方が使い勝手がいい
523デフォルトの名無しさん (ワッチョイ 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
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;
2019/03/05(火) 06:48:30.63ID:SFzBJqTc0
>>517
だから、できると思うんならやってみろよ
うまくいけば特許権で儲かるかも知れんぞ
2019/03/05(火) 09:35:09.67ID:XZEd/J30a
>>521
謎だな。
ブールの配列ならint bool やら char boolやらした時点で確保されるメモリをそのまま使って、and or xorあたりでビット操作してshiftで走査したらいいじゃん、ってのが爺の言い分。
どのビットを何に使ってるかってのはコメントに書いておいたり仕様書に書いといたりカンペ回したり。

メモリ確保もロードも最小単位があるんだから、単独1ビットのブール変数ってのは無理だろ。
あ、組込み用のマイコンは知らないけど。
527デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 12:23:27.77ID:TQUHbSsoa
>>525
君がマウントを取りたいだけのサルということが良くわかった。
ま、頑張れ。
2019/03/05(火) 12:35:19.43ID:SFzBJqTc0
>>527
体験も知識もないやつが妄想を垂れ流すと突っ込まれるという当たり前のことが起きただけだ
今後は身の丈に合った発言を心がけるんだな
529デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 12:58:00.63ID:TQUHbSsoa
>>528
マウントご苦労様です。
2019/03/05(火) 13:03:24.22ID:SFzBJqTc0
まだいたの? アンダードッグ君
531デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 14:27:58.97ID:TQUHbSsoa
>>530
いつもマウントありがとうございます。
2019/03/05(火) 14:29:27.16ID:TEkYesPv0
使用中なので取り外しが出来ませんでした
2019/03/05(火) 18:49:30.99ID:t42KPL8Wd
>>505
結局レジスタに入れずにってのは有りうるの?喧嘩せずに冷静に結論を出してくれると嬉しい。気になる。
2019/03/05(火) 18:58:34.77ID:6hPuHs1J0
intが64ビットの環境で32ビットの変数を扱いたいので、
とりあえず(私の環境で) typedef long INT32;とか定義してるんですが、
longを使うのが普通でしょうか?
環境によって違うらしいとは知っているのですが、
typedefに出来るだけ無難な型を使っときたいという意図です。
2019/03/05(火) 19:06:56.91ID:04oqNpdo0
>>534
stdint.hかinttypes.hをインクルードしてint32_tを使うのはダメなの?
2019/03/05(火) 19:08:28.28ID:JrR+GNVhx
レジスタに入れずに直接メモリ上のビット操作はないよ。
そりゃやろうと思えばメモリセルの制御単位を1ビットにしてデータバスを1ビット、アドレスバスのアドレス単位も1ビットにでもすれば1バスサイクルでのビットアクセスができるだろうけど、あまりにも非効率なのでやらないだろう。
そんな汎用CPUはどこにもないと断言しても良いレベル。
2019/03/05(火) 19:09:18.75ID:JrR+GNVhx
>>536

>>533
へのレスね。
2019/03/05(火) 19:13:46.41ID:6hPuHs1J0
>>535
組み込み系をやっていて、
ライセンスにかかわらず、ヘッダを含む外部ライブラリを一切使ってはいけないルールになってます。
2019/03/05(火) 19:21:59.58ID:pv4h1d4+0
こんなデタラメまじりの掲示板で
聞いた所で所詮オカルト

はっきりさせたきゃ
sdramの転送どうなってるか
自分で読めばいい
2019/03/05(火) 19:22:03.60ID:/9vlYliD0
それなら提供されている範囲で使える物を使うしかない
32ビットもあえて使わなくても良いように思うけど
何かこだわりがあるのかな?
541デフォルトの名無しさん (ワッチョイ d77b-vPGa)
垢版 |
2019/03/05(火) 19:25:55.02ID:Q+OO1XNi0
>>538 コンパイラ付属のヘッダファイルも存在しないのかな。
その場合は、コンパイラの取説でも見て、32bitになる整数を選んで
typedef すれば良いかと。

どのみち移植する際には、その辺も含めて丸ごと再検討ってことになるだろうし。
2019/03/05(火) 19:45:54.06ID:nFLweowNM
>>534
intが64bitでlongが32bit?
いくら何でもC言語としてあり得ないだろ
妄想で話を盛っているのか?
2019/03/05(火) 20:04:57.01ID:/w4kwDux0
>>542
クロスだろ。ターゲットのlongが32なんでしょ。
2019/03/05(火) 20:14:28.31ID:z9gnaYkTM
クロス開発でホストのintに何の意味がある?
545デフォルトの名無しさん (アウアウクー MM0b-tQZn)
垢版 |
2019/03/05(火) 20:17:27.37ID:EdVc4MwEM
int型が64ビットの環境で、longという型が32ビットなのは引っかけだな。

あとで見た他人に恨まれるぞ。
546デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 20:37:31.74ID:TQUHbSsoa
>>537
話の流れとしてそこはビット単位の話ではなくなっている。
2019/03/05(火) 20:38:33.36ID:/w4kwDux0
職場でクロス開発やってるけど、家では開発環境無くてVSかなんかで勉強してると妄想してた。
2019/03/05(火) 20:43:04.13ID:SFzBJqTc0
>>531
マゾ野郎
549デフォルトの名無しさん (アウアウウー Sa9b-RuLt)
垢版 |
2019/03/05(火) 20:50:49.79ID:TQUHbSsoa
>>548
昼夜を問わず沢山のマウントありがとうございます。
2019/03/05(火) 21:09:43.62ID:LEdL4Q1r0
ゆうたんなw
2019/03/05(火) 22:33:03.94ID:QKmISP/B0
>>536
すげー昔の話だがメモリー側で論理演算できるようにして1アクセスでビット単位操作を可能にした特許があったな
元々はグラフィック用で図形の重なりの演算をメモリー側でやるようにしたものだったけど
特開昭61-264453
2019/03/05(火) 22:51:02.28ID:U66Q7+Ir0
>>551
前世紀の話だが液晶モニタ側にメモリ機能を有して
PCの電源落としても液晶モニタ側に必要な情報が画像として記録されてるから
再起動後すぐにデータを使えるようになる、なんてニュースが真面目に流れてたっけ
2019/03/05(火) 23:10:02.68ID:tIL7S9l7a
たとえばFPGAだとビット操作向けのコンピュータ作れたりするんですか?
2019/03/06(水) 06:42:53.51ID:CUnnY/wEx
>>553
外付けのSRAMやSDRAMではI/Fが決まってるので困難だけど、FPGA内で閉じて作るなら可能なんじゃないかしら。
2019/03/06(水) 08:02:21.67ID:y/rbGqHP0
大昔のDRAMには必要なビットだけ書き換えできるライト・パー・ビットって機能を実装したものもあったな
2019/03/06(水) 08:08:34.10ID:CUnnY/wEx
そういえばGRAM用にそういうRAMが何種類かあったね。
OpenGLとかで全画面書き換えが当たり前の今では役に立ちそうにないけど。
C言語とは関係ない話題ですまんかった。
2019/03/06(水) 08:31:46.74ID:LMHeKY6C0
MB-S1はそういう回路を搭載してグラフィックの処理がやたら速かった。
2019/03/06(水) 12:18:27.87ID:Aj1thrX90
X68000のVRAMは変わった仕様だったみたいだね。
2019/03/06(水) 17:11:17.09ID:5bfpZyLy0
Cはコンパイラにより
型の変数の容量どころかポインターすら変わる
きれいに書くことなどできん!

Cの恐ろしいことは、標準っぽい関数が
リソース開放の事を考えてなかったりする所w
2019/03/06(水) 17:40:35.05ID:BXQzb/g70
表面的だな
どっかで吹き込まれたことの受け売りはすぐにバレる
2019/03/06(水) 18:06:49.31ID:t4z0A86na
>>559
あちこちで暴れてるrubyボットか?
562デフォルトの名無しさん (ワッチョイ b75f-tQZn)
垢版 |
2019/03/06(水) 18:17:51.07ID:t0mzyE2R0
>>559
標準っぽい関数とはなんですか?
2019/03/06(水) 18:30:39.79ID:pvc8mHD30
>>559
>Cの恐ろしいことは、標準っぽい関数がリソース開放の事を考えてなかったりする所w

それはどの標準関数ですか?具体的に指摘できますか?
2019/03/06(水) 18:35:15.08ID:YYpMHTIdM
>>563
標準関数ではなく、
標準っぽい関数なんだから
相手にするだけ無駄かと。
2019/03/06(水) 18:36:02.84ID:BXQzb/g70
その昔、printfはメモリリークするとかぬかしてたアホがいた
2019/03/06(水) 18:41:35.18ID:OdnfdSEH0
小学生のプログラミングの授業が始まったせいで5chにも大量に小学生が湧いてるな
学校でプログラミングを教えるのは勘弁してほしいは
2019/03/06(水) 18:44:20.55ID:DQfudujD0
小学校は5ちゃんねる使って授業やってるのかw
2019/03/06(水) 18:45:49.69ID:pvc8mHD30
>>564
いえいえ、標準っぽい、というのだから、標準関数に近いという主観的判断があるのでしょう
それはそれで私は純粋に好奇心が湧いたのです
2019/03/06(水) 18:53:01.46ID:DQfudujD0
「ぼくのかんがえたさいきょうの」
が一番近い
2019/03/06(水) 21:25:19.62ID:nJiuC9TpM
ぼくのかんがえたさいきょうの標準っぽい関数
atod
stringをdouble型に変換する。
標準っぽいが標準でない。
リソース開放を試みるものの、constに阻まれる。
2019/03/06(水) 21:35:13.47ID:BXQzb/g70
Cスレでstringかよw
2019/03/06(水) 22:53:39.41ID:s+f1BYLZ0
標準的な関数で痛い目にあったといえばlocaltime()
コイツがスレッドセーフじゃないせいでひどい目にあったよ……
まあ返り値がポインタな時点で疑うべきだったが。
2019/03/07(木) 00:23:38.58ID:IzAEAgL00
>>570
atod() にてリソース解放の必要はあるのでしょうか?
2019/03/07(木) 03:09:54.57ID:icwsNkaN0
stringは無視するとして、const char*をdoubleに変換する標準ライブラリ関数はatofまたはstrtod
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
と出力されてしまいました。
何が間違っているのでしょうか??
長文スマソ
2019/03/07(木) 18:28:41.26ID:LVW4xgZwa
すみません
a=2*b+2
です
2019/03/07(木) 18:35:13.92ID:byd0ZGo00
a、bにまず初期値を入れないと
2019/03/07(木) 18:40:02.18ID:s2VxUnjk0
int a,b;
b=3*a+4;

b = 3 * <未初期化の a は不定の値> + 4;
= <不定の値>

なにになるかはわっからんちん
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 のごくごく初歩をわかってないので、
普通に入門書を最初から読んで。
2019/03/07(木) 18:41:46.43ID:LVW4xgZwa
"1文字=1数字"の式をもたない連立方程式は解けないということですか?
2019/03/07(木) 18:43:15.30ID:LVW4xgZwa
>>579
なるほど…出直して来ます。
2019/03/07(木) 18:44:20.04ID:byd0ZGo00
その解法手順をプログラムで組まないと
2019/03/07(木) 18:47:10.49ID:s2VxUnjk0
あああ 数学的に式を記述したら解を求めてくれる mathematica 的なものを考えてたのか
残念C言語はそこまで親切じゃない
2019/03/07(木) 18:48:25.12ID:mVKClUMzd
むしろmathematicaだと解いてくれるの?すげぇ。
2019/03/07(木) 19:08:28.06ID:byd0ZGo00
連立方程式は無理じゃないか?
2019/03/07(木) 19:22:54.85ID:fFrTWbSf0
b=3*a+4
a=2*b+2

https://www.wolframalpha.com/input/?i=b%3D3*a%2B4;a%3D2*b%2B2
2019/03/07(木) 20:08:41.25ID:s2VxUnjk0
>>585
数値解求めるのもあるし
可能なら解析解も出せる(テイラー展開されてきもい出力になるケースもままあるが・・・)
2019/03/07(木) 21:29:00.33ID:Pol75wena
方程式解くのは計算というより言語処理感あるよなー
2019/03/08(金) 03:32:43.35ID:zYZkTFiw0
連立方程式を解くならLU分解(ガウス消去法)が一般的な方法
https://ja.m.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E3%81%AE%E6%B6%88%E5%8E%BB%E6%B3%95
2019/03/08(金) 06:04:01.43ID:jQY3XD9A0
代入を=にしてしまったのが不味いよな
やっぱ代入は矢印にするべきだわ
2019/03/08(金) 07:32:03.47ID:zYZkTFiw0
ASCII文字コードに矢印はない
2019/03/08(金) 07:44:58.78ID:p7qg4IcOd
>>591
<- これを使うって意味な
2019/03/08(金) 07:51:36.24ID:0HdenOKEa
単項マイナスと競合しそう
2019/03/08(金) 07:54:52.91ID:p7qg4IcOd
それは <-- こうしよう
まぁすごく今更だけどなw
2019/03/08(金) 08:03:45.11ID:zYZkTFiw0
<- 比較演算子と単項マイナス
<-- 比較演算子と前置デクリメント
2019/03/08(金) 08:54:22.03ID:NeLzfZqe0
== 代入と代入
2019/03/08(金) 09:19:21.38ID:zYZkTFiw0
式 + 二項演算子 + 単項前置演算子 + 式; OK

式 + 二項演算子 + 式 + 二項演算子 + 式; OK
式 + 二項演算子 + 二項演算子 + 式; NG
598デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/08(金) 09:39:25.02ID:pv8HlopZa
代入を =: にしている言語あるな。
599デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/08(金) 09:50:55.62ID:dZ4sYt+j0
>>598
:=
600デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/08(金) 09:51:39.55ID:dZ4sYt+j0
数学用語を使うやつは馬鹿っぽい
601デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/08(金) 10:43:26.56ID:pv8HlopZa
>>599
あ、そうだったか。すまん。
2019/03/08(金) 10:46:07.61ID:YyekWoUN0
もう昔のAPLみたいに変態文字集合にすれば?w
2019/03/08(金) 14:47:21.50ID:DIWS8ePoM
\数学用語を使うやつは馬鹿っぽい/
2019/03/08(金) 14:56:39.67ID:zM+hSklW0
そろそろGUIでフロチャート化や命令/関数アイコンの並び替えで作れる言語を!!

・・・そんなに利便性はあがらんか。
2019/03/08(金) 15:54:05.18ID:ojZ2oJ0M0
>>604
政府が作ってるやろ
2019/03/08(金) 16:00:54.92ID:iK4gPhWEx
はるかの昔からそういったGUIプログラミングツールやCASEツールがあったけど、どれも決定版にはなってないよね。
唯一、車業界でMatlab+Simulinkと自動コードが標準的に使われてるけど、あれはモデル化して徹底的にシミュレーションする目的がメインなのでちょっと汎用的には使いにくい。
実際吐き出されたコードはロジックに問題はなくてもソフト技術者から見ると目も当てられないぐらい悲惨なコードだし。
2019/03/08(金) 16:28:54.41ID:oUzck+rK0
多分要件定義を渡すとプログラムを作成してくれるAIを作る方が早いだろう

誰が作るかは知らないが
2019/03/08(金) 17:06:47.81ID:iA9EY6NmM
>>604
そんなんすでにいくらでもあるだろ
つScratch
2019/03/08(金) 20:20:35.60ID:q/o0JPH80
そりゃAIが作るんだろうよ
2019/03/08(金) 21:36:26.45ID:+4tnAN1A0
そのAIを作るAIを作るAIを作るAIを…
2019/03/08(金) 21:39:07.49ID:K5YfeukWM
>>610
そういうややこしい話はAIに考えさせるべき
2019/03/08(金) 22:15:29.34ID:2Mvu5LOb0
なんでこんなゲシュタルト崩壊みたいなスレになってるの?
みんな疲れてるの?
2019/03/08(金) 22:30:35.92ID:oUzck+rK0
君以外はAIの書き込みだよ
2019/03/08(金) 22:33:04.42ID:kP9nO1yc0
再帰とラムダ計算のやり過ぎで頭が沸騰してるんだよ
2019/03/08(金) 22:40:30.22ID:FVpVmqiRd
Cでなくていいならnode-redなんかはいい感じにグラフィカルだと思うわ。
2019/03/08(金) 22:55:58.20ID:+MPT5vgD0
AI 「めんどくせー、報酬出して人間に考えさせたろ」
2019/03/09(土) 06:17:25.50ID:sGXnYTxga
マイクロソフトのビジ男ってフローチャートからコード吐いてくれる機能あったよね、まだ生きてるのかしら
2019/03/09(土) 06:39:25.40ID:eo7E8WXr0
フローチャートではなくてUMLのクラス図からC++のコードを自動生成する機能だったと思う
その類の機能は廃止されたよ
2019/03/09(土) 06:50:13.86ID:sGXnYTxga
>>618
そうか、亡くなってたのか。一回触って無言で閉じた事しか覚えてないけど、根は優しい奴だった。
2019/03/09(土) 08:31:39.80ID:4ewQpv+T0
Executable UMLは見事に死んだな。あれはさすがに無茶だろうと思った。
2019/03/09(土) 08:32:04.32ID:zqjN2Zcb0
>>604
ほぼゲーム制作専用だけど、Unreal Engine4のブループリントが
完成度高いような
2019/03/09(土) 09:40:32.42ID:woQHdZ/f0
>608
ゲーム作れるようになりたいって言ってコンシューマ版PRGツクール買わされた気分。
2019/03/09(土) 10:05:30.78ID:UpidnITW0
返り値がポインタの関数って
int *func() {...}
↑みたいに関数名にアスタリスクが付いてるのが違和感あるんだけど何か理由あるの?
意味を考えればint* func()もしくはint * func()にするべきなんじゃないのかな
2019/03/09(土) 10:44:22.53ID:1jBEzlrN0
複数のポインタ変数を宣言するとき

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

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

だと思ってるんだが違うかもしれん。
2019/03/09(土) 10:48:12.35ID:1jBEzlrN0
そんな書き方する人はいないだろうけど(というかできたっけ?)、極端な話、

int* func1(), func2();

という宣言だとダメだしね。
2019/03/09(土) 10:57:28.35ID:MFivwnzo0
昔、*をどこに付けるべきか議論あったね。
「int *」も型なのでスペース空けるのはおかしい、「int*」と書くべきだと主張してる人も結構いて、今もまれによく見かける。
統一してれば良いんじゃね?
627デフォルトの名無しさん (ワッチョイ de8c-OG2p)
垢版 |
2019/03/09(土) 11:42:25.92ID:TwFYMaY40
>>624
int *a, *b は *aと書くと整数。
2019/03/09(土) 11:54:24.82ID:DgSeYL2x0
int*ならtypedefやらtypeofやらつかえと思うわ
629デフォルトの名無しさん (アウアウクー MM07-LDqw)
垢版 |
2019/03/09(土) 12:13:21.98ID:MaTZH59sM
>>623
それC言語の初期はそっちの方が普通だったんたよ。
2019/03/09(土) 12:25:03.89ID:OCj0KbiTd
>>627
ん?そりゃそうだろ……
2019/03/09(土) 12:26:42.27ID:OCj0KbiTd
ああ、わかった。*aで正数になるから宣言するときに int *aって宣言すると自然だよってことか。なるほど。
2019/03/09(土) 12:30:40.70ID:OCj0KbiTd
でもそれなら
int *a; で*aがintになるから自然だけど
int* a; でaがint*になるから自然さはこっちでも同じだな。なんか俺勘違いしてる?
連投スンマソン
2019/03/09(土) 12:33:07.29ID:DgSeYL2x0
>>632
int* a, b
2019/03/09(土) 12:55:35.26ID:U1CZFrYl0
そう書いてbがint*にならないのが悪い
cの最初の設計が悪い
2019/03/09(土) 13:12:23.27ID:capoU8RA0
50年前のクルマに「性能が悪い」と怒っても意味が無い
2019/03/09(土) 13:22:50.25ID:DgSeYL2x0
だから、それしたいならtypedef使えって。
typedef int *(*f)(int *, void ** );
f a, b;

Cの型の表現方法はそこそこ合理的だと思うよ。
2019/03/09(土) 13:30:38.68ID:0bE0zR0l0
int* なんて型はCにはないけど。
ついでに、int*もトークン分割時点で int * ってスペース入るんだけどな。
int *pも int * pってなる。
2019/03/09(土) 14:00:08.50ID:KYpgksP4a
規格的には別にスペース入れろなんて書いてない様な気はするが…
int*xは良いんだっけ?
2019/03/09(土) 14:03:23.83ID:LaC4lObOa
>>638
tokenの区切りで勝手に解釈してくれるから問題ないよ。
スペースをいれる必要があるのは、入れないと前のtokenと連結して解釈されてしまうような箇所だね。
2019/03/09(土) 14:24:11.60ID:0bE0zR0l0
>>632
勘違いといえば、
int* が型だと思ってるところかな。
変数の前に付いた*は演算子。逆参照演算子って名前だったか。
2019/03/09(土) 14:26:56.54ID:4ewQpv+T0
一見似てるけど演算子とは別。
2019/03/09(土) 14:33:59.98ID:0bE0zR0l0
>>641
単項演算子って言えばいいの?
2019/03/09(土) 14:36:13.79ID:Hu0eNkce0
変数宣言のときと式の評価のときとでは、働きが間逆になる、ときいていますが、私も馬鹿になったので、そういわれていることをそう理解できなくなりました…
2019/03/09(土) 14:39:16.30ID:Q2jRdDZx0
宣言は演算子とは別じゃなかったっけ?
typedefもできるし規格はpointer typeって書いてるからポインタ型って認識も間違いじゃないと思ってたけど違うんかな
確かに一行での複数宣言だと確かにおかしなことにはなるけども
2019/03/09(土) 14:42:21.52ID:4ewQpv+T0
ポインタ宣言子というやつでデリファレンス演算子とは別。
2019/03/09(土) 15:09:30.52ID:YyCiAm6Za
演算子でしょ?評価順があるじゃん。
関数の()とか配列の[]も同じで、もちろんCだと宣言にも使うことになるけど。
2019/03/09(土) 15:12:58.76ID:2TgeLAXH0
>>640
意味的には int* は型。
でも文法的には * は変数名と優先的に結合するので、
変なことになってんだよ……。

C++ だと設計者 (stroustrup) が * を型名に寄せる書き方をしてるので、
近頃はそれが C にも流入してる感じ。
2019/03/09(土) 15:14:01.24ID:Q2jRdDZx0
C11の6.7.6.1にpointer declaratorって書いてあるから、宣言時の*はポインタ宣言子で間違いなさそう
2019/03/09(土) 15:20:45.65ID:YyCiAm6Za
>>647
ぜんぜん変じゃないでしょ。
変数と型が直接結びついてるんだから、評価順が逆になるのは当たり前。
2019/03/09(土) 15:34:37.72ID:0bE0zR0l0
*から始まってる宣言子をポインタ宣言子って言うんじゃなかった?
宣言での*自体の名前もポインタ宣言子って言うのかな。修飾子?
2019/03/09(土) 15:47:50.55ID:4ewQpv+T0
あれ、そうかも。シンボルまで含んで宣言子かな、すまん。
2019/03/09(土) 15:49:52.10ID:2TgeLAXH0
>>649
カンマより優先度を高くする必要はないだろう。
2019/03/09(土) 17:11:57.46ID:ems+thyE0
>>646
型の宣言の構文が入れ子になっていて結合順はあるが、評価順があるわけではない。
見た目が似ているだけで、型の宣言と式の評価はまったく別の概念だよ。
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;などと、まとめて書けるように作ってある
ここで、
*のない変数はアドレスを参照するために&が必要
*がある変数は*を外すだけでいい

&がメモリ上のオブジェクト(変数とか関数)のアドレスを参照するのに対して、アドレスからオブジェクトにアクセスするから*は逆参照演算子と呼ばれる。単項演算子。
2019/03/09(土) 18:41:30.67ID:MFivwnzo0
>>654
いやいや、何を勘違いしてるのか知らないけどint *p;はポインタサイズのみ確保されるんだけど。
結果intとアドレスサイズが一致するとしてもsizeof(int)と同一視すべきではないんでは?
2019/03/09(土) 18:44:54.99ID:Q2jRdDZx0
>>654
int *p;の宣言じゃsizeof(int)は確保されないでしょ
環境によってはint *p;したあと*p = 0;したらセグフォか何かなると思うが
今一応clangで確認したらTrapしたし
2019/03/09(土) 18:47:05.30ID:9vZTtl180
教えるスレでデタラメ言ってはいかんな
釣りのつもりか?
2019/03/09(土) 19:01:45.35ID:ems+thyE0
>>654
お前が混乱しようがint*は型だ。
キャストもtypedefもsizeofもできる。
お前のオレオレ定義はどうでもいいから、標準的な用語で会話できないならいちいち書き込まないでくれ。初心者の理解を妨げる害悪でしかない。
2019/03/09(土) 19:06:49.21ID:kA4EgVm+0
2重にひどいなコレ
2019/03/09(土) 19:36:12.32ID:YyCiAm6Za
結合順って左右どっちからかという話だろ?
うまいこと、左に型で右に変数という形では宣言できないという点には関わってくるね。
Cではtypedefでそれがカバーできるので使えばいい。
単にstructの省略のためとかだと微妙だけど。
2019/03/09(土) 21:20:20.21ID:VKKMhaL/M
自分以下のように「*」をくっつけて書いてた。
int* p;

「int変数のアドレスを格納する型」
と理解してたので。
2019/03/10(日) 00:15:36.14ID:NjJBb6dx0
intのポインタだから int* と書くのが直感的だよね
int* a, b, c; と書いた時に全部ポインタで宣言できれば良かった
俺は宣言でカンマは使わないことにしてる
2019/03/10(日) 00:16:25.33ID:Yjkm2NzZ0
規約とかで決まってなきゃ思想の問題だし良いんじゃない?
Cでは意味論的には(ポインタ型って書いてあるし)int* pが近くて統語論的には(複数宣言で違和感がないから)int *pが近いっていうイメージ
規格内の例はint *p記法で統一されてるからこっちがCではスタンダードっぽいけど
664デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/10(日) 00:24:31.01ID:nrbpjhIZ0
>>662
ポインタでポインタが指している先頭アドレスから始まる領域をint型として扱うだから、*intにすべきだった。
2019/03/10(日) 00:53:02.56ID:PkJpScAa0
C++ なら std::add_pointer を使うなどという方法もとれるんだが、
C でどうにかする上手いトリックってないもんかね?
666デフォルトの名無しさん (ワッチョイ 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
2019/03/10(日) 01:47:39.67ID:yFrseuKKa
>>662
関数ポインタはどうすんの?
左に型書いて右に変数というルールで統一するとなると。
2019/03/10(日) 02:58:07.82ID:NjJBb6dx0
typedef 使う
2019/03/10(日) 04:16:30.73ID:8P6Oam7S0
int* p[10]; // intのポインタの配列
int (*p)[10]; // intの配列のポインタ
2019/03/10(日) 09:16:48.35ID:WROi3Fy5d
>>640
自らの名誉のために書いておくがint*を型だと思ってるわけではないぞ。ただint*で意味をなしてはいるだろ。
2019/03/10(日) 10:30:04.20ID:uE8BPcgQ0
int*は型だぞ
printf("%d", sizeof(int*)); //pass
2019/03/10(日) 10:40:10.44ID:PkJpScAa0
int* は型名。 C99 なら 6.7.6 で定義がある。
変数の宣言の文脈ではそれが型指定子と宣言子に分断されるのが、
なんか変な感じがするよなぁという話。
673デフォルトの名無しさん (ワッチョイ de02-dgqw)
垢版 |
2019/03/10(日) 10:42:33.14ID:IMQ2P2X20
>>662
そういうのは typedef で型名作ってしまうしかないな。
2019/03/10(日) 11:08:02.97ID:kCIB6uhNd
>>671>>672
自らの名誉のために言っておくが、型名な気もするなとも思っていたぞ。
2019/03/10(日) 12:02:32.88ID:42uiz7Ja0
>>674
お前の名誉のために言っておくが、お前の名誉なぞ誰も気にしてないから安心していいぞ
2019/03/10(日) 12:45:51.83ID:kCIB6uhNd
すまねぇ…
2019/03/10(日) 15:42:39.03ID:cKTKsaa/a
int* が型って言うのはどこに書いてありますか?
K&C2版とc99の仕様書見てきたけど、どうしても見つけられないのです。
どこで調べるとint*型や例えばchar*型等の記述を見る事が出来るのでしょうか。
2019/03/10(日) 15:45:20.60ID:GhV81xdk0
>>677
お前さんの定義する「型」ってのは具体的にどういう定義なんだ?
2019/03/10(日) 15:45:33.27ID:vxGXLnY80
ポインタ型ってだけかも知れない
2019/03/10(日) 16:05:52.27ID:+JKmV4RCd
特定の型のポインタは書いてないけど
pointer typeって形で載ってるはず
C11の6.2.5.20とか
2019/03/10(日) 16:10:47.95ID:YmhkZ0UL0
全ての型に付けることが出来て
あたかもメソッド++があるかのように振る舞うオブジェクトの様なものだから混乱する
&や*もやはり何かのメソッドの演算子での表現と見做すと理解が捗る

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

型指定子 int と抽象宣言子の * を合わせてひとつの型名ということになる。
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*型と言うのがわかりません。
2019/03/10(日) 16:44:33.03ID:gHkTxZDuM
>>683
お前さんのいう型の定義では
「signed long long」
は型なのか?型の集合なのか?
2019/03/10(日) 16:49:42.81ID:8+bEWcYF0
>>677
ここだ
ISO/IEC 9899:2011
6.7.7 Type names
3 EXAMPLE The constructions
(a) int
(b) int *
(c) int *[3]
(d) int (*)[3]
(e) int (*)[*]
(f) int *()
(g) int (*)(void)
(h) int (*const [])(unsigned int, ...)
686デフォルトの名無しさん (アウアウクー MM07-LDqw)
垢版 |
2019/03/10(日) 16:55:14.74ID:FM+9nmuqM
C言語を作ったときにあとから型指定のポインタ変数を付け加えたんだろうな。
2019/03/10(日) 17:07:06.47ID:8+bEWcYF0
>>686
ポインタがなかったのばBだ
最初期のCにもポインタはあった
2019/03/10(日) 17:12:13.59ID:eT96hTY3a
voidはなかったんだよな。
どうでもいいけどcdeclはちょっとした型の勉強にはいいよ。
2019/03/10(日) 17:14:55.50ID:eT96hTY3a
685を見ると、「型名を左に書くのが自然」みたいな主張がまったく間違ってることがわかるね。
2019/03/10(日) 18:16:33.04ID:+JKmV4RCd
ポインタ型は派生型(deprived types)の一種で、派生型は他に配列型とか構造体型とかがある(6.2.5.20)
例えば、struct MyStructure {int num;};とかやったとして、struct MyStructureは規格に書いてないから型じゃないって言ってる状況に近いように見えるんだけども
2019/03/10(日) 18:29:23.41ID:49pn/i3ra
*は演算子じゃないという意見は間違っとるよ
2019/03/10(日) 18:38:03.60ID:gHkTxZDuM
>>691
「全ての*が演算子である」
という主張は間違えている。

ということは理解できてる?
2019/03/10(日) 18:54:33.90ID:nutarBhha
演算子ですよ。いや、文字列の中はどうなんだとか言われると困るけど。
xor的な思考しかできないタイプ?
2019/03/10(日) 18:58:19.43ID:LvYeDuRnd
宣言の中の*は、演算子ではないかも知れない。
2019/03/10(日) 19:00:09.92ID:cQhx3jWr0
685 の文中に出てくる * を演算子とみなすのは嫌な感じ
2019/03/10(日) 19:26:26.65ID:8+bEWcYF0
宣言の中の*は演算子ではない
宣言子の構成要素の中のポインタに含まれる記号だ

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

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

右辺、左辺という言い方も嫌い。
2019/03/10(日) 23:11:14.57ID:PFEN9MJxM
>>701
お前の好き嫌いの話だったのか。
規格用語くらい理解して発言しろよ。。。
2019/03/10(日) 23:41:34.29ID:EfIdjxKz0
「俺はこう思う」と「規格にこう書いてある」はきっちり分けて欲しいね。
704デフォルトの名無しさん (ワッチョイ 335f-LDqw)
垢版 |
2019/03/11(月) 00:23:08.11ID:QsQqulf80
英語はsubstituteで意味が広いのに、日本語だとすべて「代入」に翻訳してしまったのか。
2019/03/11(月) 07:09:33.28ID:7fkCOxJ/a
>>684
型指定子の並び

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

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

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

個人的には >>699 の「int a = 3; の = は代入演算子か違うものか」も
ちょいと気になる。
変数定義と代入 int a; a = 3; の省略表記に過ぎないのか、
char s[4] = "yes"; みたいな初期化時の特例になるのか。
2019/03/11(月) 07:54:01.38ID:QaoEDFOQx
変かどうかの主観的な問題ではなく「派生型を定義できる」と決まってるなら、客観的に派生型もやっぱり型だろ。
それを変だと思うならここではなく然るべきワーキンググループに意見すべき。
2019/03/11(月) 07:54:59.22ID:yg4bOGVFd
>>706
それを言い出すと派生型は全部その類に含まれる(そもそも構造体型へのポインタ型とか言い出すと規格に書ける訳もないし)
元々int *って型は存在しないって言い出した流れ(たぶん>>640)はint *も型だって話(>>626)の中にしかなかったと思うからそもそも話がだいぶズレたんだろうな
今の流れはざっと見返した限り>>708がまとめてくれた通りだと思う
2019/03/11(月) 07:55:55.31ID:yg4bOGVFd
>>710
ごめん>>705だった
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への型修飾子並びをもつポインタの派生宣言子型並びとする。
2019/03/11(月) 08:13:54.01ID:U6Vr66LT0
>>707
お前さんが型と呼びたいものはC言語では基本型であって、C言語における型の一部でしかない。
>>707が挙げてくれている通り、基本型と、再帰的に定義される派生型を合わせてすべて型と見なされる。
この定義によって、どんな型をどんな順序で組み合わせようと、ポインタが何段あろうと、どんな名前をつけられようと、定義に再帰的に合致させられるそれらすべてを型と見なせるとあらかじめ定義されている。
2019/03/11(月) 08:29:24.73ID:7fkCOxJ/a
>>713
宣言時の型の話です、元々
int*p;
のint*は型かどうかと言う話です。宣言した結果pの型がint*型に・・
あ、int*は型指定子か、と言えばよかったのかな?
2019/03/11(月) 08:34:48.95ID:m5MHROJsd
逆に「int* 」が型じゃないって考えの人は
int* a
のaの型は何って聞かれたときにどう答えるのか知りたい。
2019/03/11(月) 08:59:57.45ID:+tgFX8Zg0
>>712
「初期化宣言子内の区切り子」っていう言葉がヒントになった。ありがとう。
n1570.pdf (>>1 のリンク参照) 6.7.9 に載ってるね。
英語だから、すらすら読めるわけじゃないけど。

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

だからどうした、って話かも知れないけど、
動作の違いが確かに存在するってのは気分的にすっきりするわ。
2019/03/11(月) 09:18:31.95ID:7fkCOxJ/a
>>715
ごめんなさい、int*は型指定子かどうかと言うべきでした。

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

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

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

あ、その前に、
int*p;
のint*は型指定子じゃありませんよね?私の理解合っていますか?
2019/03/11(月) 10:41:18.26ID:jULKzJ5ia
オブジェクトにもちろん型はあるけど、Cで「型指定子」なんてもんを明確化することに大した意味があるとは思えんね
2019/03/11(月) 10:49:48.10ID:jULKzJ5ia
typeof使うと左と右にはっきり分けて書けるので、好きな人は好きだろう。
typeof(int (*)(void *, char []) hogeobj;
2019/03/11(月) 10:50:24.51ID:rOT48PNA0
>>707
713も言っているように、おまえさん用語の意味を誤解してるんだよ
型は基本型の他に派生型も含まれる用語だ

それから定義の意味もおまえさんおかしいぞ
定義は宣言のうち重複できないものをいう
キーワードは定義できない
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*になりますよね。

型指定子かどうかは重要じゃありませんか?
2019/03/11(月) 18:41:02.08ID:m5MHROJsd
>>717
ありがとう。話のレベルが高くて自分にはもはや質問しかできないが…
724デフォルトの名無しさん (ワッチョイ 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言語のプログラムを作りたいんですが、関数って使いますか?
2019/03/12(火) 14:49:14.15ID:tBEUjULM0
>>724
使いますよ。
726デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 15:08:06.95ID:M/w6PjEFa
宿題は宿題スレがあるのでそちらへ
727デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 15:29:14.81ID:3xf7Y18W0
>>725
分かりました、ありがとうございます。
>>726
どのスレのことか分からないのでそのスレの名前を教えて頂けるとありがたいです。
2019/03/12(火) 15:30:39.97ID:tBEUjULM0
>>727
「宿題」で検索するくらいのことはしろよ……
729デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 15:50:57.05ID:3xf7Y18W0
>>728
検索した上で分からなかったので聞いています
2019/03/12(火) 15:54:56.93ID:aH0w6D4n0
宿題スレって、回答の丸投げだろう
質問に応えるスレではない
2019/03/12(火) 16:35:11.23ID:ZZbwvg6D0
宿題スレ見てきたけど過疎って誰も居なさそうだったけど・・・
2019/03/12(火) 16:37:57.47ID:aH0w6D4n0
依頼があればやってくれるだろう
それ以外に話題がないスレだし
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/
2019/03/12(火) 17:44:27.56ID:f4lS/kh70
>>724
その目的を直接的に達成する標準関数はない
自乗を求める標準関数ならpowというのがあるが
整数を前提とするその問題には適さない
処理の一部を、おまえさんが関数にする可能性ならある

おまえさん、プログラムを作ってくれなんて言ってないよな
変な妄想してるバカは無視していいぞ
2019/03/12(火) 17:52:53.77ID:u0RxZCyHr
入力と表示に標準関数は使うんじゃねって程度かな?
736デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 18:17:50.08ID:M/w6PjEFa
>>729
何でわからないんだよ。どういう環境で使ってるんだ?
737デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:18:02.86ID:3xf7Y18W0
明日テストでその過去問にこのような問題が出て、関数が必要なら諦めようかなと思って質問しました。
スレチだったならすみません。答えてくださってありがとうございました。
738デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:21:35.85ID:3xf7Y18W0
>>736
スマホで専ブラ使ってます。予測はつきましたが、過疎っていたのでそのスレで合っているのか疑心暗鬼でした。今はどのスレのことか分かっています。
2019/03/12(火) 18:26:45.91ID:aH0w6D4n0
ここで聞いて良いよ
2019/03/12(火) 18:34:45.08ID:UkyVoLmHd
>>724
これはifとforの練習問題以外の何者でもなさそうだ。便利な関数使って解いたりしたら先生が泣いちゃいそうw
741デフォルトの名無しさん (ワッチョイ 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と表示せよ。
2019/03/12(火) 18:44:54.25ID:u0RxZCyHr
答えのプログラムが欲しいの?
2019/03/12(火) 18:50:45.53ID:1jGqQ8ze0
候補絞り込みの最短手順を求めるような問題でも無さそうだし力技の総当たり探索で良いんじゃないの?
744デフォルトの名無しさん (ワッチョイ 7705-OS7W)
垢版 |
2019/03/12(火) 18:53:51.90ID:3xf7Y18W0
>>742
答えのプログラムが欲しいです。
2019/03/12(火) 19:00:24.48ID:WBGLmq+B0
>>744
宿題スレに書いてここに書いた場所を報告すれば、問題を解くプログラムを私が書きましょう
2019/03/12(火) 19:25:13.04ID:i1gu3hXZ0
>>744
この程度のプラグラムを自力で解こうとする気が無いなら素直に落第しておけ
747デフォルトの名無しさん (ワッチョイ 7705-k7ao)
垢版 |
2019/03/12(火) 19:36:11.90ID:3xf7Y18W0
>>745
C/C++の宿題片付けます 170代目
https://mevius.5ch.net/test/read.cgi/tech/1456911928/

このスレに問題書き込みました。29番目のコメントです。
2019/03/12(火) 20:13:37.41ID:fue8lGKw0
なんかヤバイ奴で草
2019/03/12(火) 20:37:17.45ID:OWFMR/J/0
ただの全探索じゃん…
750デフォルトの名無しさん (アウアウウー Sac3-hLQV)
垢版 |
2019/03/12(火) 20:55:37.42ID:M/w6PjEFa
いいんじゃないの?恐らく数学的になんとかしようとするとコンピュータ使わずに解が出て終わってしまうだろうし。
2019/03/12(火) 21:33:45.13ID:fue8lGKw0
>>750
??
752デフォルトの名無しさん (ササクッテロ Spc7-OS7W)
垢版 |
2019/03/12(火) 21:37:28.98ID:foIxPF9Op
もう取り繕う理由ないからタメ語で話すけど
簡単な問題に関してめっちゃレスしてしまってすまんな
明日のテスト頑張ってくるわ
説明してくれた人皆ありがとノシ
2019/03/13(水) 10:38:00.71ID:qAReO6hg0
>>752
手を煩わせたんだから 良かれ悪かれちゃんと結果報告には来いよな
幸運を祈ってやる
2019/03/13(水) 15:02:14.09ID:NOmoz09Zp
>>753
ありがとう
さっきテスト終わったけど微妙だった
合格の可能性ワンチャンあるけど、期待はしない方がいい
多分来週に結果が分かると思う、遅くても今月以内
結果が分かった時に報告する
2019/03/13(水) 18:27:05.40ID:Gm1xMrEed
>>754
テストに落ちたらどうなってしまうんや……
2019/03/13(水) 21:09:52.65ID:STGkCaiX0
課題を出されましたが、全くわかりません
このプログラムを作っていただけませんか?
スレ違いなら誘導をお願い致します


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

尚、数値は100個以上格納できるものとします。
2019/03/13(水) 21:26:02.50ID:P84Y9tDKa
>>756
少し遡れば宿題スレのリンクがある
2019/03/14(木) 06:00:16.00ID:SGfhnH0M0
>>756 宿題スレッドへのリンクは >>733 な。今のところまだ有効。

携帯端末(小さい画面)のせいか、スレッドを遡って読むのが難しい人の
質問が増えたようだけど、そういう閲覧環境だと、質問に対する回答の
ソースリストを読むのも一苦労な気がするなぁ。
2019/03/14(木) 06:58:22.51ID:6NSPfC1dd
>>757>>758
誘導ありがとうございます
上のスレの方に行きます
2019/03/16(土) 19:25:45.05ID:QzqNYN9X0
>>758
ソースを何らかの方法で PNG なり JPEG なり GIF なり
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);      こうしてみた
 }

すると
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・っと無限に続いて
2019/03/17(日) 00:35:16.47ID:dzL2D1Cha
なんで止まらないんでしょ?
2019/03/17(日) 00:37:54.05ID:aA4z/LNt0
>>761-762
str が NULL になることは無いので。
配列として確保した str の「場所」は中身が何であろうと同じ場所にある。
2019/03/17(日) 00:43:34.56ID:dzL2D1Cha
>>763
もすこしだけおしえてください
fgetがfpに指定したというか登録したファイルから指定数読み込んで、それをpに渡して…
このときに文字終端ならpにNULLも渡ってそれでwhileの条件に合致して止まると思いまして ←ここまであってますか?

なら、pに渡さんでもfgetsが読みに行ったときにもう読む行ないならNULLも引っさげて帰ってくるからstrにNULLがはいってて
じゃーああいうふうに掛けばpいらねんじゃね?と思ったんですがなぜこれだとNULLはいってないんでしょ
2019/03/17(日) 00:48:28.87ID:hO+9vtK70
printf("%s", str);
memset(str, 0, sizeof(str));←これ入れてみ
fgets(str, 500, fp);

どうしてかは、自分で考える
2019/03/17(日) 00:50:56.68ID:aA4z/LNt0
>>764
str が「どこにあるか」と「何が入っているか」は別物。
NULL と比較するのは「どこにあるか」であって、中身とは関係ない。
何度ループしても str の場所は同じなんだよ。
2019/03/17(日) 00:56:16.34ID:/bg4Vz3i0
配列名strは先頭要素のアドレス&str[0]と同じ
strの評価結果は常に同じアドレスを返す
配列が正常に確保されている限りNULLになることは無い
2019/03/17(日) 00:56:29.02ID:dzL2D1Cha
>>765
>>766
うぉあー 小一時間なやんできますありがとうございました!
2019/03/17(日) 00:57:37.07ID:dzL2D1Cha
>>767
NULLがなにかよくわかってないことがよくわかりましたw いってきます
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);
とかやってアドレス表示させて途中と最後比べてみたら感覚的に分かるかも
2019/03/17(日) 04:30:49.94ID:SA4RHMx10
fgets の戻りは ポインタである必要は無く、int (bool) でいいと思うんだ
printf("%p\n", fgets()) のように直接重ねても、ファイルエンドでぬるぽ踏むわけだし
2019/03/17(日) 05:46:27.76ID:57obmdS/a
int返したらprintfに食わせられないじゃん
2019/03/17(日) 06:11:49.28ID:lbYyU/s40
そんなことしねえから大丈夫
2019/03/17(日) 15:32:50.89ID:aA4z/LNt0
暗黙の型変換で配列がポインタになるってのが諸悪の根源なんだよな。
まあそれでだいぶん書くのが楽という面もあるんだけど、
この手の思い違いが連発するのはやっぱりどこか良くない設計だったのかもなと
思わないでもない。
2019/03/17(日) 16:10:49.52ID:/bg4Vz3i0
配列名や関数名はアドレスを指しているというだけであって暗黙の型変換とは無関係
2019/03/17(日) 16:16:25.40ID:aA4z/LNt0
>>775
配列名は配列型を指すし、関数名は関数型。
それがアドレス (ポインタ) になるのは暗黙の型変換による。
2019/03/17(日) 16:36:25.05ID:/bg4Vz3i0
>>776
https://ideone.com/2hzQXi
2019/03/17(日) 16:51:58.33ID:aA4z/LNt0
>>777
int[10] が int* 型に型変換されたり、 void(void) が void(*)(void) になったりするという暗黙の型変換の結果だね。
2019/03/17(日) 17:12:17.93ID:/bg4Vz3i0
>>778
配列Array[]の型はint[]型であるけど、配列名Arrayの型はint*型(値は&Array[0])
関数Func()の型はvoid(*)(void)ではあるけど、関数名Funcの型はvoid*型
暗黙の型変換など関係なくポインタに代入出来る
2019/03/17(日) 17:24:35.69ID:VrxWLsvb0
配列と配列名を別物としているようだけど、それなら配列と配列名を暗黙変換しているわけだろう。
2019/03/17(日) 17:32:23.78ID:/bg4Vz3i0
配列Array[]と配列名Arrayは別のオブジェクト
配列名Arrayは配列の先頭要素のアドレス&Array[0]と同一オブジェクトの糖衣構文
2019/03/17(日) 17:47:18.78ID:aA4z/LNt0
>>781
それは明らかに間違った理解。
これ以上の説明はしないので仕様を読んで。
2019/03/17(日) 18:28:05.39ID:mpr7j0a20
結局何が正解なんだ
2019/03/17(日) 18:33:42.80ID:SA4RHMx10
sizeof の時に区別していない/区別できないのなら 糖衣構文でも納得できるんだがね
2019/03/17(日) 20:04:24.76ID:lW9CTxpwd
T型の配列は一部の例外を除き「配列の先頭の要素を指すT型へのポインタへと型変換される」(C11 6.3.2.1.3)
だから暗黙の型変換で間違いない
2019/03/17(日) 20:47:21.33ID:lbYyU/s40
>>774
左辺値変形が諸悪の根元だと?
じゃあ printf(&"Hello world"[0]); などと書かされるのが
おまえさんの望みなのか
2019/03/18(月) 01:00:19.91ID:YfgH0B4l0
>>786
繰返しになるけど、暗黙の型変換で書くのが楽になってるのは承知してるんだってば。
ただ、初心者が (時にはベテランでも) 変な理解をしがちな理由はこれだろうな
っていう意味での根源は暗黙の型変換にあるっしょ。
2019/03/18(月) 04:00:43.39ID:P9Yklj5Ga
おじゃまします
printf("[%s][%d][%p]\n", str, str, &str);

こう表示させたとき%sと%pに出る値は意味わかるのですが(文字列とアドレス)
はわかるのですが%dに出る数字の羅列はなにになるんですか
2019/03/18(月) 04:05:51.06ID:YfgH0B4l0
>>788
str は char の配列ということでいい?
だとするとアドレス。

str が配列であれば str と &str はアドレス値として見れば同じになるはず。
型は違うけど。
(整数への変換で何が起こるかは言語仕様でははっきりした規定は無い
ので、表現が変わってしまうことな無いとは言えない。)
2019/03/18(月) 04:51:21.12ID:P9Yklj5Ga
>>789
なるほど!
値が違ったのでアドレスじゃないのかと思いましたの
%dと%pではアドレスの表現が少し違うという解釈でよさげですね
いつもありがとうございます
2019/03/18(月) 06:31:42.89ID:YfgH0B4l0
>>790
表示が違うのは %p は16進表示になってるとかじゃない?
2019/03/18(月) 06:49:00.10ID:lirXey68a
単に%dだからアドレスの10進表記になると思ってだけど、はっきり決まってはなかったんだ。
2019/03/18(月) 07:14:51.68ID:/H01vbo60
>>787
そういう諸悪の根元なら左辺値変形ではなく
関数仮引数で空の角括弧を許していることだろうが
2019/03/18(月) 07:38:07.69ID:lirXey68a
まぁ、双方明示的に(個人の感想です)strとキャストすべきなんだろうな。
795デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/18(月) 14:12:42.17ID:1gtRswz3a
ポインタに対してprintf()で%d指定した時ってアドレスがちゃんと出るって保証されてたっけ?
2019/03/18(月) 14:15:34.40ID:BO4wFGSe0
voidのポインタの便利さに気づきました
こんな私に何かアドバイスはありますか?
2019/03/18(月) 14:23:43.30ID:27d4/ixp0
次は汎用ポインタの不便さ面倒臭さに気付きましょう
2019/03/18(月) 14:23:54.47ID:mCQ8i9jz0
横質問で申し訳ない


NULL の実際の値
'\0' の実際の値

は実装依存ということで間違いない???
2019/03/18(月) 14:29:25.93ID:xzOI+WOH0
>>798
はい、間違いはございません
2019/03/18(月) 14:46:34.54ID:O3z3BOLxa
'a' の実際の値は決まってるとでもいうのか
2019/03/18(月) 14:57:23.82ID:YfgH0B4l0
>>795
保証されていない。
というより、値がアドレスには違いないのだけど
その表現がどうなっているか未定義なので、
意味のある値なのかどうかはわからない。
(常識的にはデタラメな値ということもないだろうけど……)

整数とポインタの関係について確実に保証されているのは、
ポインタをポインタのサイズより大きい整数型に入れたなら、
元の型にキャストしなおすと変換前と等しいってことくらい。
2019/03/18(月) 14:59:53.22ID:mCQ8i9jz0
>>799
即レス感謝です
2019/03/18(月) 15:01:51.19ID:mCQ8i9jz0
>>800
実装として、ASCIIとEBICDIC以外で「これは認識してないとダメ」なものがあれば御教示くださいませんか?
2019/03/18(月) 15:50:43.53ID:h9s8r5rIa
一部の文字が示す値の連続性の保証があったような
2019/03/18(月) 15:56:04.05ID:YfgH0B4l0
>>804
数字 ('0'〜'9') に対応する文字コードが連続する保証は有る。
2019/03/18(月) 16:33:31.22ID:CWr9PpIQ0
'0' 〜 '9' で挟んで '0' で引き算するのは保障されてるので成立するけど
'a' 〜 'f' , 'A' 〜 'F' で挟んで - 'a' + 10 や - 'A' + 10 は保障外のコードになる と。
2019/03/18(月) 17:09:05.92ID:yKiI4G/I0
>>801
未定義じゃねえ処理系定義だ
未定義に該当するためには何らかの禁止を破らねばならない
禁止を破っていないのに決まっていない事項は未規定
未規定のうち文書化されるのが処理系定義だ

先輩方が変な言葉遣いをするから
若いのが勘違いするんだよ
気をつけな
2019/03/18(月) 17:42:10.10ID:mCQ8i9jz0
>>807
「処理系が必ず定義しなければならない」
「純粋に処理系依存なので、規格としては何も触れない」

この違いがイマイチ良く分からんのですが
2019/03/18(月) 17:56:16.31ID:1YRHAy75a
>>803
ないです
都度確認すればいい
2019/03/18(月) 21:11:30.38ID:yKiI4G/I0
>>808

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

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

わかってないんなら、ちゃんと規格票で確認しとけ
2019/03/18(月) 23:08:12.32ID:wuyTgyGr0
>>795,801 ポインタの表現形式とは関係なく、未定義の動作になります。
https://www.jpcert.or.jp/sc-rules/c-fio47-c.html

実際の処理系での挙動を説明しようとするとポインタの表現形式で説明が付く
ことが多いだろうとは思います。
2019/03/18(月) 23:15:18.00ID:5t+N6Jn90
C11 7.21.6.1.9で「変換指定子が不正である場合の動作は未定義」ってあるね
処理系定義は%pの時のポインタの値の表現形式と間違えてないか
2019/03/18(月) 23:23:41.88ID:wuyTgyGr0
>>810
規格で「何も」触れられていないのは未定義 (undefined) なのでは?
禁止を破るほか、規格に定めのないところの動作も含まれます。

規格で示される選択肢のうちのどれを処理系が選ぶかが定められておらず
処理系任せ(文書化も不要)なのが未規定 (unspecified) かと。
2019/03/19(火) 08:12:11.66ID:qtB10olYM
自分はc言語とc#(pcツール開発用途)使うけど、
c言語は仕様がコンパクトで、このスレのような議論があって面白いな。
c#はライブラリが充実してて凄く便利
2019/03/19(火) 09:23:10.29ID:LKFNCpsT0
>>813
嘘つくんじゃねえ
規格で触れられていない事項は未規定だ
未定義は「知るかボケてめーが悪いんだろうが」という意味の用語だ
2019/03/19(火) 10:26:28.12ID:gyYe55lf0
>>815
http://kikakurui.com/x3/X3010-2003-01.html#9
> この規格の制約以外の箇所で現れる…(し)なければならない又は…(し)てはならないという要求をプログラムが守っていない場合,その動作は未定義とする。
> この規格では,このほかに,用語 未定義の動作を使うことによるか又は動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
> これらの三つの書き方は強調度において何ら変わりはなく,それらはすべて未定義の動作を規定する。
2019/03/19(火) 11:35:26.58ID:71/TIYaC0
未定義な動作っていうのはプログラムが未定義な動作をするわけじゃなくて
コンパイラー製作者が決める動作が未定義だから好きなように動作を決めれるってことだぞ
2019/03/19(火) 11:43:35.24ID:LKFNCpsT0
>>816
こちらの指摘を認めたんだな?
2019/03/19(火) 12:40:50.73ID:/V+FXtnWM
ID:LKFNCpsT0は言語仕様の前に日本語を勉強すべき

> 動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
2019/03/19(火) 13:28:08.89ID:LKFNCpsT0
>>819
未定義とは何かの本文は「3.4.3 未定義の動作(undefined behavior)」だ
おまえが出してきているのを、この本文に対する補足説明と理解して読み直してみろ
2019/03/19(火) 17:11:50.12ID:qa7ql0+P0
>>816
> 未定義の動作を示すこともある

https://www.jpcert.or.jp/sc-rules/c-msc15-c.html
http://www.c-lang.org/detail/undefined_behavior.html

「この辺読んでおけ」ってかんじですか
2019/03/19(火) 17:56:13.66ID:CsLrwzwwd
>>815
JIS X 3010:2003 3.4.3
未規定の動作(unspecified behavior) この規格が,二つ以上の可能性を提供し,個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。

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

一応選択肢は与えてるように見えるな
2019/03/19(火) 18:02:59.01ID:LKFNCpsT0
「異常なプログラム」、「正しくないプログラム」、「正しくないデータ」

このへんのキーワードが、なぜ「未定義の動作」という用語をわざわざ作っているのかの存在意義だ
他の「処理系定義の動作」や「未規定の動作」と見比べてみな
「未定義」だけ異質な点はただ1つ
2019/03/19(火) 19:53:17.00ID:/V+FXtnWM
>>820
あほか、そこに「正しくないプログラム構成要素」って書いてあるだろ
規格には正しいプログラムの定義は書いてある
書いてないことは全て正しくないプログラムだよ
そもそも全ての未定義を定義できるわけないことぐらいはアホでもわかるだろw
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の結果がなぜそうなるのかちゃんとは分かっていません。
なぜそうなるのか分かるサイト等あれば教えてもらえませんか?
826デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/19(火) 20:58:40.16ID:BI7+7Q7/a
>>825
C++ は extern "C" {} のブロック内にC言語書かないと駄目なんじゃなかったっけ?
で、C++って同じ関数名で引数の違う関数作れるよね。だからCと見た目そっくりでも作られるコードが少し違うんじゃないの?
2019/03/19(火) 21:04:51.38ID:Dro8a+Ew0
Cは関数名がそのままシンボル名になるけど
C++のほうは関数名に引数の型情報が付加されたmanglingされたシンボル名となるので
リンカーでリンケージする際に区別してる
C++ から C 関数を呼ぶには 明示的に extern "C" と宣言されてないとその機構を突破できない


んじゃなかったかな
2019/03/19(火) 21:13:55.37ID:45LJYysD0
>>825
c++ から c の関数を呼ぶのなら extern "C"
829デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/19(火) 21:14:21.98ID:BI7+7Q7/a
おお。多分そうだ。
あとはもっと詳しい人に任せた。
2019/03/19(火) 21:17:38.17ID:45LJYysD0
途中で投げてしまった
私がはまったのは、win32api で、 ::RegisterClass() にて登録する WindowProc を extern "C" しなかったために、凄く困った記憶があります
2019/03/19(火) 21:45:25.26ID:zmaQJWrD0
>>825
main()からcallされるasm用関数名が違うのでは

FuncC.c func() ---> funcC()
FuncCpp.cpp func() --> _Z4Funcv()
main.c call func() ---> call func()
main.cpp : call func() --> call _Z4Funcv()
2019/03/19(火) 22:56:54.72ID:ieOLeRQla
まんぐり
833デフォルトの名無しさん (ワッチョイ 6f02-B/CD)
垢版 |
2019/03/19(火) 23:56:04.61ID:ni3gZ2OF0
>>825
これ読めばわかるかな。
https://www.wagavulin.jp/entry/2017/02/09/215036
2019/03/20(水) 05:59:53.51ID:Jx7dUCON0
>>824
規格では正しくないプログラムをill-formedという
つまり正しくないプログラムも記載されているということだ

別に規格に限ったことではない
あるものが何であって何でないという境界を明確化するのは
ごく当たり前のものの書き方だ
2019/03/20(水) 06:44:57.57ID:nNN3jHgVM
>>834
> あるものが何であって何でないという境界を明確化するのは
すでに明確だろ?
「正しいプログラムでないプログラム」は「正しくないプログラム」
正しいプログラムの定義は書いてあるから境界はすでに明確だよ
ill-formedとかの名前がどうのこうのは関係ない
2019/03/20(水) 06:54:48.64ID:Jx7dUCON0
>>835
もうやめろ見苦しいから
2019/03/20(水) 07:09:56.04ID:nNN3jHgVM
>>836
見苦しいのは>>834だろ
なんのためにill-formedとか言い出したんだ? w
2019/03/20(水) 07:25:49.13ID:Jx7dUCON0
どっちが見苦しいか他の連中に聞いてみな
2019/03/20(水) 08:12:13.89ID:SCVZEQpp0
「未定義」と「不定」については Phinloda さんの↓も分かりやすいね。
少々古いのが難だけど、内容は今でも正しいと思う。

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


ところで、「不定の動作」であるが「未定義ではない」、
しかも「不定であることの影響をユーザが見ることができる」
コードの例って何かあるだろうか。
ちょいと考えてみたけど、不定の影響を見るために何かすると
そのせいで未定義の領域に突入しちゃうんだよ。
2019/03/20(水) 08:12:56.46ID:nNN3jHgVM
>>838
どう見てもお前だろ
そもそも内容についてレスできないなら黙ってなよw
2019/03/20(水) 09:01:05.62ID:xVgsTWI1M
>>839
少し前に誰かが書いてた関数の引数の評価順序とか
2019/03/20(水) 09:38:01.32ID:Jx7dUCON0
>>840
推測してんなよ
第三者に聞く勇気がねえの見え見えだぜw
2019/03/20(水) 10:13:53.38ID:nNN3jHgVM
>>839
foo(), bar()でなんか画面に出力するとかして
その例にある
a = foo() + bar();
でいいんじゃね?
2019/03/20(水) 10:14:13.87ID:nNN3jHgVM
>>842
はいはい、一人で吠えてろよw
2019/03/20(水) 10:40:40.56ID:3Av4Lhjq0
>>839には未定義は間違いと書いてあるけどそれは間違いで
未定義が間違いか間違いじゃないかを決めるのも未定義だから
未定義が間違いというのも間違いなんだよな
2019/03/20(水) 10:45:39.91ID:L8bJW9Z40
未定義たぁ不定野郎だ
2019/03/20(水) 12:24:13.19ID:nNN3jHgVM
>>845
そういう話をしたいならまずは君の言う「間違い」とやらをきちんと定義してくれ
2019/03/20(水) 12:34:48.75ID:3Av4Lhjq0
そもそも間違いを定義したくないから未定義にしたんだから定義できるわけないよな
849デフォルトの名無しさん (アウアウウー 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 細部に注意を払っていない
2019/03/20(水) 15:33:42.99ID:Jx7dUCON0
>>847
何が間違いか、はっきり丁寧に説明してやっても
結局、自らの間違いを認める潔さを絶望的に欠いていて
まったく話にならない痛いやつであることを
ここの連中は目の当たりにしたばかりなんだが
2019/03/20(水) 15:42:05.78ID:3Av4Lhjq0
>>850>>849の9番のサインがあるからログラミングにむいてないな
2019/03/20(水) 15:53:53.83ID:knvp6QUa0
ワロタw
2019/03/20(水) 15:57:42.67ID:+9jdpzuGx
>>851
>ログラミング
10番のサインあり。
2019/03/20(水) 16:28:25.34ID:Jx7dUCON0
ブーメランぶっ刺さってやんのwww
2019/03/20(水) 16:36:56.04ID:Jx7dUCON0
日本語を勉強すべきだの、あほかだのと、無礼な態度は若気の至りと
こちらは目を瞑って色々と箇条番号やらキーワードやら出してやってたが
そろそろ見限る頃だな
2019/03/20(水) 16:44:53.17ID:fwuhbGCo0
暇でないなら、直ちに見限るべき
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() を差し込んでも動作が変わらないように
うまくライブラリが作られてると思うけどね。
この投稿の趣旨は、「不定の動作であっても、結果を使うだけなら
プログラムとして正しい。しかし、不定の動作の内実を探ろうとすると、
その活動によって未定義動作を含んだプログラムになってしまう」っていう
不確定性原理みたいな何かが規格に仕込まれてるんじゃないか、という疑い。
(別に陰謀論をブチ上げようって意図はないので安心してくれ)
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);
}
この例では未規定の動作を含むが
その未規定がどう転んでも影響がない、
つまり依存していないので未定義の動作とはならない
2019/03/20(水) 17:46:07.38ID:Jx7dUCON0
というわけで、printfで実行順序を見てやろうという目的なら
どちらが先でも、その目的が達成できるので未定義の動作ではない
2019/03/20(水) 17:52:06.04ID:11QE5ZAQ0
>>857
printf(..., printf(), printf()); こういうのとは違って
仕込んだ printf() の完了点はあくまで文末の; であって
printf() の内部状態変遷による未定義は踏まずに済むような気がする
2019/03/20(水) 18:12:44.03ID:K9L8gFp50
>>859
いや、 >>857 が言ってるのは、
printf の中のバッファなどの状態管理で同一の変数を破壊しないって保証ある?
ってことだと思うんだが。
2019/03/20(水) 18:13:55.67ID:xQ4G2GlCd
毎度だけど話がズレるんだよな
>>810に対して>>813で「規格内で触れられてないのは未規定じゃなくて未定義じゃね?」って物言いがついた(未規定の動作は>>822
で、>>816が「規格内で触れられてない場合も未定義」って言おうとしたんでしょ
>>823でなぜか未定義動作は異常(不正)なプログラム云々言い出したので話が分からなくなったんでは?
2019/03/20(水) 18:18:36.19ID:fE2Kl8w7d
冷静な議論ならともかく、レスバ状態になると各々有利な立場になろうとしてだんだんと話が逸れてくんだよな。
2019/03/20(水) 18:27:17.55ID:Or7antuS0
「レスバ状態」というのは「レスバトル状態」の意味ということでよろしいか
20世紀の「レスって何」を思い出すが…
2019/03/20(水) 18:30:12.38ID:fE2Kl8w7d
>>864
yes
2019/03/20(水) 18:35:51.85ID:nNN3jHgVM
>>857
2回以上変更しなきゃいいんなら
int i=0;
int a[2]={0,0};
int foo(void){i=1; return 0;}
int bar(void){a[i]=1; return 0;}
でいいんじゃね?
a[0]=0; a[1]=1; ならfoo() ⇒ bar()
a[0]=1; a[1]=0; ならbar() ⇒ foo()
の順
2019/03/20(水) 19:15:28.64ID:Jx7dUCON0
>>861
printfが持つ状態って具体的に何だ?
妄想しだすとisdigitみたいのまで状態を持つことを考慮せねばならんのだが
2019/03/20(水) 19:18:49.33ID:SCVZEQpp0
>>857>>861 の意味で書いた(前半部分が余計だったのかも)。
最初の4行のコード foo(), bar() に printf() が仕込まれてない方は
「不定」だが「未定義ではない」。

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


>>866 これは巧妙だし、思いつかなかった。
考えてみる(調べてみる)ので少々時間をくれ。
2019/03/20(水) 19:22:36.34ID:TUtYbyGsM
>>867
端末になにか表示されている、ファイルに文字が追記されている、というのが「状態」だよ。
2019/03/20(水) 19:25:59.48ID:nNN3jHgVM
>>868
ID:Jx7dUCON0はスルーでいいよ
レスの内容が頓珍漢すぎる
2019/03/20(水) 19:39:28.59ID:Jx7dUCON0
>>869
つまりstdioさらにはデバドラがRENTかREUSかって問題ということで
じゃあ別プロセスでprintfを使われたら未定義動作ならHello worldすらill-formedって話だな
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回以上変更している場合、
 又は変更した後で新しい値を得ること以外の目的でそのオブジェクトを
 アクセスしている場合。
の部分と思われるが、ちょいと分かりにくいね。
…いや、自分で紹介しといて、その言い草はないだろ、と我ながら思うけど。
2019/03/20(水) 21:33:10.02ID:SCVZEQpp0
>>867 返答が前後して失礼。
printf() が持つ(かもしれない)状態ってのは、例えば
出力バッファ(fflush() で強制的に吐き出させるアレ)の
使用量を管理するカウンタかポインタか、そのあたりを考えてた。
もちろん stdout のバッファリングを禁止すれば、この場合に
printf() を安全に使えると考えてるわけでもないのだけど。

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


>>849 の 3, 6 あたりに該当してきたので、本日はここまで。
…というか「バーナム効果」って奴じゃないの?
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;}
でいいと思う
2019/03/20(水) 22:13:24.28ID:47yan6gC0
なにやら話がややこしい方向に行ってるけど、
そもそも関数の呼び出しは副作用完了点だぞ?
876デフォルトの名無しさん (アウアウエー Sac2-v7M6)
垢版 |
2019/03/21(木) 10:46:08.11ID:Jl2vA9O/a
C言語初心者です。
やっとポインタの学習にさしかかったところです。
C言語におけるポインタという概念と、
メモリの間接アドレス指定とは似ていると思ったのですが、
この感覚は間違っていますか?
2019/03/21(木) 10:57:18.81ID:BSODtxQx0
間違ってないです
2019/03/21(木) 12:29:28.54ID:hA8AO9It0
>>876
いいセンスです
2019/03/21(木) 12:35:12.10ID:QKEEZEuZ0
ポインタの理解の前にメモリ間接アドレス指定をご存じな人ってすごいw
2019/03/21(木) 12:42:31.97ID:A52ypKFV0
>>879
ベーシック、アセンブラの順にやってきたら
だいたい理解はできているもんじゃないの?
2019/03/21(木) 12:56:03.12ID:0TbsGGEWd
今どきその順番で始める初学者がどれだけいるのかね
2019/03/21(木) 13:15:33.98ID:y6QadYkWa
>>877
>>878
恐縮です
学習の中でつまずいたらまた質問させてください

>>879
>>880
間接アドレス指定のほか直接・相対・即値…などは
基本情報技術者試験の勉強範囲になっているので知りました
C言語もきっかけは基本情報の対策として取り掛かったものです
残念ながらBasicもアセンブラも手付かずです
2019/03/21(木) 14:04:09.43ID:u3ljjJr7a
まだCASLとかあんの?
2019/03/21(木) 16:01:46.89ID:hWT+U/v40
>>883
おいおい

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_hanni_skill.html#yougo
https://www.jitec.ipa.go.jp/1_13download/shiken_yougo_ver3_1.pdf

探すのに2分掛からなかったぞ…
2019/03/23(土) 02:49:51.66ID:OxlPANCja
セミコロン2つ並ぶのってどういう意味でしょ?最初は誤植かとおもいましたが

for(i = n;;){ ←ここ
if(strcmp(hogehogehogehogehoge
2019/03/23(土) 03:00:16.33ID:lRnozO4Da
for のかっこの中は二個あるじゃん、いつも
2019/03/23(土) 03:14:04.86ID:0Wp5e8jo0
>>885 で for ループを使う必然性って何だろう
while でも良いように見える
2019/03/23(土) 06:01:58.96ID:fQCcwCLn0
>>887
while (1) {
は warning が出るコンパイラもありますので
for (;;) {
を多用しています…
2019/03/23(土) 06:17:45.22ID:jegHMgvE0
確かに for (i = n;;) /* 初期化あり, 継続条件なし, 更新なし */ よりは
i = n; // 初期化
for (;;) // 無限ループ, 終了判定はループ内
の方が for の使い方では見慣れた書き方だよな。

というか for (i = n;;) を見せられたら、いったん立ち止まって
頭の中で2行分けに翻訳して理解すると思うわ。
2019/03/23(土) 06:25:51.88ID:2BzPzaMr0
while(1) に難癖つけてくるコンパイラって具体的に何だ?
2019/03/23(土) 06:42:04.57ID:WDi4jE890
HPUXだった気がす
2019/03/23(土) 07:22:12.89ID:0Wp5e8jo0
https://www.sejuku.net/blog/25197#continue



if(i + 1 < 3) {

と書かれていて i < 2 でないのは何故でしょうか
先進的なコンパイラだと自動的に最適化されるものなのでしょうか
2019/03/23(土) 07:38:42.49ID:lQ0YIRmF0
while (1 == 1)
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 との比較になってた。
2019/03/23(土) 08:08:46.89ID:2BzPzaMr0
>>891
情報ありがとう
希ガスってことは昔の話だよな
2019/03/23(土) 08:09:19.77ID:2BzPzaMr0
>>893
それを言うなら while(!0) だろ
2019/03/23(土) 08:16:45.51ID:hkiXoQ0jd
everlasting的な英単語を1でdefineしてwhileに突っ込んで無限ループ作ってるコードなら見たことある
却って分かりにくかった
2019/03/23(土) 08:20:29.61ID:3KsHUf0Y0
>>897
悪いなのび太、それ単体試験用のマクロなんだ
2019/03/23(土) 08:30:38.60ID:2BzPzaMr0
#define forever while(1)
これでええやん
2019/03/23(土) 14:07:37.70ID:OxlPANCja
知りたいことが答えてもらえないが文脈からさっすると
for(i = n;;)は ;; こいつが無限ループさせる whileのときの (1)みたいなもんなんかな
そうなると i = n って表記は i が nといっしょやったらずっと無限ループしとけってことになるんかな
んーそうう考えると for(;;)だったら無条件でループやっとけって感じでつかえそうだけど i = nならとかなんか条件はいるなら ;; こんなん
つかわんでももっと他になかったんじゃろかと思うな。 しかしこのテキスト何の説明もなくいきなりあんな技使いやがってやぶりすてたろか
901デフォルトの名無しさん (ワッチョイ 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++) {
 /* 何かの処理 */
}

特別なのは終了条件が空の場合は終了させなくなる事だけ。
902デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/23(土) 14:23:33.00ID:Bvojjkpo0
for 分じゃない for 文だ。
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個)は、
携帯端末で見分けにくかったりするのかな。
自分では新式の装置を使わないので、そういう部分に思い至らなくてな。
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の勉強を始めたばっかりです
2019/03/23(土) 16:34:57.54ID:UrlZPLWE0
まさか毎回シード関数呼んでるとか?
2019/03/23(土) 16:52:06.42ID:2BzPzaMr0
>>904
time(NULL) は1秒以上の実行間隔がないとアウト
それ以外の何らかエントロピー源を使わにゃならんということだ
たとえばスペシャルファイルの/dev/randomだとか、
Core-i7ならrdrand命令を使うとか
2019/03/23(土) 17:11:16.47ID:beYYYDPta
まあシステム由来のシードを使えばいいんだけど、分布・周期が問題なんだから同じ数字が出てきてもいいんじゃない?
シミュレータってそういうもんですよ。
2019/03/23(土) 17:26:50.18ID:jegHMgvE0
>>904
乱数値を1個だけ返すコマンドを作成、シード値に time() を使用。
同じ1秒の間に何度もコマンドを呼ぶと同じ値しか返ってこない。
次の1秒も(さっきまでと違う値だが)同じ値が何度も返ってくる。
…という話なら、しごく当然だね。

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

シミュレータの方はVBAで続けて、乱数だけCのコマンドを使うって方針なの?
2019/03/23(土) 17:31:41.38ID:2BzPzaMr0
それだけのためにCOM作るとかアホくさくね?
2019/03/23(土) 17:44:46.83ID:jegHMgvE0
>>909 それはその通りだね。
VBAはWindowsで動かして、CentOSの方では「乱数サーバ」を回す、
というクライアント・サーバ・モデルも何か変な感じだし。

だから、全面的にCentOS上のCでの開発に移行する準備として
乱数ルーチンのテスト用に値1個だけ返すコマンドを作ってみたら、
「立て続けに呼ぶと同じ値しか出ないぞ」と心配になったのかな、と。
2019/03/24(日) 11:20:48.13ID:ac/Kn2Xnp
>>752だ、報告遅くなってすまん
合格してた!!!
俺に教えてくれた人達、本当にありがとう
勉強してC言語はよく分からんってことだけ分かったわ
2019/03/24(日) 11:21:36.49ID:ac/Kn2Xnp
ちなみに不合格だと必須科目だから同じ科目をもう一回受講しなきゃいけなかった
2019/03/24(日) 11:28:18.02ID:5d/S++S30
>>905
たぶんそれ
2019/03/24(日) 12:24:06.58ID:fqkT23RA0
>>912
むしろそれなら不合格でちゃんと勉強したほうが良かったような?
2019/03/24(日) 13:17:04.74ID:YLYVMPlgd
情報系じゃないのに共通科目とかで必須指定されてたりしたら単位だけもらっても問題ないんでね?
916デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/24(日) 13:39:30.48ID:ynFGlX0q0
>>911
おめ
2019/03/25(月) 16:27:08.09ID:7UyvjyQO0
dfコマンドの -h オプションみたいな
数値をヒューマンに優しい表現にしてくれるライブラリって
ありますか?

ddみたいに、ヒューマンから数値にしてくれるやつも欲しい
2019/03/25(月) 19:21:21.61ID:Dver3QI+0
log A / log 10 とって 10の累乗数出して 3で割って近場の補助単位を選択
(ヘクトとかデシとか 3の倍数じゃないのは 知らんw)
919デフォルトの名無しさん (アウアウウー Sa2f-7Ozv)
垢版 |
2019/03/25(月) 20:44:43.02ID:T0osdeZXa
ライブラリは知らんなあ。
でも簡単だから作っちゃうなあ。
あ、そうだ。お題スレのお題にするか。簡単すぎて馬鹿馬鹿しいかも知れんが。
2019/03/25(月) 22:42:17.42ID:kHZO8Xph0
ライブラリは知らんなあ。
でも簡単だから作っちゃうなあ。
あ、そうだ。お題スレのお題にするか。簡単すぎて馬鹿馬鹿しいかも知れんが。
2019/03/25(月) 23:52:18.38ID:ECmJs6xT0
あれ?何故2重に書かれている?ま、いいか。
922デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/26(火) 00:15:09.07ID:xyG5xdoY0
>>917
お題にした。
https://mevius.5ch.net/test/read.cgi/tech/1549160513/779
やがて色々な言語で答えが書かれると思う。
2019/03/26(火) 08:54:20.26ID:JLA/sJXB0
あれライブラリ化されてるのかと思ってたけど無いのか
意外とあちこちのコマンドで出てくる仕様だし
汎用的なのがあると思ってた
2019/03/26(火) 13:28:06.72ID:YPF/ckzld
そのコマンドのソース入手して見てみると面白そう
925デフォルトの名無しさん (アウアウウー Sa2f-7Ozv)
垢版 |
2019/03/26(火) 13:55:17.17ID:PDyA3k9ga
>>923
GNUの複数のコマンドで使われてるからあるかもよ。詳しい人がこのスレ見てないだけで。
まあしかし ls も df もソース公開されてる筈なので探せば何れわかる。
2019/03/26(火) 15:22:52.77ID:BwnADdEO0
libxo
2019/03/26(火) 16:26:09.83ID:8ujFPLE90
https://wiki.freebsd.org/LibXo
https://www.freebsd.org/cgi/man.cgi?query=libxo&;sektion=3&manpath=freebsd-release-ports
https://juniper.github.io/libxo/libxo-manual.html

ふむ…
2019/03/26(火) 17:13:01.28ID:ExDeReqX0
GNUのソースを参考にするのは良いけど、GPLへの感染に気をつけないとな。
2019/03/26(火) 19:37:33.33ID:8ujFPLE90
FreeBSDのuserlandな訳で…
ライセンスは自身で確認されたし

「GPL汚染」という言葉は良く聞くけれど「感染」って何でしょう
2019/03/26(火) 20:07:56.73ID:rSL1tIwA0
>>929
https://www.wdic.org/w/TECH/GPL%E6%B1%9A%E6%9F%93
2019/03/26(火) 21:19:25.60ID:8ujFPLE90
>>930
「GPU汚染」という非常にポピュラーな言い回しを使わず
敢えて「感染」と表現する理由が全く書かれていないようです
2019/03/26(火) 21:22:07.28ID:qKdh3SVz0
>>931
感染の方が伝播するニュアンスが強調されている気がする
2019/03/26(火) 21:26:56.44ID:ExDeReqX0
「GPL汚染」って言葉はGPLへの敵意が感じられるんで避けたのよ。
日頃からGNUさんのおかげで色々便利に使わせてもらってるわけだし。

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


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

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

他人事なやつにゃ、あーそー(asshole)でしかないんだろうな
935デフォルトの名無しさん (ワッチョイ c68c-WX4v)
垢版 |
2019/03/26(火) 21:57:53.69ID:X9x/YQnQ0
でも裁判は自分で起こさなければならない。
2019/03/26(火) 22:12:23.05ID:5H/KxRwB0
>>931
マイナーな言い回しをするときは理由を添えないとダメなの?
2019/03/27(水) 06:47:37.38ID:jMm/WIPk0
>>933 でうっかり「GPLライセンス」と書いたけど、
GPL が GNU General Public License のことなら
GPLライセンスだと「〜ライセンス・ライセンス」だね。
「〜ソースがGPLライセンスになって」は
「〜ソースにGPLが適用されて」あたりの方が適切だったか。

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


…言葉の使い方について、少し言葉を使ってみた、と言う感じのお話。
2019/03/27(水) 07:23:31.84ID:MBTJ/mxD0
ん、待て待てGPL汚染じゃなくGPU汚染と931は言っているな
NVIDIAの話か? それともAMD?
2019/03/27(水) 07:40:33.52ID:jMm/WIPk0
ありゃりゃ、確かに「GPU汚染」だね。
文脈に基づく先入観で「GPL汚染」としか見えてなかった。
すると、そっちがお誘いだったのかな。節穴で申し訳ない。

ついでにコピーせずに投稿文を手打ちしてることの傍証にもなったね。
2019/03/27(水) 08:13:14.97ID:ksdLiPzkd
どんな有能なプログラマーにもタイプミスはある。許してさしあげろ。
それより5ch用のリントツールが必要だということが浮き彫りになったな。
2019/03/27(水) 09:20:30.29ID:anJ1LIGv0
GPL汚染というのは商用アプリケーションを作る会社が
GPLライセンスのライブラリーを使いたいのに
ソースを公開すると売れなくなるから使いたくないから言ってるのと
ソースをみせたくないひとが言っているんだよ
942デフォルトの名無しさん (ワッチョイ c602-I58O)
垢版 |
2019/03/27(水) 23:28:49.86ID:oM4knkxt0
まあ味方にもよるよね。GNUの思想を支持する側から見たらプログラムを自由に使えない事は悪だろうし。
943デフォルトの名無しさん (ワッチョイ c602-I58O)
垢版 |
2019/03/27(水) 23:29:19.56ID:oM4knkxt0
見方だ
2019/03/28(木) 11:43:27.92ID:8NAOSscd0
GPLとGNUが脳内で混線してGPUになったのか
945デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/03/28(木) 12:45:58.19ID:0gfjfVxLa
GNL
2019/03/28(木) 19:27:35.93ID:l9a4bgRH0
ちょっと前MMUをMMOと言っちゃって、ちょっと恥ずかしかった。
2019/03/28(木) 20:31:48.77ID:3LZYwZb10
>>946
NWO=New World Order なら今的陰謀論にマッチしますね
NWO: https://ja.wikipedia.org/wiki/%E6%96%B0%E4%B8%96%E7%95%8C%E7%A7%A9%E5%BA%8F
948デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/03/28(木) 21:03:56.02ID:KhTRBxbZa
WBA
949デフォルトの名無しさん (ワッチョイ ef02-9gjM)
垢版 |
2019/03/28(木) 22:45:08.37ID:WL/rMpQN0
WEP
950デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 19:40:14.87ID:jbLCE6Gyd
初心者です
間違っているところをだれか教えてください
今作ろうとしてるのは入力した文をバラバラにして返すプログラムです
https://i.imgur.com/huSgBsa.jpg

https://i.imgur.com/NW3rZ7M.jpg
https://i.imgur.com/xAQu9le.jpg
951デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 19:45:04.77ID:jbLCE6Gyd
https://i.imgur.com/4iAlV1x.jpg
こうなるように作りたいです
2019/03/29(金) 19:52:38.08ID:49nFrL1E0
25行目からが

if(c!=0){
break;
}
else{
continue;
}
while(c==0);

になってるけどwhileの場所が間違ってる。
2019/03/29(金) 19:54:41.57ID:49nFrL1E0
28行目からだわ。つまり}が足りてない。そこだけ直したら上手くいくのかは確認してないけど。
954デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 19:55:29.51ID:jbLCE6Gyd
>>952
正しくはどうなりますか?すみませんさっぱりわかりません…
955デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 19:56:17.40ID:jbLCE6Gyd
>>952

>>953
今気づきました!!ありがとうございます!やってみます!
2019/03/29(金) 20:15:27.43ID:kPfQN3Sza
kishutu[] 渡してるところ大丈夫か?
957デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 21:09:07.83ID:jbLCE6Gyd
https://i.imgur.com/H76l6vb.jpg
https://i.imgur.com/ywiNmxR.jpg
これの原因わかる方いますか?
958デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/29(金) 21:13:20.24ID:jbLCE6Gyd
>>956
ありがとうございます
そこも間違えてたみたいです
2019/03/29(金) 22:03:29.44ID:b4NIHWKk0
>>957
27行目[]いらんと思う
960デフォルトの名無しさん (スフッ 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回は強制終了して、一番下のはフリーズしてるやつです
どなたかわかる方いましたら教えてもらえないでしょうか
何度もすみません🙏
2019/03/29(金) 23:02:18.73ID:aBFadZYQ0
随所でprintfしまくって、変数の値が想定通りか確認していくんだ
これをprintfデバッグという

ってか、まともなデバッガがある環境でやった方がいいよ
2019/03/29(金) 23:10:52.10ID:kPfQN3Sza
>>960
配列の添字も一緒にprintfしてみれば。
あと変数名は意味のあるもんにした方がええよ。 a とか b はあかんわ。
あと配列は初期化した方がいいかもよ。自分で中身を把握してれば別にしなくていいんだけど。
2019/03/29(金) 23:25:13.83ID:49nFrL1E0
>>960
check(int a, int b, int c[]);
がだめ。

aが既出の時は0を返して、既出じゃないときはaを返す関数になってるけど、
aに0を渡すと既出じゃなくても0が返るから既出扱いになる。
2019/03/29(金) 23:26:13.92ID:49nFrL1E0
既出の時は-1を返すようにすればなおせる。
2019/03/29(金) 23:36:01.88ID:49nFrL1E0
あと"hello world" に対してsent[10]は長さが足りてない。
966デフォルトの名無しさん (スフッ Sdbf-g8C6)
垢版 |
2019/03/30(土) 06:48:18.36ID:+pUtVW5zd
>>961
>>965
無事解決しました
大変ありがとうございました(^ω^)
2019/03/30(土) 11:40:45.41ID:NEaY98E/0
スマホ世代は画像と文字の区別が付かないらしい
これホントだよ
2019/03/30(土) 12:43:03.20ID:IAXXlS6v0
区別を付けられる世代には是非、画像認証で出される文字を認識するプログラムを書いてもらいたい
2019/03/30(土) 12:53:42.39ID:XVCnFM45d
>>967
これからは書き込む時にヘッダーにContent-Typeつけないとダメだな
970デフォルトの名無しさん (ワッチョイ ef02-9gjM)
垢版 |
2019/03/31(日) 18:22:14.86ID:x4Dlbn8C0
>>968
OCRでできるかもね。
2019/04/01(月) 12:25:47.95ID:MG1i8foP0
新元号がC言語に聞こえた、末期だ
2019/04/01(月) 12:28:19.16ID:mARdLrg20
0O
2019/04/01(月) 12:37:22.21ID:kX8UNAymx
>>972
れいわ
か、分かりにくい
2019/04/01(月) 13:26:16.54ID:Fc0B8SHO0
(0_○)
2019/04/01(月) 18:18:06.49ID:6TSsT2Q/0
0+
2019/04/01(月) 20:16:15.42ID:Ut3weUXPM
C言語でOOか
977デフォルトの名無しさん (アウアウエー 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)です。
思い当たる原因を教えていただけないでしょうか。
2019/04/01(月) 21:34:29.79ID:OIWsA4Npd
>>977
配列変数aのサイズを宣言せよ。
2019/04/01(月) 21:45:33.75ID:Mx+j7LaB0
int a[NUMBER];
と書いても駄目かね
980977 (アウアウエー Sa3f-XwTE)
垢版 |
2019/04/01(月) 22:08:10.15ID:v6mAk26Pa
>>978
>>979さんの仰る通りint a[NUMBER]={0};と書いたら意図通りに動作しました。
a[]と宣言するのでは、配列に割り当てる適正なメモリサイズが確保できないということでしょうか、、、
2019/04/01(月) 22:14:50.09ID:Mx+j7LaB0
>>980
どういう教科書を使っていて、どういう風に学習してるのか知らんが…
先生に確認した方が早いんでねえか
2019/04/01(月) 22:15:35.84ID:+c9Nhd8T0
>>980
初期化に使った右辺に合わせて自動的にサイズを決定してくれるので、

int a[] = {0};

だと大きさは 1 と指定したのと同じ。
2019/04/01(月) 22:29:36.01ID:v6mAk26Pa
>>981
社会人で完全に独学なので、質問するとしたらこういう場しかなくて…
初歩的な質問でスレ汚し申し訳ないです。
ちなみに教科書は柴田望洋『新・明解C言語(入門編)』を使っています

>>982
なるほど!
とてもわかりやすいです
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 が参考になるかも知れないし
「まだ早い」ということになるかも知れないし、何とも言えない
2019/04/01(月) 22:53:26.21ID:evzlx3m20
可能ならC言語は諦めるのがおすすめかな…
2019/04/02(火) 07:43:14.10ID:VBVVrqHU0
消すなよ!
987デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/04/02(火) 09:36:27.96ID:exqjvsIla
>>977
そのURLのページ昨日から開けなくてなんだかわからない。
2019/04/02(火) 11:14:48.18ID:SQXqRaAc0
https://imgur.com/a/kHEtyz9
こんなかんじだったよーな
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/

とか


ところで、このスレって次スレ立てるタイミングは
どんな慣習なんでしょうか
減速しないと確実にヤバイ域かも
2019/04/02(火) 11:28:36.32ID:SQXqRaAc0
C言語なら俺に聞け 151
https://mevius.5ch.net/test/read.cgi/tech/1554171817/

立てられました
冒頭ヘンなのは御容赦を _o_
2019/04/02(火) 12:17:13.81ID:eD+DhRS60
>>990


スレ立てのタイミングとか特になかったような
たまに落ちてて誰かが復活させたりとか…
992デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/04/02(火) 12:23:08.20ID:exqjvsIla
おつ
2019/04/02(火) 12:54:10.21ID:SQXqRaAc0
>>989 の補足というかスレチというか…

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


…このスレの人達からしたら忌み嫌われかねない環境かも…?
2019/04/02(火) 13:03:14.49ID:utcNUqsJd
>>990
オツ
2019/04/02(火) 13:07:35.24ID:vU9CoLi+0
>>993
Windows だけでよければ electron みたいな重量級のフレームワークをあらためて導入する必要もなく
ウェブ系の GUI デザインの延長で使える HTA は楽だとは思う。

「忌み嫌う」というよりは C とはまるで使いどころが違うので、
C を必要だと判断して始めた (その判断が正しいかどうかは別として) 人に対して状況を確認することなく
何か他の言語や環境を勧めるのは意味わからんという感じだと思う。
2019/04/03(水) 18:22:44.27ID:mkaKENfB0
省略形にかぎらず関数使用でも理解不十分なまま作成する記述スタイルを変えれればこの先生きのこれるかもしれうめ
2019/04/03(水) 19:45:53.19ID:sLl0OhfW0
先生、きのこれますか?
998デフォルトの名無しさん (アウアウウー Sa0f-dxKi)
垢版 |
2019/04/03(水) 20:52:13.33ID:GUjlsyjta
    _,,...,_
  /_~,,..::: ~"'ヽ
 (,,"ヾ  ii /^',)
    :i    i"
    | (,,゚Д゚) ・・・
    |(ノ  |)   
    |    |
    ヽ _ノ
     U"U
2019/04/03(水) 20:59:17.64ID:qKRJca2S0
生きのこ れる
2019/04/04(木) 00:26:22.08ID:dLJNY45/0
(´・_・`)
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を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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