X



C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ b375-rVGZ)
垢版 |
2017/10/27(金) 21:28:08.20ID:pAogLeJi0
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言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0111デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 19:59:15.85ID:aAcU+3M+d
>>110
この漸化式は0<m<nという条件のもとなのでn=mの可能性はないです
0114デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 20:17:29.03ID:aAcU+3M+d
>>113
うーんやっぱりそうですか
ありがとうございます
0115デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 20:22:30.92ID:aAcU+3M+d
(n*n-1Cm-1)/m
と計算せず
(n/g)*(n-1Cm-1/(m/g))
と遠回りして計算したのは掛け算より前に割り算をして桁あふれを防止するためだったのですが、これだけではまだ読みが甘いみたいですね
0120デフォルトの名無しさん (ササクッテロラ Spf1-XwAf)
垢版 |
2017/11/02(木) 21:33:15.98ID:YtLG92Gup
πの計算みたいに配列でやればいいんだよ。
0124デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 01:25:33.04ID:exxwx2Ub0
配列の四則計算かw
とりま、1桁辺り1バイトからやって行くと良い。
アルゴリズムは手計算方式で。
0128デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 11:50:36.80ID:exxwx2Ub0
そーゆーのって、C言語じゃなくて、ライブラリの仕様なんで、環境わからないと誰も答えられないよな。
0129デフォルトの名無しさん (ワッチョイ 319f-1mNv)
垢版 |
2017/11/03(金) 12:27:14.54ID:1lWviljw0
プログラム中で扱う時はiconv()で変換しちゃうと楽だな。Windowsは知らんがOSが変換やってくれなかったっけ?忘れた。
0130デフォルトの名無しさん (ワッチョイ 99b3-KOaZ)
垢版 |
2017/11/03(金) 16:53:04.29ID:kt+ZN5MJ0
#include <stdio.h>

int main(void)
{
int x, y, z;
scanf("%d", &x);
y = x;
for (x = x - 1;x > 1;x--) {
z = y % x;
if (z = 0) {
x = 0;
}
}
if (x = 0)
{
printf("入力値は素数ではありません\n");
}
else
{
printf("入力値は素数です\n");
}
fflush(stdin);
getchar();

return 0;

}

素数判定用のやつ作ったんだが動かない
問題点教えてください
0131デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 16:58:25.19ID:exxwx2Ub0
さすがにネタだよな?
0135デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 23:33:54.94ID:exxwx2Ub0
ネタじゃ無かったんかいw
0137デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/04(土) 03:05:14.26ID:bSw/g7Kd0
おまえらバカにすることしか頭に無いのか
初心者ならこういうこともあるだろうに
0140デフォルトの名無しさん (ワイモマー MMa5-puHV)
垢版 |
2017/11/04(土) 10:16:02.36ID:t9DikZnoM
古代においては、(1 == y)としておけば、間違って(1 = y)とした時にコンパイルエラーで発覚する、という言い伝えが有った。
>
>#include <stdio.h>
>
>int main(void) {
> int x, y;
> scanf("%d", &x);
> y = x;
> while (x % (y -= 1))
> ;
> if (1 == y) {
> printf("入力値は素数です¥n");
> } else {
> printf("入力値は素数ではありません¥n");
> }
>
> return 0;
>}
>
0141デフォルトの名無しさん (ワッチョイ 319f-1mNv)
垢版 |
2017/11/04(土) 13:31:32.96ID:3FaXzC+X0
>>140
あーそうだな。今でもたまにそう書いてあるソースを見かける。
いつも自分ではやってないので違和感があるw
まあでもCみたいな言語だと本当はそう書いておいた方が良いんだろうけどね。

そう言えばこの頃のコンパイラはifで代入だけしてるようなのは見つけて警告出してくれるな。
0147デフォルトの名無しさん (ワッチョイ 2e80-frTj)
垢版 |
2017/11/04(土) 15:27:20.00ID:FdHKGPou0
リテラルには代入できないから、リテラルを左側へ書いておく

今は、MISRA-C で、100項目をチェックする事が義務化されているから、
違反は必ず報告される

でも、トヨタのように、5/100 しか取れない企業もある。
95も違反してるw
0148デフォルトの名無しさん (ワッチョイ 4193-ZDq4)
垢版 |
2017/11/04(土) 16:10:54.87ID:XesRBOxx0
>>140 の話は >>1 の参考サイトにも出てる話だね。
C FAQ 日本語訳 ttp://www.kouno.jp/home/c_faq/
17.4 に載ってる。

