X



C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8a6f-bDrV)
垢版 |
2017/08/10(木) 20:21:23.44ID:hEocmkh50
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/


http://mevius.2ch.net/test/read.cgi/tech/1500293207/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0182デフォルトの名無しさん (ワッチョイ 096f-pmc4)
垢版 |
2017/08/30(水) 23:14:59.21ID:58Rp2mqQ0
ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
0183デフォルトの名無しさん (スフッ Sdea-NYHg)
垢版 |
2017/08/30(水) 23:55:33.72ID:FdjUx67gd
最適化かけないと通るけど、最適化かけるとセグフォ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
0193デフォルトの名無しさん (ワッチョイ a323-X0kF)
垢版 |
2017/08/31(木) 02:33:47.40ID:KfXpPD/x0
最適化の有無で変わった事と言うと、この前こんなことがあった。
(以下の A, B は typedef された構造体)

A *p = NULL;
B *q = NULL;

if (...) {
 A x;

/* x の初期化などをする。 */

 p = &x;
}

if (...) {
 B y;

/* y の初期化などをする。 */

 q = &y;
}

この後で p が NULL でなければ p の指す先を使おうとして死亡。

まあ、ブロック(というかスコープ)から外れた所で使ってるんだから当然と言えば当然ではあるが、
最適化しない場合は x, y はその他のブロック外の自動変数と同じようにスタックに領域が取られ
ていて変化する事がなかった。そのため内容は保たれた。
しかし最適化したら A の領域は A のあるブロックから外に出たら破棄されたと解釈され、そして
B のあるブロックの B の領域として上の A の領域を使用するようになっていた。そのため x と y
の指す先は union のように重なってしまっておかしくなったと。
0194デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
垢版 |
2017/08/31(木) 03:22:36.47ID:IR3nOS0l0
>>179
いや、もっと単純に、APIの仕様変更で取得できる情報や型が変化したけど、エラー処理とか偶然うまく見える場合とかは目視では見落としがあるよねということ
テストを書く前に簡単に修正箇所がわかれば便利みたいな話だけど、まぁ、やり方やライブラリによって違うのかもね
少なくともAngularとかはTypeScript採用だし、型あったほうが便利派は少なからずいるよとだけ
0195デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
垢版 |
2017/08/31(木) 03:58:43.17ID:IR3nOS0l0
>>180,181
C#でも同じようにラムダ式やローカル関数で変数をキャプチャできるぞ
というかC++でもできるはず

コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
新しいライブラリとかはPromiseで返すのが当たり前になって来てるし、今後の言語もasyncに舵をきるんじゃないかな

>関数ポインタを差し込む時にいちいち考える必要がない
C++でどうやって実現すんの?
char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ

コンパイルエラーじゃなくてテストで保証するとになればなおさら変
0196デフォルトの名無しさん (ワッチョイ 7f2b-gSHU)
垢版 |
2017/08/31(木) 04:15:22.77ID:IR3nOS0l0
>>181
>最初から(A)(C)(B)の順に処理しろ
何言ってんだBとかCに副作用があるなら入れ替えちいかんだろ

コードは適当だけど、
void test(a,b)
{
hoge(&a,&b);
piyo(a+b);
}
test(1,2)
みたいに静的に確定するなら、piyoの引数をコンパイル時に計算してpiyo(3)みたいなコードをはいてくれたりもする
0198デフォルトの名無しさん (ワッチョイ 430d-b8Mh)
垢版 |
2017/08/31(木) 11:26:29.57ID:e5ym4hpC0
やりそうなこと

□ 要素数 n=10 の配列 int array[10];
アクセス可能なのは array[0] 〜 array[n-1] まで
なのに array[n] を利用してる

□ 文字列による配列の初期化で 終端記号(\0)含んだ分の領域を用意してない
× char text[3] = "123"; // 終端記号含めると 4要素の空間が必要なのに 3要素にしてる
○ char text[] = "123";  // コンパイラにおまかせで

