C言語なら俺に聞け 156

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9bb7-/QqT)
垢版 |
2020/09/28(月) 14:41:30.00ID:QxfbhGyV0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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言語なら俺に聞け 155
https://mevius.5ch.net/test/read.cgi/tech/1589120427/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/02/01(月) 01:29:58.21ID:OjiuyGRS0
infinity 定義されてるだろ?
2021/02/01(月) 07:03:50.51ID:v6ebtUL10
整数型に?
2021/02/01(月) 07:51:42.98ID:9cKOvUYE0
>>706
処理系依存しないで確実に64bit以上にする方法ってないんだっけ。
ベース型の指定はC++だよなあ。
2021/02/01(月) 08:04:18.96ID:SoQHgLGL0
64bit整数型がない環境があるんだから
確実に64bit以上なんて無理
2021/02/01(月) 08:15:50.49ID:v6ebtUL10
sizeof max_value
gcc, clang: 8
cl: 4
2021/02/01(月) 08:27:26.16ID:9cKOvUYE0
>>710
じゃあ「64bit整数が使える環境で」って条件だとどうだろう?
2021/02/01(月) 09:03:50.04ID:5yr9aQzL0
Cのenumはマクロと大して変わらんのだから、マクロで代用するとか
2021/02/01(月) 09:11:58.71ID:v6ebtUL10
マクロに代わるべく作られたenumがマクロで代用されるとは
無様な・・・
2021/02/01(月) 09:18:04.19ID:v6ebtUL10
6.7.2.2 Enumeration specifiers
3 The identifiers in an enumerator list are declared as constants that have type int and may appear wherever such are permitted.

6.7.2.2 列挙型指定子
意味規則 列挙子並びの中の識別子は,型int をもつ定数として宣言され,この型の定数が許されるところならばどこに現れてもよい。

はっきり、intと書いてあるね
long longになる余地は全くない
2021/02/01(月) 11:57:56.06ID:vkxM9MCda
intとlong longが同一の可能性は残る
まぁ普通ではないが

素直にC++でenum classにするのがいいのでは
717デフォルトの名無しさん (エムゾネ FF0a-qCTK)
垢版 |
2021/02/01(月) 14:28:14.54ID:fos4FOVOF
enum と enum class って紛らわしいよね
2021/02/01(月) 17:41:32.38ID:v6ebtUL10
enum classは関係ない
enum-baseだ
2021/02/01(月) 19:37:32.66ID:vkxM9MCda
>>718
enumのベース型ってenum classじゃなくても出来たのか
勘違いしてたわ
2021/02/01(月) 21:43:21.53ID:9cKOvUYE0
>>715
なるほど、ありがとう。
721デフォルトの名無しさん (ワッチョイ 9e8c-bY9K)
垢版 |
2021/02/02(火) 06:19:12.09ID:wjKGtX300
enumはステート制御で重宝する。
722デフォルトの名無しさん (ワッチョイ 5dd2-merL)
垢版 |
2021/02/02(火) 15:29:55.49ID:gtWVIswm0
質問です。__lsan_disableが期待通りに動きません。
サイト見るとAllocations made between calls to __lsan_disable() and __lsan_enable() will
be treated as non-leaks. Disable/enable pairs may be nested.と書いてあったのでプログラム作りました。
しかし__lsan_enable〜__lsan_do_leak_checkもリークチェックされます。原因が分かりません。