定数と変数の比較なら役に立つけど、変数同士の比較に使えないから
特に良くも悪くもない、という評価。

コンパイラがオプションを備えてるなら警告を出させるのが良いわな。
0150デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/04(土) 20:33:34.59ID:bSw/g7Kd0
トヨタ社員乙
0152デフォルトの名無しさん (ワッチョイ 6e3e-cSXK)
垢版 |
2017/11/05(日) 16:44:19.44ID:rSDVGL6P0
全員が同じレベルで言語の仕様や処理系の実装を理解しているわけじゃないからなあ。
最底辺のレベルを合わせる為にMISRAのような約束事が有用であろう事は想像できるんだが…

俺、車業界のソフト屋じゃなくて良かったと思うわ。
いや、むしろ、いっその事、強制された方が楽か?
0154デフォルトの名無しさん (ワッチョイ 62ee-S32u)
垢版 |
2017/11/05(日) 20:23:18.52ID:AvV+p+8R0
COBOLの二の舞
0155デフォルトの名無しさん (ワッチョイ 4150-lboT)
垢版 |
2017/11/05(日) 20:37:42.87ID:Dhy1E5e10
初心者です。
C言語には標準出力関数がいくつかあって気になったのですが、

puts("文字列");
puts("文字列");
puts("文字列");

などと書くのと、

printf(
  "文字列\n"
  "文字列\n"
  "文字列\n
);
のように書くので結果は同じようになると思うのですが、速度やリソースの消費に違いはあるのでしょうか?
どちらが速いとかメモリ消費が少ないとかあれば教えていただきたいです。
0158デフォルトの名無しさん (ワッチョイ e18a-Dqmo)
垢版 |
2017/11/05(日) 21:09:58.63ID:oA1U3DCD0
putsだと自動的に改行されんのか
0160デフォルトの名無しさん (ワッチョイ 9d7f-lboT)
垢版 |
2017/11/05(日) 21:19:49.85ID:Z/yFjIMy0
>>157
stdoutがline bufferedなら、どっちもwriteが3回呼ばれる

言語規格的には解析処理のあるprintfのほうが遅そうだけど
これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される
副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い
0161デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/05(日) 21:26:10.62ID:pE+6s3oz0
すっげー
物知りだなぁ
0162 ◆QZaw55cn4c (ワッチョイ 2260-xBM6)
垢版 |
2017/11/05(日) 21:29:46.85ID:cePuEsTc0
>>160
それはさすがになさそうだ…
printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは?
いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう?
0163デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/05(日) 21:31:03.45ID:pE+6s3oz0
もうさぁ実測でいいよね
0169デフォルトの名無しさん (ワッチョイ 4193-ZDq4)
垢版 |
2017/11/06(月) 06:37:53.91ID:uTTN+kxR0
>>167 のリンク先を読んだのだが…
printfで色々条件、最後が改行だったらputsに置き換え、は分かったけど
最後が改行でない場合はfputs( , stdout)に置き換えるわけにいかんのじゃろか?
0174デフォルトの名無しさん (ワッチョイ 4150-lboT)
垢版 |
2017/11/06(月) 17:25:31.98ID:f1KpQ6jU0
みなさんありがとうございます。
末尾の改行程度しかないprintfはputsに置き換えられるんですね。
ググってみたりもしたんですが、最近のPCであれば速度にほとんど違いが出ない様なことも書いてありました。
171さんの言う通り速度やリソースよりも見やすさや読みやすさの方が大事になりそうですね。
勉強になりました。
0175デフォルトの名無しさん (ワッチョイ 4502-S32u)
垢版 |
2017/11/07(火) 05:32:04.97ID:2eQgtTM30
塵も積もれば何とやらで
すぐ砂時計だの輪っかだのになるのが
M$の作風
0176デフォルトの名無しさん (ワッチョイ 46e7-M99L)
垢版 |
2017/11/07(火) 18:15:10.39ID:pVSOD8mN0
入力が入れる前に厳密にされてないとprintfは怖くて使いたくないなエラーになるし
プログラミング問題とかなら入るの制限されてるから使う時もあるけど
0177デフォルトの名無しさん (ワッチョイ 99b3-tWDu)
垢版 |
2017/11/08(水) 00:52:24.03ID:+F77Ugxq0
自動で実行ファイルが作成されてその実行ファイルが新しく実行ファイルを作ってその実行ファイルが…
みたいな無限増殖するウイルス的なやつって理論上作れるの?
作る気はないがファイル名を自動で生成して上書きするようしていったら全ファイルが空ファイルになるってのも可能なのか?
0178デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/08(水) 00:53:30.71ID:Fypp0IbQ0
可能
0182デフォルトの名無しさん (ワッチョイ 4150-lboT)
垢版 |
2017/11/08(水) 10:05:36.22ID:2J8ZwtJ20
なにこのスレ怖い
0185デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 01:05:19.54ID:dSouu86q0
>>177
fork() してプロセス作るの繰り返すだけでいいのでは?ファイル作る必要あるか?
作ったとしてもそのファイルの内容は元のやつと同じなんだろ?