□ 要素数を求めるのに sizeof(a) / sizeof(a[0]) を使ってるけど
そもそも論で a が配列ではなくポインタだった為
処理したい要素数が渡っていない
0199デフォルトの名無しさん (ワッチョイ fff0-6h2J)
垢版 |
2017/08/31(木) 13:55:57.05ID:wUqC2S3T0
>>183
研究室から出せない秘伝のソース、
なら特殊なハードウェアで、実はvolatileが欠かせない、とかじゃねえの
ソースの向こうのハードウェアが実は核分裂制御装置でした!……とかでももう驚かねえよ
0201デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/08/31(木) 16:17:00.98ID:JYM1pg890
半分使って、半分継ぎ足しを繰り返すと79回目あたりで
アボガドロ定数の逆数くらいに薄まるよね
0203デフォルトの名無しさん (ワッチョイ 6323-6h2J)
垢版 |
2017/08/31(木) 22:53:34.07ID:F9uWTtxD0
>>194
> 型あったほうが便利派
半分くらいはインテリセンス目当てだと思うぞ。
そして俺自身も型を否定はしないが、C++の型検査も過剰気味だと感じている。
だからconstは使ってないし、関数ポインタの型検査もウザイ。
つーか、型を間違えること自体がほぼ無いだろ?
引数の順番を間違えたりした場合に型検査で引っかかるってだけで。
0204デフォルトの名無しさん (ワッチョイ 6323-6h2J)
垢版 |
2017/08/31(木) 22:54:02.64ID:F9uWTtxD0
>>195
> ローカル関数で変数をキャプチャできるぞ
ローカル変数しかできんだろ。しかも明示しなければならない。(全指定も出来るが)
JavaScriptの場合は上位関数の変数をどこまでも辿れるので、(レキシカルスコープ)
入れ子になっていても破綻せずに分解して展開出来るんだよ。
C++方式の場合はawait内にawaitが入れ子になっていると、展開出来ないだろ。

> コールバックは階層が増えたりエラーや例外処理、分岐などが生じるとどんどん複雑になって単純には行かなくなる
> それを解決するのがPromiseで、それを更に単純に記述するのがasync/await
これは通説だが、俺はこれが嘘だと思ってるんだよね。
JavaScriptで言われているcallback地獄ってのは、非同期処理をその場で入れ子で書いている。
それよりawaitの方が見やすいってのは、上から順に読める形式だから。
でも>>180に書いたとおり、JavaScriptの文法ではcallbackを常に展開して書けるので、
その気になればawaitと同じ順で処理を書けるんだよ。(非同期がネストしない)
つまり、レキシカルスコープ+クロージャなら、awaitが無くてもawaitと同じ順で処理を書けるわけ。
C#やC++はレキシカルスコープがないからawaitが必要なだけ。
だからここら辺は実は文法との相性もあるんだよ。
C++はそんなのお構いなしに何でもかんでも入れてる感じだが。
(とはいえ、選択肢が増えること自体は悪いことではない)

> char *を受け取る関数ポインタにとconst char*で受ける関数ポインタを入れてエラーにしなかったらややこしくて危険なだけでしょ
そりゃconstの有無をテストで落とすのは無理だろうさ。
まあ、俺はconst自体が意味無い(無駄な手間が増えるだけ)という認識だが。
(ただし本当の意味でのconst(「定数」)の場合は使う。Cならマクロで与えていたケースとか)