#include </usr/lib/gcc/x86_64-linux-gnu/10/include/sanitizer/lsan_interface.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void* thFunc(void *arg) { __lsan_disable(); sleep(4); fprintf(stderr, "en start\n"); __lsan_enable();
fprintf(stderr, "en end\n"); sleep(4); __lsan_do_leak_check(); exit(-1);
}
int main() { int rc; pthread_t th; pthread_create(&th, 0, thFunc, 0);
for (int i = 0; i < 30000; i++) { sleep(1); int *p = malloc(1);
fprintf(stderr, "malloc\n"); } return 0;}
よろしくお願いいたします
2021/02/03(水) 08:08:40.40ID:3ZiqWZ4T0
>>712
処理系依存
2021/02/04(木) 11:24:59.43ID:P1e/f4pz0
テキストファイルを読み込む場合、主にfgetsやfgetcでやる方法があると思うのですが調べてみるとmmapを使う方法もあるようなのですがどれを使うのが良いんですかね?
やりたいのはhtmlソースの書かれたテキストファイルの簡単な解析です
もしくは全く別に有名なライブラリみたいなのがあるんでしょうか?
2021/02/04(木) 12:15:35.04ID:ttCVH4wp0
>>724
大きなファイルに細かなランダムアクセスが発生するときは
シークを繰り返すよりも mmap を活用した方が有利になることもあると思うけど、
常識的に考えればひとつの html はせいぜいが数メガ程度だろうし、
凝った管理をしなくても全部メモリに乗るでしょ。
2021/02/04(木) 13:31:56.12ID:P1e/f4pz0
>>725
ファイルサイズで使い分ける感じなんですね
ありがとうございます
2021/02/04(木) 13:43:25.23ID:ttCVH4wp0
>>726
処理の内容によってプログラムのデザインには選択肢があって、
ファイルからの読み込みの仕方はそのデザインに付随するという感じ。
2021/02/04(木) 14:20:09.93ID:jgksMTX2d
C言語スレで
せいぜい数メガと言っちゃう感覚
729デフォルトの名無しさん (ワッチョイ 6aa5-eHoJ)
垢版 |
2021/02/04(木) 14:24:26.67ID:xGlwnT6u0
もう21世紀だからな
ここから先は1GBのテキストファイルが普通になる
2021/02/05(金) 07:55:44.29ID:I+zADhcc0
>>728
テキストファイルを読めてhtmlをパースするような機器で今どき数メガも載ってないケースってかなり珍しいだろ
2021/02/05(金) 08:01:49.33ID:XbPEadHi0
せいぜい数メガと言えるようなリッチな環境で
C言語でアプリを書く方が珍しいだろ
2021/02/05(金) 08:20:44.95ID:JqQJ/dMo0
>>731
質問者>>724がやりたいって言ってるんだから、珍しいかどうかなんてどうでもいいだろう
2021/02/05(金) 08:32:27.83ID:XbPEadHi0
せいぜい数メガと言えるようにリッチな環境かどうかなんて
>>724にしかわからないわけだけど

>>731を考えたらリッチじゃないって考えるのは自然な発想
2021/02/05(金) 08:42:07.98ID:oeXhrntJ0
「決めつけ」はバグとセキュリティホールの元。
2021/02/05(金) 09:02:30.99ID:AjJLCZmld
スパコンのOSはCで書かれている
2021/02/05(金) 09:20:14.53ID:I+zADhcc0
>>731,733
なぜC言語なのかは>>724に聞いてくれ
少なくとも今どきmmapまで使える環境でメガも乗ってない環境って相当珍しいだろって話な
2021/02/05(金) 12:39:42.10ID:1XmQmKI8d
>>736
>>734
2021/02/05(金) 12:52:09.08ID:AV0Gp17OM
>>737
珍しくないと言うなら実例をあげればいいだけ
739デフォルトの名無しさん (ワッチョイ 9fad-MLSE)
垢版 |
2021/02/06(土) 10:12:48.76ID:DFt8vUVO0
mmapってUNIX系OSだけでは?他にもあるかも知れないが互換ライブラリ経由でそのOS固有の同機能のやつ呼んでたりしない?(それで良いなら良いんだが)
2021/02/06(土) 10:51:00.80ID:PohEB++tF
対象をhtmlに限定したのが敗因
2021/02/06(土) 11:26:44.70ID:EjDQT0l8K
>>739
メモリマップトファイル一般を指しての発言じゃないかな、CreateFileMapping()とか含めて。

>>740
たぶんシーケンシャルアクセスで足りるから、read()でええやんってなるよな。
2021/02/06(土) 11:45:50.67ID:zn5WrP4C0
>>739
何が問題なのかよくわからんが?
743デフォルトの名無しさん (ワッチョイ 6f8c-w83u)
垢版 |
2021/02/22(月) 07:04:45.29ID:Xbe4DE+80
どうやったらループを小さくしたり無くしたり出来るのか教えてほしい。
2021/02/22(月) 08:02:42.93ID:NYs90WT8M
べた書き?
printf("hello flat!\n");
printf("hello flat!\n");
printf("hello flat!\n");
2021/02/22(月) 17:21:30.68ID:iIDQLaUs0
標準ライブラリにある処理はなるべく標準ライブラリのを使うとか
ループをまとめて関数に出すとかでいいんじゃないの?
根本的な解決にはならないかもだけど複雑度は下がる
あとはアルゴリズムの改善しかないんやない
2021/02/23(火) 02:48:11.51ID:VIkkm8/qd
>>739
実装は知らんがむしろwinでは頻用すると思う
80'後半くらいに生まれたそろそろ古参なスクリプト言語(Pythonなど)には大体ある
スクリプト故に富豪的に全部載せ
2021/02/23(火) 03:04:42.97ID:VIkkm8/qd
>>743
ループ変数をi, j, kとすれば、int ijk(範囲はi*j*k)とまとめればネストレベル3→1にできるよ
i = ijk/j/k
j = ijk%(j*k)/k
k = ijk%kね
パフォーマンスの利点もある
mo量子化学計算はナイーブには最低4段のforが要求されるんで、かなり重宝
なんで4段をcollapseしたいけど、他人が初見で解釈するのはちょっと無理強いなので控えてる
2021/02/23(火) 03:15:27.68ID:VIkkm8/qd
いや今書いたのも改めて並べるとmodに慣れていと1分くらい考えるか…
二段は簡潔なのでイディオムとして使って良いと思う
i*jを走るループ変数ijに対し、i==ij/j, j==ij%j
ネストは半分になるし可読性もよいので、多分ベストプラクティス