Windows の場合はどうするか知らない。fork() と同じような動きをするAPIがあるなら
それ使えばいい。(cygwinのライブラリ使えばいいか)
0186デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 01:06:21.38ID:dSouu86q0
>>183
君は return を何か別のものと勘違いしてはいないか?
0188デフォルトの名無しさん (ワッチョイ 5fb3-QPNr)
垢版 |
2017/11/09(木) 01:31:12.69ID:th5mXoJq0
>>187
じゃホント適当なの

int main(void){
int a,b;
scanf("%d %d",&a,&b);
a=a+b;
return a;

適当に
基本自分はa=a+bの後の行にprintf("%d",a);って入れるけど戻り値を表示するだけならreturnで十分なの?って聞きたい
0189デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
垢版 |
2017/11/09(木) 01:44:44.36ID:kZJdPPiU0
>>188
main関数のreturnの値は0固定だろ。
正常に終了したかどうかを示す数値を返さないとダメなんだし
0190デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 01:52:12.46ID:dSouu86q0
>>188
それどこにも何も出力してないよ。一応 main() での return はプログラムを実行した側に
ステータスとして返されたりするがその辺はOSやmain()を呼ぶ側のコード依存だ。

で、それはプログラムの実行中で起きたエラーを伝えるためによく使われている。
0ならエラーなしで1ならエラーみたいに。つまり普通は計算結果を返すためには使わない。
0192デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 02:31:24.91ID:dSouu86q0
>>191
固定と言うか、昔からの慣習で普通は0返すように書くんだよ。UNIXでの慣習ね。Linuxでも同じ。
UNIXではシェルスクリプトで動かした時にエラーかどうかを判定するのに使うことがある。
(シェルの if 文等で直接使える。Windows のコマンドプロンプトでもほぼ同じ)。
0が返されたら正常終了で0以外がエラーね。

まあとにかく歴史的な問題でそうなっていると思って良い。そういう意味では main() からの
return だけは特殊なものだと思っていい。
0193デフォルトの名無しさん (ワッチョイ 5f93-B4G6)
垢版 |
2017/11/09(木) 06:59:07.81ID:tZYUBTdz0
>>188
return a; と書いても基本的にはaの値は表示されないよ。
returnは関数内で計算した結果を呼び出し側に返すだけ。
値を見たければprintf等を使って表示する必要がある。
呼ばれた関数内で(途中経過として)表示するか、
呼び出した側で(関数の結果として)表示するか、は目的次第だが。

main() はOS(WindowsとかLinuxとか)からコマンドとして呼び出される関数、
と考えると分かりやすいかも。
main() 関数のreturnの値はOSに返される。
返された値をどう扱うかはOS側の問題だわね。
0195デフォルトの名無しさん (ワッチョイ 5f50-TPjW)
垢版 |
2017/11/09(木) 07:18:13.98ID:/m6aHr1P0
>>191
「自作関数を作る」あたりのページで出てくるsum関数でしょ?
あれってただ単に今までmain関数で return 0 しかしていないから、例として同じように書いているだけだと思うよ。

「関数から数値を返す」のページまで行けば return num してるsum関数が出てくるよ。
0196デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
垢版 |
2017/11/09(木) 13:19:13.30ID:U5AasQBn0
print関数だけで表示するだけの関数とかならreturn0するけど衝突判定とかならbool型返したりするからな
0197デフォルトの名無しさん (アウーイモ MM23-0J0R)
垢版 |
2017/11/10(金) 15:35:52.06ID:VD/o6LfMM
何ができれば、c使えるって言っていい?
0198デフォルトの名無しさん (ガックシ 064f-OZYs)
垢版 |
2017/11/10(金) 15:40:07.94ID:ZWtrLrii6
mallocの実装
0208デフォルトの名無しさん (ワッチョイ 7f06-TYjb)
垢版 |
2017/11/10(金) 20:07:11.53ID:f7hdF1Yr0
use the force luke
0209デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/10(金) 20:08:56.37ID:KTiHfL4P0
Ubuntuをインスコできる。
■ このスレッドは過去ログ倉庫に格納されています

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