■ このスレッドは過去ログ倉庫に格納されています
C言語なら俺に聞け 149
- 1 :デフォルトの名無しさん :2018/10/28(日) 22:01:44.38 ID:D9Gt7gmT0.net
- !extend:checked:vvvvv:1000:512
↑
次スレを作る時は上記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言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
- 958 :デフォルトの名無しさん :2019/02/04(月) 13:44:12.81 ID:eH/He5cH0.net
- それはmain函数の戻り値の処理を省いても0が返る,みたいな危うさがない?
……知らんけど
- 959 :デフォルトの名無しさん :2019/02/04(月) 13:46:18.98 ID:h1bt6e1C0.net
- 気になる点
mainの引数指定がない
fopenが成功したかチェックしていない
fcloseしていない
- 960 :デフォルトの名無しさん :2019/02/04(月) 16:13:18.04 ID:BGg5R2c70.net
- >>955
♪授業中あくびしてたら口がでっかくなっちまった〜
- 961 :デフォルトの名無しさん :2019/02/04(月) 17:53:18.29 ID:958Z8DnZ0.net
- 大域変数は、仕様上、0で初期化される事が保証されてる。
mainが実質的にintを返しているのと同じ状態、void指定からexit()によって値を返す形式も許容範囲内。
exit()は閉じてないストリームを閉じる処理も含んでいる。
mainの引数指定していないのは、GCCでも警告すら出ないで通った。
void指定したのと同一のコード吐き出すけど、これ本当に何かまずいの?
- 962 :デフォルトの名無しさん :2019/02/04(月) 18:24:32.77 ID:8k8r0y3l0.net
- >>961
mainの引数なしはギリギリセーフ
戻り値なしはギリギリチョップ
- 963 :デフォルトの名無しさん :2019/02/04(月) 18:49:29.84 ID:jFZpHwREM.net
- >>959
> fopenが成功したかチェックしていない
fputsもな
- 964 :デフォルトの名無しさん :2019/02/04(月) 18:50:42.11 ID:h1bt6e1C0.net
- ううむ
セーフとか言う意味じゃ無く、
気持ち的に落ち着かないと
言った方が良いかな
- 965 : :2019/02/04(月) 19:00:36.55 ID:CLpqTC7n0.net
- 個人的には
int main()
は許容範囲です、でも
void main(int argc, char **argv)
は許容できません
理由は、main() が接続(リンク)するスタートアップは、main() の内容がどんなものであれ変わらないから
スタートアップ(呼び出し側)が固定であるのならば、呼び出され側のシグネチャーも固定であるべきと考えます
スタートアップが仮定する引数と返り値を、main() が変えていい、とか考えられない暴挙だと思うのです
私がコンパイラを書くことが万が一あったとしたら、void main() はコンパイルエラーにします…
- 966 :デフォルトの名無しさん :2019/02/04(月) 19:22:17.76 ID:X0TXiuYZ0.net
- >>965
前者はC99ぐらいから廃止予定だったけど後者は規格にちゃんとあるんじゃなかっただろうか?
- 967 :デフォルトの名無しさん :2019/02/04(月) 20:04:17.97 ID:zvEiFsrUa.net
- >>951
まずくないけど変な感じはする。
それと本当なら出力の最後に改行が必要なのではないか?
fclose()がないが、exit()するならその中でやられている筈。しかし自分でやった方が良いとは思う。
- 968 :デフォルトの名無しさん :2019/02/04(月) 20:05:29.32 ID:T5zgWCiB0.net
- exit on free や exit on (f)close の臭いがする
- 969 : :2019/02/04(月) 20:28:02.23 ID:CLpqTC7n0.net
- >>966
引数の指定なし、は今でもありえるでしょうね、廃止予定とはきいていません
void main() は、ISO/IEC 9899/1999 5.1.2.2.1 にて陽に記述はありません
(ただし、or in some other implementation-defined manner. という注記はありますけれども)
- 970 :デフォルトの名無しさん :2019/02/04(月) 20:29:04.76 ID:jUExJMkq0.net
- AVRやPICといったマイコンでの話。
符号付整数型を文字列に変換しようと思ってるんだけど
定番のsprintfはこれら8bitマイコンにはややメモリを食いすぎて実装するのは厳しい。
代わりにメモリの消費量が少ないitoaという関数を使おうかと思ってるんだけど
itoaよりさらにメモリを節約できる方法ってあったりする?
- 971 :デフォルトの名無しさん :2019/02/04(月) 20:40:33.65 ID:8k8r0y3l0.net
- >>970
7行printf があったので、それを改造して使ってたな
自分だけが使う分には便利だった
- 972 :さまよえる蟻人間 :2019/02/04(月) 20:50:44.05 ID:MwdPLMKS0.net
- >>970
3桁くらいなら、わり算と余りが使えるかも。
- 973 :デフォルトの名無しさん :2019/02/04(月) 20:55:36.25 ID:BGg5R2c70.net
- >>965
その論法では()と(int, char**)が共存しえないな
- 974 :デフォルトの名無しさん :2019/02/04(月) 20:58:12.71 ID:01AVniBC0.net
- >>951 は「行儀が(とても)悪いけど、明確な規格違反も含んでいない」っていう
引っ掛け問題なんじゃないか?
いくつか気になる点があって調べたけど、どれも規格違反とまでは言えなかった。
>>970
実際に不都合が発生するまではライブラリの関数を使うべし、
ってのがプログラミングの定石だけど、それは置いといて。
itoa() は標準関数じゃないみたいだから、独自ライブラリなら
関数のソースも付属してるんじゃないかな。
自分が使う数値の範囲が限定されるなら、付属ソースを参考に
専用の「数値→文字列」の変換関数を作るのも簡単かと。
(コードの著作権とかの方面は考慮してないので御注意)
- 975 :デフォルトの名無しさん :2019/02/04(月) 22:30:53.53 ID:jUExJMkq0.net
- >>971
>>972
>>974
ありがとう、itoa関数よりもっとコンパクトな関数の自作に挑戦してみる(`・ω・´)
- 976 :さまよえる蟻人間 :2019/02/04(月) 22:36:37.94 ID:A8/6icsqd.net
- int n = 123;
char a[4];
a[0] = '0' + (n / 100) % 10;
a[1] = '0' + (n / 10) % 10;
a[2] = '0' + (n / 1) % 10;
a[3] = 0;
- 977 :デフォルトの名無しさん :2019/02/04(月) 22:42:47.31 ID:jUExJMkq0.net
- >>976
おお、なんか軽そう!
- 978 :デフォルトの名無しさん :2019/02/04(月) 23:30:45.04 ID:X0TXiuYZ0.net
- 割り算や剰余は8ビットマイコンでは重いのでBCD変換後4ビット毎に文字列化する方法もある。
高速なBCD変換はググれば出てくる。
- 979 :デフォルトの名無しさん :2019/02/05(火) 09:26:29.85 ID:NCwCR2JIa.net
- >>970
桁数固定で良いなら自分で下の桁から10で割った余りに'0'足して10で割るってのを桁数分だけ繰り返せば良いのでは?
- 980 :デフォルトの名無しさん :2019/02/05(火) 09:27:26.26 ID:NCwCR2JIa.net
- うう。リロードしたら答えが全て書いてあるではないか。orz
- 981 :デフォルトの名無しさん :2019/02/05(火) 19:48:53.03 ID:ksVxO8O00.net
- https://mevius.5ch.net/test/read.cgi/gamedev/1028273462/
1 名前:名前は開発中のものです。[] 投稿日:02/08/02(金) 16:31 ID:GWrer4oY
C言語でゲームって作れるわけ?
あんなの文章表示させられるだけでしょ?
255 名前:名前は開発中のものです。[] 投稿日:2017/02/05(日) 09:12:26.60 ID:AoXQwlvR [1/2]
くっそ懐かしいスレまだあったのか建てたの高校生だった頃の俺やぞwww
ちな今銀行のATMのシステム開発技術者。なんてアホなスレ建ててたんだ俺は・・・
ちょっとジーンとしたw
- 982 :デフォルトの名無しさん :2019/02/05(火) 20:36:40.97 ID:4jJQIC2L0.net
- 2002年w
暇なのでログ読ませていただきますw
- 983 :デフォルトの名無しさん :2019/02/05(火) 21:10:30.19 ID:or2LkC5v0.net
- https://paiza.io/projects/ocopHn6TvkpJu4a--2xAig
初心者なんだが質問したい
もしスレチだったら無視してくれ
coding ground でやってたのだがコンパイルは通ったんだけど正常に実行されない。自分ではよくわからなかったので誰が暇な人いたら教えてほしい…
必要な情報あれば送る。
- 984 :デフォルトの名無しさん :2019/02/05(火) 21:50:01.63 ID:nQ1PAxEF0.net
- >>983
文字列に改行文字がないのが原因では?
- 985 :デフォルトの名無しさん :2019/02/05(火) 22:00:33.04 ID:wHlrTA+U0.net
- 文字列は==では比較できない
#include <string.h>してstrcmp()を使いましょう
- 986 :デフォルトの名無しさん :2019/02/05(火) 22:05:58.12 ID:nQ1PAxEF0.net
- >>985
マジだ見えてなかったわ
- 987 :デフォルトの名無しさん :2019/02/06(水) 02:22:12.53 ID:yGh9lkMb0.net
- https://paiza.io/projects/F0I33_Di-fagw1kL49BVoQ
サンクス
strcmpを使ってみたのだがまだダメなようだ
正常にbreakできない
使い方が間違っているのかもしれない
- 988 :デフォルトの名無しさん :2019/02/06(水) 02:37:12.10 ID:Iaau3S1w0.net
- >>987
よく読んでないけど
とりあえずfor文は100ループしたら駄目じゃないかい?
p回のような
- 989 :デフォルトの名無しさん :2019/02/06(水) 03:09:41.56 ID:jnwpwdAT0.net
- >>987
そのプログラム問題ないぞ。単に入力に 0 が入ってない(というか何もない)からうまく行かないだけ。
下の所の「入力」タブを押して標準入力から読ませる文字列を入れておいてから実行すればいい。
例えばこんな風にだ。(これは入力の所に文字列セットしただけ。プログラム変更なし)。
https://paiza.io/projects/sZbQ6S7tfTLKqC_CEpG_8w
- 990 :デフォルトの名無しさん :2019/02/06(水) 03:16:24.22 ID:jnwpwdAT0.net
- ま、しかし、入力が何もなしでいきなり EOF になった場合を想定していないのはまずいプログラムであるとは思う。
- 991 :デフォルトの名無しさん :2019/02/06(水) 04:30:43.46 ID:FgEjt1k50.net
- Cが高速な理由ってコンパイラが出力バイナリの速度に重点を置いていて
かつそのコンパイラが長年の歴史をかけて磨かれてきたから。っていうのは間違ってるかな
Cの言語構造そのものに高速性が見出せない。
直にx86アセンブラを書いても速度が遅かったりするもん。
- 992 :デフォルトの名無しさん :2019/02/06(水) 04:57:27.49 ID:eUM592Vs0.net
- ループから抜けるときに goto使ったらダメなんですか?
for (...) {
for (...) {
if (...) goto LOOP_EXIT;
}
}
LOOP_EXIT:
こういう感じで書いたら先輩に怒られました。
フラグ見てループ抜けるように修正しろと。
指示されたので従いますけど、どうしてダメなのかよく分かりません。
どなたか納得するような理由をご存知でしょうか?
- 993 :デフォルトの名無しさん :2019/02/06(水) 06:01:54.08 ID:erbfwmnV0.net
- goto全否定は宗教みたいなもん。
万人が納得できるような理由はないと思う。
BASIC時代のスパゲッティーなプログラムの反省から制御の構造化を崩すようなgotoとcontinueは禁忌されることが多い。
ホントはここぞって言う時には使うべきなんだけどね。
- 994 :デフォルトの名無しさん :2019/02/06(水) 06:27:31.89 ID:1SbGZlcV0.net
- >>981
レス番が0xffなのも草
- 995 :デフォルトの名無しさん :2019/02/06(水) 06:29:29.34 ID:1SbGZlcV0.net
- >>993
continueはどのように構造化を崩すんだ?
ループの外へ出てしまうgotoやbreakとはちょっと違うと思うが
- 996 :デフォルトの名無しさん :2019/02/06(水) 07:45:48.33 ID:5UWRxIqtM.net
- >>995
break文もそうだが、continueは構造化を無視してジャンプするという範疇に入るそうだ。
ま、宗教だね。
- 997 :デフォルトの名無しさん :2019/02/06(水) 08:30:46.09 ID:QSRxZnkxM.net
- まあ初心者相手ならgotoには蓋をしておいて、15の誕生日になったら開けなさいって言っておいたほうがよいとは思う
- 998 :デフォルトの名無しさん :2019/02/06(水) 08:47:44.10 ID:ko7vbQjm0.net
- Ruby にも、多重ループを一気に抜ける構文がある
catch(:hoge_break) do
3.times do |i|
4.times do |j|
throw(:hoge_break) if hoge
end
end
end
これを認めない人は毎回、継続フラグを判断し続けなければならない。
漏れはむしろ、こちらの書き方の方が、バグる気がする
- 999 :デフォルトの名無しさん :2019/02/06(水) 08:59:54.85 ID:2/r6PXjM0.net
- 並列実行させたいときループの途中に戻りたいと思ふ。
- 1000 :デフォルトの名無しさん :2019/02/06(水) 09:29:07.75 ID:6h2IvBM+0.net
- >>994
その発送はなかったわw
- 1001 :デフォルトの名無しさん :2019/02/06(水) 09:56:36.40 ID:LaX4f5p90.net
- 本日配達の予定です。
- 1002 :デフォルトの名無しさん :2019/02/06(水) 12:30:20.04 ID:5DsLQSpRM.net
- >>999
コルーチンやね
いくつかの言語でサポートされてるけどまあ今どきならマルチスレッド+同期化でやりたいことはできる
https://ja.m.wikipedia.org/wiki/コルーチン
- 1003 :デフォルトの名無しさん :2019/02/06(水) 12:30:56.55 ID:Zn5BTEOaa.net
- >>991
C以外はCと同じようなことをしようとしてもコードが沢山作られて結果的に遅くなるって事だと思うが。(ただし人力で最適化してあるアセンブラ等は除く)。
昔は本当にそうだったように思う。高級言語なのにコンパクトなコード作るのはCぐらいじゃないか?今は知らないけどね。
それと今はインタプリタやVMで実行するのが一般的なJavaのような言語でも実行時に内部でコンパイルしたりJITつかったり工夫がされてるので速度は速くなる事はあるかも。
コードは内部的に大きくなってメモリ食ってるかも知れないけどね。小規模な組み込み用とかでなければ問題にならないと思う。
- 1004 :デフォルトの名無しさん :2019/02/06(水) 12:41:47.95 ID:CtZpHCTya.net
- longjmpとか昔からあると思うよ
- 1005 :デフォルトの名無しさん :2019/02/06(水) 12:44:25.18 ID:Zn5BTEOaa.net
- >>992
いや、いいよ別に。後でそれで混乱することにならないとか、あるいは使った方がより見やすく分かりやすくなるなら使えばいいのでは?
C言語はtry catch みたいなのもないし、トリッキーな方法でないものをあるかのように見せかけるプログラム作るよりはサクッと goto 使っちゃった方が良いと思う。
その先輩はそのような信仰を持っているか、または会社ならばそこでのコーディング規約で使わない事にしてあるんだろう。
- 1006 :デフォルトの名無しさん :2019/02/06(水) 12:46:40.08 ID:zkk6azTG0.net
- j
- 1007 :2ch.net投稿限界:Over 1000 Thread
- 2ch.netからのレス数が1000に到達しました。
総レス数 1007
306 KB
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★