C言語なら俺に聞け 148
レス数が950を超えています。1000を超えると書き込みができなくなります。
>>850
> そうか、847にアホとヴァカって書いてあるのか
> 実際には、そう言ってるのはおまえだけなんだが
ヴァカで検索
>>831 > あ、おまえ間違えたの? アホとヴァカしかやらない間違いだなw
>>840 > アホw ヴァカwww
>>843 > アホとヴァカを認めやがったw
849-850 は指摘なので省略
> 自分にお前だけとかかなりシュールな姿だねw C言語でLinuxのdmesgやffmpegのログのような着色された分かり易いログ出力ができるライブラリってありますか?
[YYYY-MM-DD hh:mm:ss.ss] INFO: creating some file...
のような形式がいいんですけど、Cだと自作するしかないですかね? >>854
標準ライブラリにはない
git漁ればあるはず
でもそのぐらいなら自分でチョロっと書けば終わる 色だけだったら制御コード挟むだけでかなり直接的な操作だから、ライブラリ要らんと思うよ >>851
ヴァカと書いてあるのを血眼で探したのか
ご苦労だったな
で、誰か「自分にお前だけ(ry」とかテレパシーで話しかけてきたのか
なるほど精神科の医者じゃなく患者だな
精神分裂病の陽性症状で幻聴がひどいようだな >>854
サンプル書いてやったぞ
#include <stdio.h>
#include <time.h>
#define D(fmt, ...) \
do { \
struct timespec _ts_; \
struct tm _tm_; \
char _tt_[128] = {0}; \
clock_gettime(CLOCK_REALTIME, &_ts_); \
localtime_r(&_ts_.tv_sec, &_tm_); \
strftime(_tt_, 128, "%H:%M:%S", &_tm_); \
fprintf(stdout, "\033[33m%s.%lu %s:%d %s " fmt "\033[0m\n", \
_tt_, _ts_.tv_nsec, __FILE__, __LINE__, __func__, ##__VA_ARGS__); \
} while (0); 末尾のセミコロンがなければ意味あるけど、
セミコロンのせいで無意味になってるね。 カラーコードをハードコーディングかぁ
やりますねぇ・・・ >>859
ありがとうございます!
一点,おこがましい指摘なのですがfprintfの出力先はstderrのほうがいいのではないかと思います。
ログ出力はコマンドの出力とは別個にするべきなので。 >>862
例えば改行を\x0aで固定するのは良くない方法であり、\nにすべきですが(これだとWindows向けにビルドしてやれば\0x0d\0x0aが出力されるようになる)
着色に関するエスエープシーケンスを固定するのは別に大丈夫だと思います。
ECMA-48/8.3.117などで標準化されてますし。 >>865
ああ
「\e[33m」という記法それ自体ではなく
「33」という文字列を,例えばYELLOWマクロにする,というような意味だったんですね。
まあ確かにそうかも知れないです。 >>867
説明のための例だからそういう定義が分かりやすいとして、
>>866
こういうのを定義するときは、手段じゃなくて目的で定義する方がいいんじゃないかな。
ソース位置の強調をするために STYLE_LINE、タイムスタンプを強調するために STYLE_TIME、プロセスIDを強調するために STYLE_PID、みたいな。
それらを定義するときに YELLOW とか RED とか使う感じ。
#define STYLE_LINE(FMT) (ANSI_COLOR_YELLOW FMT ANSI_COLOR_RESET)
みたいにして、
fprintf(stdout, STYLE_TIME("%s.%lu") " " STYLE_LINE("%s:%d") " " STYLE_MSG(fmt) "¥n",
とか。 >>861
;はミスだわ
>>863
サンプルなのでお好きに
>>868
好みかもしれんが、一行の中で色変えるとか見づらくないか?
そのフォーマットではファイル出力したくなくなるし
俺が色使うなら #define D(type, fmt, ...) でタイプ指定して
fprintf(stdout, COLOR(type) ... COLOR_END "\n",
とかで色変えるぐらいかな >>869
例だから派手にしたけど、言いたいのは目的にちなんだ定義名にした方がいいってこと。
ログレベル毎に色を変えるなら、STYLE_ERROR、STYLE_WARN、STYLE_INFO とかさ。 正論と同じであまり振りかざされても実務では面倒なだけ
>>868とか正直ウザって思うわ ていうかログのフォーマットってCでは標準化されていないのね、SUS含め。
Javaのlog4jやPythonのloggerみたいなものがあれば 一番嬉しいんだけどね C初心者です、よろしくお願いします
ubuntuのvimでしこしこ書いてgccでコンパイルしています
CでIDEを使ってみたいのですがオススメありましたら教えてください
仕事ではJavaでEclipseを使ってるのですがCで使ってみたらいまいちピンと来ませんでした
やはり皆さんVisualStadioとかVSCodeあたりでしょうか? >>874
ないけどUNIXで昔からsyslog使われてた。というかそれがあったせいで他のログ出力ライブラリが広まらなかったのかも知れない。 ログ出力も奥が深いよな。
大量かつ高速が条件だとなかなか悩む syslogは日付がISOに従ってないのがちょっと嫌だな。
[YYYY-MM-DDThh-mm-ss,ssZ] LOGLEVEL: some messages.
こんな感じがいい >>878
大量⇒高速に処理が必要だから、その条件は大体セットだろ
それにプログラムが異常終了してもログが欠落しないとかの条件がつくと難易度が更に上がる うーん。素人考えなんだけどfprintf()関数を呼び出したり,その中で__FILE__マクロ変数を展開したりするのって
そんなにコスト掛かる動作じゃないよね。
いくら大量の処理とは言え,ログを出力しただけで影響がでるような厳しい環境ってそうなくない?
そしてそもそもそんな環境でログ処理ではないメインの処理って動くの? >>884
マルチプロセスやマルチスレッドだったりすれば排他も必要だし、fprintf 使っただけだとプロセスの突然死なんかではバッファがフラッシュされず失われ、一番欲しい落ちる寸前の情報が欠けかねない。
小まめにフラッシュしたらそれはそれで性能の問題が出る。
奥が深いと思うよ。 >>870
ああ、過剰な例だったか
>>871
あの例は抽象化ではないけどな
まあ例だから深くは言うまい >>884
どの程度の性能を求めてるか次第だと思うよ
時刻取得でも clock_gettime と gettimeofday でうるさく言う人もいるしね
トレースログみたいに高速かつ大容量を考えるなら
ログがN件入るバッファを複数持っておいて
情報は基本バイナリで登録、ローテート時にファイル書き出し、
別途パーサーを作る、とかかな
まあそこまでする必要のあるソフトなんて稀だろうけど ポインタをややこしくしてるのは
int* a;
の a がポインタ変数で
a[10]
という配列がある時、a と書くだけで配列の先頭アドレスの別の書き方として許されてるがいけないんじゃないのかな?って思ったんだけど合ってる?
配列の先頭アドレスは常に&a[0]って書くようにするようにすればポインタのごちゃごちゃって解消されない? Cだったら配列なんてものがあると思わん方がいいかもね
入門書的にはポインタより配列の紹介が先に書いてあったりするが、確かに問題はある。 >>888
あと、p[i] も禁止して、*(p+i) を強制しないとだめ。 >>888
そのへんはシンタックスシュガーというよりは
たまたま結果的に同じものを指している 程度だし
原理原則を省かず丁寧に覚えていくしかないのでは 違う
違うナァ
機械語→BASICのころには
「変数って何だ?!!」として変数なる概念をなかなか理解できなかったやつがいた……
と言う話を聞いてる
今の初心者の一部もなじめないヤツが一定数いる
言ってしまえばC言語は「変数指向」のプログラミング言語だ
オブジェクト指向や関数型に並び立つような、な
気付いてないが現代プログラミング言語は「変数指向」で出来てる
そしてどんな思想であろうとどんだけ説明してもその概念の片鱗すら理解出来ないヤツはいる
なので「変数」概念の理解に原理原則なんて存在しない
一発で理解出来るか素直に受け入れるかのどちらかしかない
それ以上説明しても意味が無い、という人物は少数だがいる
これはしょうがない なんかの本に
int *a;
と宣言してあったら、式の中で
*a
と書かれたものが整数であると的確に説明してあった。 >>893
それが分かりやすいかはちょっと微妙じゃね。
int i; ならその領域は確保されてるけど、int *a; と宣言した *a は型としては i と同じだけどそのままで i と同じように使えるわけじゃないし。
ポインタで迷うレベルに通じる話じゃなさそうだし、これが通じるならポインタで迷ってないんじゃね。 >>892
マシン語でもレジスタが変数みたいなもんだろ これを実行するときに、argcに3が入っているとsegmentation faultとなってしまうのですがなぜだかわかりますか?
OSはopensuseでコンパイラはccです
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
int cmp=0;
char *s1=argv[1],*s2=argv[2];
cmp=strcmp(s1,s2);
if(argc!=3){
fprintf(stderr,"usage:%s[string1][string2]\n",argv[0]);
return -1;
}
if(cmp<0){
printf("%d : %s\n",strlen(s2),argv[2]);
}
else{
printf("%d : %s\n",strlen(s1),argv[1]);
}
return 0;
} >>898
argc調べる前にstrcmp()するのは変だろう。 >>899
それを直したらsegmentation faultしなくなったんですけど、理由が知りたくて… >>901
たとえばargv[2]が空だったらstrcmpの引数は何になるんだという >>902
argc が 3 なら argv[2] は何か入ってるだろ どうでもいいけどargvが3じゃなきゃいけないのにそのusageはどうよ >>902
なるほどです
理解しました
>>904
これではよくないんですか? >>901
引数がなかったり一つだったりした時に先に無条件にstrcmp()をしてしまうと両方または一方が不定値やNULLになるので落ちたり変な動きになったりする。 >>907
え、その問題はもう直してあって、>>898 は直す前のコードで argc が 3 だと落ちたけどなんで?って話なんだよね? >>908
すみません間違いました
3以外が入ってるときです main(void)の場合もメモリ上のどこかにargvが入ってるだろうか? >>905
[hoge]はhogeが省略可能って表現
あとスペースちゃんと入れろよ みんな知ってるかもしれないが
[--foo]で--fooオプションが省略可能だということはかなり広範な決まりで,
POSIXに始まりGNUプロジェクトやPythonのインターフェース規格でも取り入れられてる。 >>910
そりゃいるだろうよ、と思って確認してみた
ubuntuだと環境変数の近くにいるね
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *c = getenv("PATH");
while (--c != NULL)
if (!strcmp(c, "hoge")) {
printf("%s\n", c);
while (++c != NULL)
if (!strcmp(c, "foo")) {
printf("%s\n", c);
return 0;
}
return 0;
}
return 0;
}
$ ./a.out hoge foo
hoge
foo >>915
POSIXに始まりってのは歴史的な話じゃなくて規約的な話だったか
でもここまで規約が決まってたのは知らんかったわ >>911
そういう意味があるんですね
ありがとうございます >>892
違うぞ。
その世代(ベーマガ世代)で変数が理解出来なかったのは、数学的素養がなかったからだ。
数学で「変数」が導入されるのは「方程式」からで、それ以前の小学校の算数は全部「定数」で出来ているから、
その世代の『小学生』はそこに戸惑っただけ。
機械語/BASICとかは関係ない。
高一で物理を始めると、三角関数が出てきて戸惑うようなもの。
学校によっては高二から始めるらしいが、その場合は戸惑うことはないだろ。
或いはアフィン変換も同じ。
あれも数学で回転行列を習った後なら容易いが、
『小学生プログラマ』にやらせようと思ったら、まず座標を教えて、その後に…と色々必要だろ。
数学的素養がないと、プログラミングは理解出来ないんだよ。
小学校教育に取り入れた馬鹿共は、プログラミングが出来ないから、それが分からないだけ。
○○が分からない、と言う奴は大概、数学の素養がないか、そもそも全てを『暗記』で済ませてきたタイプだ。
(世の中大概それでどうとでもなるのも事実ではあるが、)それではどうあがいてもプログラミングは上達しない。
頭を切り換えて、全てを『理解』する癖を付けることだね。そしてまず数学を勉強すべきだ。
そうしないとただのコピペ(写経)マンになってしまう。
(はっきり言って昔のベーマガ世代も実際やっていたのは写経でしかないし)
色々理解したら、なるほどCは文法的にも構造的にも美しく出来ているし、
色々無駄がないからこそ、いまだに現役で使われ続けていることが理解出来るようになる。
ただし、分かりやすいわけではないので、俺は初心者はCから始めるべきではないと思うがな。 >>922
中学の授業では便宜上は今まで変数を習ったことの無い中学なりたてホヤホヤのガキに変数を教えるんだよな?
なのになんでそれで新中学一年生は変数を理解出来るんだ?
素養が無いのにも関わらず変数を授業で教えると理解できるんだぞ?
不思議じゃないか? ベーマガのゲーム入力して
兄「ここの数字増やすと自機数が増えるんだよ」
自分「へぇ」
兄「ここの P=P-1を消すと死んでも自機数減らないんだよ」
自分「へぇ」
当時小学3年ごろ。
これで変数と言うのを理解したわ。 どういう順番でも抽象的な理解はできると思うよ。本当に「理解」なのかわからんけど。
でも数学が先じゃないと時間の無駄という気はする。 線形代数はプログラミングと同時にやってもいいと思うわ。紙の上の操作はちょっとつまらん 線形代数とプログラミングってなんの関係があるん?
最近、プログラミング始めたからよくわからんのよな >P=P-1
プログラム上と代数学上の記法の違い、最初面食らわなかったか? >>923
変数にしろ関数にしろ教え方がアホすぎて全然理解できてなかったわ
単に計算できるだけだった
後にプログラミングやるようになって何で学校の数学ではあんな馬鹿な教え方をされたんだろうかと思ったわ やねうらおとか小学生の時にはもう大学の数学をやっていたというが・・・冗談なのか本当なのかわからんがとんでもねぇプログラマなのは確かだからな・・・ >>923
だからお前は猿のままなんだな、納得した P=P-1みたいなのが解らない人は関数型言語に行けば良いんじゃ無いかな。
代数学に比較的近い。 >>930
プログラミングに必ずしも数学が得意で有る必要は無いとは言われてるけど、数学得意な人がプログラミング出来るようになる事が多い気はする。
どちらも例外はあるけれども。
少なくともプログラミング関係の専門書って大学数学前提が多い。
前提じゃ無いのはわざわざ高校数学で出来るとか書いてるし。 1〜12月を入力し、入力した月の日数を表示する。
これを論理演算子で表示しろという。
else if( month == 3)
{ printf("3月は31日です\n")}
というのを作ったが不可。
論理演算子を使っていないからという。
論理演算子をどう使えばいいんですか。 >>936
month == 3 && printf("3月は31日です\n");
とか?w >>936
m を月としたら
d = (15657907 >> (m - 1) * 2) & 3 | 28;
とか? >>940
それはビット演算子、そして+、あと普通は0x*****で書く >>941
あぁ、そうか。
てことは単純に 30日になるもの 31になるものを || でまとめろって話か。 >>942
まあ普通はな。
ただそれ以前に、if文11個連ねて書くよりは…のはずだから、
普通は正しく動けばまずはよしで、それより断然いい書き方があるよね、となる。
いずれにしても先生に聞け、でしかないが。 第三回バーチャルYouTuber人気投票リベンジ募集中(全287名、2018年10月27日〜)
あなたの好きなVtuberは?(一人十票)
https://script.google.com/macros/s/AKfycbzW_Er5wP6kI0ZNcmcZVA4UdlXPiernQqL4xG1dVv146T8LwGKZ/exec
・前回(2018/8/22)は不正投票が行われた為、投票を途中で中止させていただきました。大変申し訳ありませんでした。
・Googleフォームは標準仕様では不正投票が可能な為、改造して対策を行いました。
・2018/10/27時点でチャンネル登録数10,000人以上のVtuberを対象としています。
・一つのチャンネルでVtuberが複数人いる場合は、それぞれ分けています。
・一人十票です。(全287名の中からお好きなVtuber10名を選んでください。)
・このフォームに投票するにはグーグルアカウントでログインする必要はありません。
・並び順は前回の得票数の高い順と新人は登録者数の多い順に並んでいます。
・今回も1,000人の方が投票するまで継続します。
なお投票結果はスプレッドシートにリアルタイムで表示されるようにしました。
また【概要】と【詳細】でシートを分けております。
https://docs.google.com/spreadsheets/d/1qvhqRdbbOFGQ2veqrnQmaAXIA79xTAANKUKa3HEUUC0
▽過去の投票結果はこちら
第二回バーチャルYouTuber人気投票結果(2018年6月5日〜8月6日、全投票数1,000票)(スプレッドシート)
https://docs.google.com/spreadsheets/d/1HqVp41DzLXPSuarWKkqNFZRyL20-nkMF5O5kkeEmqnA
第一回バーチャルYouTuber人気投票結果(2018年5月7日〜5月30日、全投票数1,000票)(スプレッドシート)
https://docs.google.com/spreadsheets/d/1uaKoB3pJQHgC9VEkvg74v9OaSNW3Zvccr91mPN1lt5k
tyjty >>943
…お前の中ではif文で書いて当然の処理なのか >>931
中学生にちょっと教えるだけで変数を理解するのは
大抵の人間には「変数」を理解する資質が生まれながらに備わってるからさ
要するに生得論だよ 論理演算子なんて要求がなければ、配列作ってテーブル参照にしてしまう >>945
普通は948の通りだろ。
そこを論理演算子なのだから、論理演算子の練習だろ。
超初心者だってことだよ。 >>946
それだとお前が今現在も猿と同程度なのと矛盾するだろ >>936
m を月の数として
printf("%d月は%d日です。\n", m, m == 2 ? 28 : (30 + ((m & 1) ^ (m >= 8 ? 1 : 0))));
なんてのはどうかな。年がわからないので2月は28日固定だが。
バグの温床になりそうなので普通はこんな複雑なの書かないが。 レス数が950を超えています。1000を超えると書き込みができなくなります。