ネストしたループを全てワンライナーで書けるFortranが羨ましい
2021/02/23(火) 03:42:44.91ID:1ia+Vnu00
divもmodもクソ遅いと思うんですがそれは
2021/02/23(火) 04:31:33.75ID:VIkkm8/qd
>>749
ステップ数で考えてたからそういう視点は無かったかも、精々2倍程度だし見落としてた

-o3とかするとベンチ的には速いから最適化とか効いてるんだろうかね?
2021/02/23(火) 04:35:35.49ID:VIkkm8/qd
だからといってわざわざ速い最適化divmod拾ってくるまでの価値も無いし、つまらんハックか
猛省
2021/02/23(火) 08:24:27.89ID:NtDnGIIYK
まあ定数の割り算は掛け算で実装するよな
2021/02/23(火) 12:00:01.73ID:EYNng8zFd
>>752
今アセンブリ見てみたら2147...647=2^32-1を引いて頑張ってる様子が見えた!gcc -O3/win
色々パラメータ弄って様子見ようとしたら普通に割り出したので混乱したが、実行時に与えるとフォールバックするよう
コンパイル時に定数で与えたらそうするっぽい
勉強になった
2021/02/23(火) 12:21:23.56ID:1ia+Vnu00
目安でしかないがx86-64ではmulと比べてdivやmodはレイテンシ2倍どころではない場合が多い

https://www.agner.org/optimize/instruction_tables.pdf

パフォーマンスが重要な場合は除数を定数にするか2の冪にしてシフト/論理積にする
755デフォルトの名無しさん (ワッチョイ 6f8c-Dcdc)
垢版 |
2021/02/24(水) 15:46:51.63ID:/D2VYVJH0
ソフトウェア割り込みプログラムは書けるのか
756デフォルトの名無しさん (ワッチョイ a301-GD1z)
垢版 |
2021/02/25(木) 06:12:34.32ID:R7WVwVFS0
>>755
インラインアセンブラ必須かな
2021/02/25(木) 07:07:20.11ID:bxBNuN1v0
環境次第
組み込み系の処理系だと割り込みハンドラーを書けたり割り込みフラグの制御ができたりするのはよくある
758デフォルトの名無しさん (ワッチョイ a301-GD1z)
垢版 |
2021/02/25(木) 09:55:57.73ID:R7WVwVFS0
>>757
それはC言語仕様には無い特殊な命令。SHのCコンパイラとか。
2021/02/25(木) 19:11:28.17ID:k63j55rm0
VCで作った実行ファイルを
cgiファイルに変える方法て
わからない?
どうしてもc.cgi.exeになって
しまう
2021/02/25(木) 19:17:09.21ID:JLHf2OjdM
>>759
どのHTTPサーバか、どんな設定にしてるかにもよるけど
名前だけ変えればおkじゃねーの?
2021/02/25(木) 20:00:24.23ID:MOr3wCfr0
ファイル名変えておいとくだけなんとちゃうの?
2021/02/25(木) 20:06:31.57ID:ZW7ncKwI0
Windows系サーバーだったら、
実行ファイルc.exeをc.cgiにリネームすれば動くはず
2021/02/25(木) 20:47:45.34ID:yh+1kBamK
そもそもCの話じゃないんだが
>>759
エクスプローラの表示の設定を「拡張子を表示する」モードにすべし