そもそも君はどこまでconstを使っているんだ?
C++のconstは「定数」ではなく「再代入禁止」だ。
現実的には無駄に再代入することもないので、ローカル変数の大半にconstを付けられるはず。
これをやっているのか?
やっていないのなら、君自身も「過剰な型検査」が存在することを認めていることになるが。
0205デフォルトの名無しさん (ワッチョイ 6323-6h2J)
垢版 |
2017/08/31(木) 22:54:22.15ID:F9uWTtxD0
>>196
コードを流用するとね、
void test(a,b)
{
// (A)
hoge(&a,&b); // (B)
piyo(a+b); // (C)
}
で、(B)をconst指定にした時のみ(C)で大胆な最適化を行えるケースは、
・(B)が(C)に影響する副作用を持っていないと「const指定した時のみ」分かる
場合だけだが、これはconst指定ではどうにもならんだろ。

これはプログラマが上位の仕様(test関数の仕様)として規定するものであって。
例えば構造体配列で、(B)は[i]への書き込み、(C)は[j]からの読み出しで、i!=jが上位で保証されているとか。
この場合は、プログラマが最初から(A)(C)(B)の順に書けるんだよ。
そうではなくて、(B)が(C)に対しての副作用を持つ可能性がある場合、つまりi!=jが保証されていない場合、
当然(B)(C)の順にする必要があるけど、
これをconst指定で最適化(=(B)が(C)に対しての副作用を持たないことを保証)することは出来ないでしょ。
0206デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 02:04:57.35ID:2msaHTP30
>>204
ん、C++のconstは、Cのconstよりも「定数」だぞ
int const a = 1;
switch(1) [
case a: ; //valid in C++, invalid in C
}
0208デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 09:06:42.83ID:2msaHTP30
typoしとるな
[は{
0210デフォルトの名無しさん (ワッチョイ 53db-aQR2)
垢版 |
2017/09/01(金) 11:36:56.59ID:IGPoCkp90
Cのconstは変更不可なオブジェクトだからな
0212デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 15:37:25.51ID:2msaHTP30
違う
constはもともとC++発祥のもので、
Cでパクるにあたり微妙に改変した
constは最適化に関係するが
今この流れでは最適化とは全く無関係の話をしている
0215デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/01(金) 18:43:10.50ID:2msaHTP30
ビットフェードとvolatileは関係ないぞ
0219デフォルトの名無しさん (ワッチョイ a323-wVzx)
垢版 |
2017/09/03(日) 11:44:42.91ID:jl0cf3RS0
性的な
0221デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 17:40:32.30ID:jXGwZqzU0
一口にstaticと言っても、そのキーワードは用法で意味が変わるからなあ
0224デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/03(日) 18:47:29.02ID:jXGwZqzU0
C99以後、仮引数のstaticもあるしな
0225デフォルトの名無しさん (ワッチョイ ffea-pNuo)
垢版 |
2017/09/04(月) 00:43:28.93ID:QxIkVb9z0
ポインタ関連で*と&の記号を使っているのも
初心者を遠ざけているよな
素直にpointerとかrefとかの予約語作ればよかったのに
0226デフォルトの名無しさん (ワッチョイ 7f89-eV1K)
垢版 |
2017/09/04(月) 01:05:35.63ID:IeE+YITL0
>>225
もともと高級アセンブラとして生まれた経緯を考えたら、ポインタ関連の基本的な記述のためにはくどいキーワードではなく最もシンプルな演算子が割り当てられるのは自然なことだと思う。
0229デフォルトの名無しさん (ワッチョイ cf1c-PLFS)
垢版 |
2017/09/04(月) 08:55:10.34ID:pd3pCmCq0
>>228
ISO/IEC9899:1999
6.7.5.3 Function declarators (including prototypes)
21 EXAMPLE 5
void f(double a[restrict static 3][5]);
0230デフォルトの名無しさん (ワッチョイ a323-wVzx)
垢版 |
2017/09/05(火) 00:59:51.51ID:2RdPD3ce0
>>229
ああ。そういう使い方か。
0231デフォルトの名無しさん (アウアウウー Sa47-ktFK)
垢版 |
2017/09/07(木) 15:42:36.42ID:zsD50ajta
以下の三つの操作に違いはありますか
NはMと比べて十分大きいとします

char s[M];
wchar_t ws[N];
mbstate_t state = {0};
// 1
scanf("%s", s);
wbsrtowcs(ws, &s, N, &state);
// 2
scanf("%ls", ws);
// 3
wscanf(L"%ls", ws);
0232デフォルトの名無しさん (ワッチョイ b323-QlH+)
垢版 |
2017/09/08(金) 04:19:51.29ID:LlnxN/9E0
>>231
1のscanf()はchar型で文字列を受け取ろうとするのでエンコードによっては複数バイト文字が全て読めない可能性がある。
例えば2バイトづつのUnicodeの0xff以下のコードがそのまま来た場合、ビッグエンディアンならすぐに0x00が1バイト目に来てしまう。
0233デフォルトの名無しさん (エーイモ SE5a-w7pF)
垢版 |
2017/09/08(金) 22:13:19.23ID:Hco6il2OE
兄貴すいません
アロー演算子の使い方を学びたいのですがどこを直せば動くのか教えてください

#include <stdio.h>

struct User {
char name[5];
int age;
};

int main()
{
struct User *u = { "hoge", 10 };
if (u->hoge != NULL) {
printf("%d\n", 1);
} else {
printf("%d\n", 0);
}

return 0;
}
0236デフォルトの名無しさん (ワッチョイ 1af0-x/0H)
垢版 |
2017/09/09(土) 12:01:06.79ID:KEHxH6tI0
>>233
mallocして中身を詰める

#include <stdio.h>
#include <stdlib.h>

typedef struct{
char name[5];
int age;
}User;

User* new_user(const char* const name, const int age){
User* u = (User*)malloc(sizeof(User));

strcpy(u->name, name);
u->age = age;

return u;
}

int main(){
User* u = new_user("hoge", 10);

if (u->name != NULL) {
printf("%d\n", 1);
} else {
printf("%d\n", 0);
}

return 0;
}
0238デフォルトの名無しさん (ワッチョイ b7e4-hwHx)
垢版 |
2017/09/09(土) 16:17:54.34ID:qJRB74Th0
>233
int main(){
return !printf("%d\n",strlen( (&(struct User){.[0]name=0, .age=10, .name={'h','o','g','e'}})->name) 1: 0), 0;
}
char[5] nameとNULLの比較じゃ意味ねーと思うんだわ
0239デフォルトの名無しさん (ワッチョイ b323-xkdj)
垢版 |
2017/09/10(日) 04:20:42.87ID:3lFSiHDa0
>>237
大丈夫だと思う。
0242デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 11:46:48.72ID:uI7cAZFMa
暇すぎたので昨日からC言語の勉強始めましたプログラミング初心者です。
これって趣味にできる?
0245デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:42:12.95ID:uI7cAZFMa
今本屋なんだけどどの本で学ぶのがいい?
てかphytonとか他の言語の方が良かったりする?
0246デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:45:14.25ID:uI7cAZFMa
ちなみに本職は監査法人の公認会計士で監査してるんだけど仕事に役立つならそれに越したことはない
0247デフォルトの名無しさん (ワッチョイ b339-xWDE)
垢版 |
2017/09/10(日) 13:50:00.90ID:SyCSejr00
幅広くエロエロやると上達早いで
もしノイマン型コンピュータの基本知識が
無いのならどこかで学習する必要がある
メモリ、アキュムレーター、インデックスレジスタ…etc
0248デフォルトの名無しさん (ワッチョイ baef-/PUN)
垢版 |
2017/09/10(日) 13:53:38.31ID:rGvjr77j0
>>246
公認会計士の仕事にはなかなか結びつかないだろうけれども…ガンバレ
C/C++ はどちらかというと原始的
python AI/機械学習で今はやり

ゴルフでもなんでも最初は大変だから一定の覚悟が必要
0249デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 13:56:43.80ID:uI7cAZFMa
あんま知識は無い。
じゃあC言語とphytonを並行して学ぼうかしら。
0250デフォルトの名無しさん (ワッチョイ b323-QlH+)
垢版 |
2017/09/10(日) 14:35:30.74ID:3lFSiHDa0
会計ねえ。Excelとかの本のほうがいいかも知れんな。その方が仕事に結び付けられる事が多くて覚えは早いのではないかと思う。
マクロも一応プログラムだしな。Excelにくっついた形のものではあるが結構色々な事ができる。
で、それがある程度できるようになったらプログラムというものがだいたいどういうものかわかるようになってるだろうから次はVBのように似ているものをやる。
似ているのでこれの習得はかなり早いと思う。それから他の言語を色々やって幅を広げる。
0252デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 15:07:37.65ID:uI7cAZFMa
まあ別に趣味だから仕事に役立たなくてもいいぞ
0253デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 15:12:20.15ID:uI7cAZFMa
苦しんで覚えるC言語っての買った
0259デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 17:58:39.08ID:Z8XrRGDBa
受信したメールの中身を理解して必要なメールと不必要なメールを分け、必要なメールの情報を分かりやすい文章に要約して表示するプログラムC言語で作れる?
ついでに簡単な返信なら自動でしてくれたらありがたいんだが。
0260デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 18:04:27.57ID:Z8XrRGDBa
返信が必要なメールと判断した場合は、返信メール本文の例を1万種類ぐらい自動で作成して、その中からより最適なものを3種類ぐらい提示してきてこっちはそれを選ぶだけで良いという機能も欲しいぞ
0267デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/10(日) 19:00:48.08ID:BxaTac1G0
>>259
「必要なメール」とそれ以外の境界を
おまえさんが明確化できるか否かにかかっている
何言語を使おうが同じことだ
Cは推論エンジンそのものを作れる言語で
通信アプリやドライバを作れる言語でもあるので
諦めねばならないアイディアはまずないはず
0268デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 19:38:42.01ID:Z8XrRGDBa
>>267
「必要なメール」とそれ以外の境界線はこれまで私自身が行ってきたメールへの対応を見てプログラム自ら学習して欲しい。
また分類や要約は高度な文脈、ニュアンス判断も伴うレベルで行わせたい。
それも様々な小説や文献を通してコンピュータ自ら学習して欲しい。

ちなみにこれ外注したらいくらぐらい?
10万円ぐらいするかな?
0273デフォルトの名無しさん (ワッチョイ 0e1c-HB/9)
垢版 |
2017/09/10(日) 20:10:47.20ID:BxaTac1G0
>>268
267だが、Cは推論エンジンを作れると言ったはず
おまえさん自身はそこから学習しなかったのか?

10万ねえ
支那の国家プロジェクトがどうなっているか知っているか?
支那からのSPAMに「天安門」と書いて返信すると我々にとって
ありがたい動作をしてくれるというアレだ
国家ではないが大企業のAIが共産党は無能とか言い出して
ひと騒ぎにもなったよなあ
おまえさんの10万円のソフトはおまえさんを無能とか
言い出さないか?
0274デフォルトの名無しさん (アウアウカー Sa43-+qdT)
垢版 |
2017/09/10(日) 20:26:02.78ID:Z8XrRGDBa
あとC言語でタイムマシン作れる?
といっても未来のインターネット閲覧できる程度でいいんだが。
作れる人いたら10万円までなら出すぜ。
0277デフォルトの名無しさん (ワッチョイ 576c-+qdT)
垢版 |
2017/09/10(日) 20:42:41.68ID:I7ZEh6pU0
物理法則なんて人間が考えたものに過ぎないからどうせ間違いだらけでしょ?
0279デフォルトの名無しさん (ワッチョイ 3b97-oRRO)
垢版 |
2017/09/10(日) 21:11:06.17ID:n6o1Bnrv0
物理は、むずかしい
■ このスレッドは過去ログ倉庫に格納されています

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