「拡張子を表示しない」のチェックを外す方式だったかもしれん
764デフォルトの名無しさん (ワッチョイ cb01-jB1a)
垢版 |
2021/02/26(金) 03:45:13.89ID:5d4w5oMJ0
>>763
スレチ
2021/02/26(金) 06:57:40.05ID:eCf8RuSVK
//何だよ俺のせいかいw
//じゃせいぜいCだけででがんばりや
#include <stdio.h>
int main() { return rename("c.cgi.exe", "c.cgi"); }
2021/02/26(金) 08:02:43.73ID:M2eccXrmd
renameってstdio.hだっけ?
2021/02/26(金) 09:51:30.74ID:31AFaQsJ0
>>766
stdioじゃよ
2021/02/26(金) 12:12:32.73ID:M2eccXrmd
げ、本当だ
2021/03/15(月) 16:52:25.12ID:XyNDIUjTa
すみません、質問させてください

exturn FUNC(void, define1) 関数名(void)

ってなってるのが、関数のプロトタイプ宣言であることは理解できているのですが
FUNC()の意味が分からないです
define1にはキーワード定義だけされたdefineが入ってます
2021/03/15(月) 17:06:32.77ID:Db4OPSpGM
>>769
それはC言語の文法じゃなくて、あなたのプロジェクト固有のマクロなので、同僚に聞くかgrepしてください
2021/03/15(月) 17:07:39.42ID:XyNDIUjTa
>>770
ですよねー
もう聞くわ
2021/03/16(火) 08:22:50.63ID:7emEuadh0
Cの文法内に収まる FUNC() って

一般C
#define FUNC(ret,opt) ret
Microsoft系のやつ 呼び出し規約まで対応
#define FUNC(ret,opt) ret opt

ぐらいしか想像つかんな それを吸収しようとしてるのかしら?
773デフォルトの名無しさん (ブーイモ MMcb-T0kI)
垢版 |
2021/03/19(金) 19:09:51.97ID:mKZFPhjYM
ret opt の記述順を変えなきゃなんないコンパイラ併用でもしてなきゃ
必然性無いよな
2021/04/25(日) 18:24:42.50ID:1rqnmNJD0
VS2019を使用してます。
c言語でハッシュテーブルを使いたい場合、
定番のライブラリってありますか?
自作は考えてません。
2021/04/25(日) 18:43:09.76ID:f5CNtQYv0
C++ hashクラスを使う
C 自作する

スキな道を歩もう
2021/04/25(日) 19:49:36.36ID:bD1toMMoM
Cにはない
多少は作るに該当するが、GPL汚染気にしないならhlist(list.h)かいっそのことrbtree引っ張ってくるのが楽
hlistは覚えてないがfreeBSDにもlist_headはあったと思うから雑に書いて作れる
2021/04/25(日) 20:00:40.49ID:1rqnmNJD0
>>775-776
ありがとうございます。
2021/04/26(月) 17:39:11.35ID:BhPjOTnw0
境界調整について教えて下さい
typedef struct stru{
int inta;
char ch;
double db;
} Str;
という構造体を作って、
Str st = {10 , 'n' , 5.20};

printf("構造体全体の大きさは %dバイト アドレスは %p \n", sizeof(st) , &st);
printf("inta の大きさ %dバイト アドレスは %p 値は %d \n", sizeof(st.inta), &st.inta , st.inta);
printf("ch の大きさ %dバイト アドレスは %p 値は %c \n", sizeof(st.ch) , &st.ch , st.ch);
printf("db の大きさ %dバイト アドレスは %p 値は %lf \n", sizeof(st.db) , &st.db , st.db);

としたところ、

構造体全体の大きさは 16バイト アドレスは 0019FF2C
inta の大きさ 4バイト アドレスは 0019FF2C 値は 10
ch の大きさ 1バイト アドレスは 0019FF30 値は n
db の大きさ 8バイト アドレスは 0019FF34 値は 5.200000
という結果が得られたんですけど、この中で
0019FF30から1バイト分には'n'という値が入っていて、
0019FF34から8バイト分には5.200000という値が入っているわけですよね?
では0019FF31から0019FF34までは何があるの?
2021/04/26(月) 17:55:49.95ID:NyQKOVd9d
何もない
2021/04/26(月) 18:15:58.84ID:IaPVNFDHa
ごみ
2021/04/26(月) 18:21:46.90ID:uqOlgHvIM
>>778
何があるかわからないしむりやり読んだら何が起こるかわからない

ってことになってる
2021/04/26(月) 18:27:06.04ID:4kXIzh+CM
>>778
ファイルに書き出してバイナリダンプ
gdbでx

見ても大したことない
2021/04/26(月) 18:28:20.87ID:BhPjOTnw0
その領域はとにかく使えないって事なんすかね。
2021/04/26(月) 18:31:26.64ID:NyQKOVd9d
そうなんです
2021/04/26(月) 18:32:08.60ID:TR73VE240
使いたいならchの後にcharを3つ作ればいいじゃない
2021/04/26(月) 20:06:39.04ID:fVzcGJCCa
>>778
__attribute__ ((packed))
2021/04/26(月) 20:43:03.58ID:+l9LtKe60
#pragma pack(push,1)
>>778
#pragma pack(pop)
2021/04/26(月) 22:14:43.60ID:BhPjOTnw0
またいつの間にかレスが。
>>784
それもありか。なるほど。

>>786,787
そういうのがあるんですか。入門書なんかには出てこないよね、それw
教えていただきありがとです
2021/04/26(月) 22:16:02.71ID:BhPjOTnw0
>>784>>785だった
790デフォルトの名無しさん (ワッチョイ 4dda-vrNx)
垢版 |
2021/04/26(月) 22:20:18.66ID:fe3Q/YJ30
訓練でC言語を習っています。
就職先としてはJAVAの客先常駐になると思うのですが、
C言語も習う以上はある程度使えるようになりたいと思っています。
ポインタが難しいとよく見るのですが、勉強になるウェブサイトが
ありましたら教えてください。
もしくはポインタだけの参考書があるようなのですが、
それを買った方が良いですかね?
2021/04/27(火) 06:03:07.86ID:RrDgDJ6XM
ゆとり?
技術的な内容ならまだしも学習方法や心構えまで他人に丸投げするのは職業人の姿勢として如何なものか
2021/04/28(水) 18:46:29.71ID:7AKt1vSf0
そういう時代
熱くなるな

PCを持ってないような人がソフト開発者として面接に来るような時代
2021/04/28(水) 21:52:06.89ID:PZc7df0ca
Cで Windows、Linux、macOS のすべてで動作するコンソールアプリを作りました
標準のライブラリのみを使用していたつもりでも、知らずにGNU拡張を使用していたり、若干の移植の障害はありましたが、それほどではありませんでした
同じようなことを C++ でやろうとした場合、Cより難しくなりそうでしょうか、そうでもないでしょうか
C++ でやるからには STL は使いたいです
2021/04/28(水) 22:44:05.13ID:7AKt1vSf0
同じようなもんじゃない?
2021/04/28(水) 23:21:11.19ID:PlZRAN+K0
言語仕様としてのGNU拡張は使ってもライセンスに触れないよな?
触れるのはライブラリ使用した場合じゃないか?
2021/04/28(水) 23:35:23.05ID:4KD2riuz0
コンパイラ独自の拡張であってポータビリティに欠けるってだけで
それ自体がGNUライセンスに引っかかるわけではない
2021/04/28(水) 23:56:50.52ID:sVhsMckNM
>>790
・格納先を渡す(普通のポインタ
・callee alloc(二重ポインタ
・関数ポインタ
これだけ分かってればいいというか、仕事でならこの範囲だけにしとけ
2021/04/29(木) 00:15:24.35ID:T1kQSA270
意外と引っかかるのは、複雑な変数宣言を読み解くこと
2021/04/29(木) 10:41:18.72ID:8DhczGXra
ご意見ありがとうございました
やはり、掛かる手間は同じようなものですかね
2021/04/29(木) 11:08:27.39ID:1rAkIDNr0
基本文法を憶えたら何かまとまったアプリを作んないと
ただ言語そのものを習ってそれっきりだと忘れるだけだぞ
2021/04/29(木) 13:50:03.41ID:56IZFSRD0
所詮は道具だし、使わないと忘れる
2021/04/29(木) 16:32:35.09ID:q0JKcoqRH
>>793
C++11 以降は、例えばスレッド制御・ファイルシステムをライブラリに取り込む、など積極的に環境依存が少なくなるように動いている(ように私には見える)ので、多分移植はもっともっと易しくなる、と思います、失礼、易しくなる気がしないでもありません‥‥
2021/04/29(木) 16:39:37.88ID:q0JKcoqRH
>>790
「新・標準プログラマーズライブラリ C言語 ポインタ完全制覇」前橋 和弥著
https://www.%61%6d%61%7a%6f%6e.co.jp/dp/B077ZTQY62/
ポインタを完全制覇してくれる本だそうです、私も興味があったのでポチりました‥‥
2021/04/29(木) 16:48:12.19ID:loQVmfSpa
>>802
ありがとうございます
そんなこともあるのかなと、淡い期待もしつつ… でした
2021/05/02(日) 15:45:22.42ID:LfIZA/yy0
cについてほとんど知らないけど、組み込みがメインな感じですか?
2021/05/02(日) 15:56:09.60ID:/1wJlD5g0
システムプログラミングの方が多いんでない?元々それ用だし
OSのインターフェース提供はどこもC
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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