X



C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
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
0801デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:35:56.33ID:Q3d5MYhb0
ソースコード関係の知識は苦Cやらで積めるけどソフトやらの知識はどこで積むんだ
0802片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd33-WP5G)
垢版 |
2017/10/17(火) 22:36:28.37ID:/2LkUivAd
プリコンパイルヘッダーを使用するのであれば、プロジェクト内のどこかのソースファイル(例えばstdafx.cpp)を使って、プリコンパイルヘッダーを作成しないといけない。
あるソースファイルにおいてプリコンパイルヘッダーを使用するのであれば、プリコンパイル対象のヘッダーを#includeして、そのソースファイルがプリコンパイルヘッダーを使用することを設定する。
プリコンパイルヘッダーを使用しないなら、すべてのソースのプロパティでプリコンパイルヘッダーを使用しないように設定する(空のプロジェクトの規定値)。
0806デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:59:14.26ID:Q3d5MYhb0
>>804
とりあえず空のファイルは作れたけどソースが書けん
0807デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:01:36.30ID:PpmRGT3a0
新しいプロジェクト

空のプロジェクトを作成

空のソースコードファイルを追加

>>789をコピペ

実行
0808デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 23:02:26.49ID:Q3d5MYhb0
>>807
空のソースコードファイルどうやって作るんだ
0809デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:08:36.86ID:PpmRGT3a0
>>808
プロジェクト開いたときの右にあるソリューションエクスプローラの中のソースファイルというフォルダを右クリックして「追加」から「新しい項目」をクリック。
「C++ファイル」を選択した状態でファイル名の拡張子を.cに変えて「追加」ボタンを押す。
0810デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 23:15:28.33ID:Q3d5MYhb0
>>809
できた
もしこれから新しくファイルを作る場合はこれを一からやるのか?
0812デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:18:59.07ID:PpmRGT3a0
>>810
うん。
簡単なプログラムならVSでプロジェクト作るよりもスタートメニューのVSのフォルダの中にある開発者コマンドプロンプト使ってclコマンドでコンパイルした方が手軽だな
0813デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 23:21:25.70ID:Q3d5MYhb0
>>812
ありがとう
これ以上はスレチだからやめておこう
0814デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:46:56.11ID:PpmRGT3a0
スレチかもしれないけどVS2017でANSI C(C99/98, ブロック先頭でしか宣言できないやつ)だけしかかけないようにできますか?
0815デフォルトの名無しさん (ワッチョイ 7985-BSx0)
垢版 |
2017/10/18(水) 18:18:50.69ID:oOtBC3bP0
みなさんは関数名の後に続く中括弧の前に改行を入れますか?入れませんか?

例えば、
int main(void) {
  /* 処理 */
}
のようにするか、

int main(void)
{
  /* 処理 */
}
のように書くのか、どちらが多いのか気になります。
0816デフォルトの名無しさん (ガックシ 06eb-dPak)
垢版 |
2017/10/18(水) 18:20:58.46ID:M3PcmRrI6
入れます
0818デフォルトの名無しさん (ササクッテロラ Sp45-NqOW)
垢版 |
2017/10/18(水) 21:12:51.09ID:QINtBhkfp
各社のコーディング規約に合わせます。
0820デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/18(水) 23:24:47.06ID:bG8m3FQp0
>>815
改行入れるね。

なんでそうなったかというと、C言語は昔は引数の型をカッコ内に書けなかった。つまり

int main(argc, argv)
int argc;
char *argv[];
{
 ・
 ・
 ・

 return 0;
}

のようにしか書けなかった。その当時から覚え始めたというのと、K&R もそれで書いて
あったのでそのまま何も考えず俺の中で改行入れるのが定着した。
0821デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/19(木) 01:30:41.79ID:gvKdwGxW0
for()
{

}
こうしたときに一行増えるから嫌だだっていう人が多そうだな
0824デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/19(木) 10:07:41.47ID:+lKpulfRp
c#みたいにメソッドを直接鉤括弧内にベタ書き出来る言語でもなけりゃ先行改行一択なんだがなあ
0825デフォルトの名無しさん (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/19(木) 10:25:15.32ID:r/pcyA6+0
貴重な一行
0826デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/19(木) 10:27:21.64ID:SxBqlyg46
>>824
どういう意味?
0827デフォルトの名無しさん (ブーイモ MM71-WXi2)
垢版 |
2017/10/19(木) 11:44:04.67ID:zAbDVwTYM
今みたいに時間単価での清算が主流になる前は、
ステップ単価清算ってのもあって、K&R以外で書くと
増量しているって言われていたの。

cb とか indent なんてコマンドはその名残かな
0830デフォルトの名無しさん (ブーイモ MM71-v1IO)
垢版 |
2017/10/19(木) 12:34:12.75ID:LAmWAPnYM
>>815
統計取る方法がないから、確実な答えはわからないと思うよ。
で、戦争のたびに出る結論が「気にするな」「仕事環境に従え」なんだよねー。

で、俺はどうかと言うと、俺も不思議と>>823に落ち着いた。
0832デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:33:33.89ID:PsgLgPWo0
http://9cguide.appspot.com/15-05.html
これのモードの切り替えってところで判定結果違うんだが俺だけ?
pがでたらめな数字になる
コピペしても変わらなかったから多分タイプミスとかじゃないと思う
0834デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:50:26.60ID:PsgLgPWo0
できた
ありがとう
0835デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/19(木) 22:50:52.77ID:4jVxr5CI0
10 1
scanf("%d%d", a, b);
こう読み込んだ時に空白を飛び越えて読み込んでくれるん?
10,1
この時はエラーになっちゃう?
0836デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/19(木) 22:53:39.25ID:Y4NllfOF0
多分空白はできる
,を入れたかったら%d,%dすれば多分できる
0841デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/20(金) 00:41:34.11ID:Wby94Fq80
>>837
入力が決められてなかったらscanfじゃあできないからわかるわー
0844デフォルトの名無しさん (エーイモ SE7a-5x7G)
垢版 |
2017/10/20(金) 09:24:11.93ID:NCAWbF0uE
本買うお金がないのですが公式なドキュメントってどこで見れますかね?
0845デフォルトの名無しさん (ワッチョイ ddb3-0MKJ)
垢版 |
2017/10/20(金) 09:53:04.65ID:VprmOZRL0
>>1に書いてあるのではだめなん。
0847デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:55:02.73ID:7oD3lqB2p
C言語の仕様は規格が決まってるから、調べれば幾らでもネットに落ちてるんだがなぁ〜
0848デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:56:41.44ID:7oD3lqB2p
ランタイムライブラリやプラグマやデファインの事なら使ってるコンパイラにドキュメントがあるだろ?
0849デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:36:54.91ID:XMzxe3/+0
ネスティングを気にするかどうかは各自のスタイルによる
気にならない書き方はいくらでもできるし
ファイル分割がいやでべた書きする奴はネスティング気にするだろ
0850デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/20(金) 12:40:39.31ID:3KJGg1dF6
どう思う?


#include <stdio.h>

void test(a, b, c)
int *a;
int *b;
int *c;
{
*c = *a + *b;
}

int main(void)
{
auto register int a;
auto register int b;
auto register int result;

a = 10;
b = 32;
test(&a, &b, &result);

printf("%d + %d = %d\n", a, b, result);
return 0;
}
0851デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:43:18.91ID:XMzxe3/+0
ネスティングが浅い記述しか書かない奴にとってはどうでも良い案件なんですよ
技術計算を多用するコード例だとネスティングちゃんとしないと分けがわからなくなる
0852デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 17:02:28.07ID:Hcn/q6HeM
なんで配列の要素数って省略してもいいのですか?
0855デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 17:57:17.39ID:7oD3lqB2p
配列は何次元でも扱える代わりに中身の管理は利用者に一任されたんだ。
0856デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 18:16:01.46ID:Hcn/q6HeM
>>853
配列の宣言の時です。
省略してはいけないのはどういう場面ですか?
0857デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/20(金) 18:42:47.35ID:3KJGg1dF6
>>856
初期化無しの宣言とか?
0860デフォルトの名無しさん (ワッチョイ a593-+4Iz)
垢版 |
2017/10/21(土) 07:38:47.06ID:KIdTQfIK0
>>850 すごく… 古くさいです…

それはともかく register 宣言した変数は
アドレス取ろうとした時点でコンパイルエラーじゃなかったかな?
あと俺の環境では auto と register の同時指定がダメと言われる。

古いコンパイラだとどっちも許されるんだっけ。
0862デフォルトの名無しさん (ワッチョイ 4e8a-JMxd)
垢版 |
2017/10/21(土) 08:49:05.01ID:TZDyO3Kt0
registerは可能ならばレジスタに割り当てると言う意味なので、アドレス演算子を使えばレジスタに割り当てられない
利用可能なレジスタ数を超えてregisterが使われうる可能性を考えれば明らか
autoとも併用できないし、半可通としか言いようがない
0867デフォルトの名無しさん (ワッチョイ 7ad2-9nkm)
垢版 |
2017/10/21(土) 10:46:45.41ID:KlHNvq3I0
仕事で5年くらいMATLABやってたけど来月からC言語やらなあかん
難しそうで、もうイヤイヤ期よ

C なんて10年くらい前に大学の講義でチョロチョロってやっただけ

応援メッセージ待ってます!
(´;ω;`)
0870デフォルトの名無しさん (ワッチョイ 317f-0GSP)
垢版 |
2017/10/21(土) 11:38:57.68ID:Q5TWqxQz0
>>864
規格書の
6.5.3.2 Address and indirection operators

The operand of the unary & operator shall be either a function designator, the result of a [] or unary * operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register storage-class specifier.
こう書いてある
0872デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:04:46.13ID:VJktQUPlp
俺にはレジスタ変数に割り当てた変数を関数のアドレス渡し引数にする意図が想像できない。
そんなにオーバーヘッド気になるなら、グローバル変数でレジスタ変数宣言してしまえって思う。
0875デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:43:51.25ID:VJktQUPlp
じゃあそんなクリティカルな問題無い様に、関数化する事自体を諦めた方がいいのでは?
0876デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:46:37.26ID:VJktQUPlp
ヘッダーファイルにインライン宣言した関数を記述してしまうって解決方法もあるよな?
0880デフォルトの名無しさん (ワッチョイ f9d6-1OZr)
垢版 |
2017/10/21(土) 20:38:07.37ID:LO7dvffl0
グローバル変数をregister指定できたり楽しかったなあ
0881デフォルトの名無しさん (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/21(土) 20:48:45.74ID:S+Fuo4jD0
いや、指定しても実際効果あるか無いかってだけだからなぁ
0883デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/21(土) 23:00:30.68ID:qfiVibk/0
10年前にC言語覚えたなC#もないopenGL作る時も基礎が出来てない白紙から打ち込んでたから凄い大変だったのを思い出したわ
0884デフォルトの名無しさん (ワッチョイ a593-+4Iz)
垢版 |
2017/10/22(日) 05:28:16.50ID:m20yJ7cw0
register宣言とアドレス演算子の話だけど、
Cではエラー、C++だとアドレスを取れる(register指定は無視される)、みたいね。
望洋さんのファックとWikipediaのC++に出てたわ。

…実は逆に覚えててね。
レジスタに割り当てた変数の変数のアドレスが欲しいってのは矛盾してるから、
C++は厳格にチェックするかと。
0885名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ a127-1OZr)
垢版 |
2017/10/22(日) 07:11:33.28ID:dj2Vz85u0
>>884
俺もそう思う
registerはprvalueであるべき
0888名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/22(日) 12:31:48.51ID:NaoIEEjs0
世の中には、レジスタがメモリーの先頭と同じ位置にマッピングされてるCPUだってあるけどな。
0889名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 3a23-0GSP)
垢版 |
2017/10/22(日) 13:39:13.59ID:f5TzHp7R0
質問です。ポインタ変数を用いてキーボードから入力された5つの整数を配列xに保存し、その要素の列挙と合計値を求めるプログラムを作ったのですが、
#include <stdio.h>
#include <stdlib.h>

int main (void){
int *p,x[4],sum=0,i,j;
p=&x[0];
for(i=0;i<=4;i++){
printf("%dつ目の整数を入力してください ",i+1);
scanf("%d",p);
sum=sum+*p; }
for(j=0;j<=4;j++){
printf("%d ",*(p+j));} /*配列の要素を列挙*/
printf("\n和=%d",sum); /*配列の要素の和*/
return 0;}
で、結果が
1つ目の整数を入力してください 1
2つ目の整数を入力してください 2
3つ目の整数を入力してください 3
4つ目の整数を入力してください 4
5つ目の整数を入力してください 5
5 4200864 6422368 4200955 6422288
和=15
となり、要素の列挙がうまくいかないので対策を教えていただきたいです。
0891名無しさん@そうだ選挙に行こう! Go to vote! (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/22(日) 13:55:57.90ID:pqhboyRRp
素直に配列使え。
0892名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ a593-+4Iz)
垢版 |
2017/10/22(日) 14:15:34.40ID:m20yJ7cw0
scanf() での値の格納先 (== sumに加える値の参照先) である p を
初期化時の &x[0] のまま進めてないから入力した値が上書きされるんだよ。
もちろん x[1], x[2], ... には値が入らない。


質問の趣旨と関係ない部分を指摘して混乱させるつもりはないんだけど、
配列 x[] の要素数が足りないのがオジさん気になるなぁ。
0893名無しさん@そうだ選挙に行こう! Go to vote! (アウアウウー Sa89-PVu7)
垢版 |
2017/10/22(日) 15:12:18.96ID:2+N8xzsVa
>>889
既に>>890-892が指摘済みだけど

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

int main (void){
int *p,x[5],sum=0,i,j; /* x[5] */
p = x;
for(i = 0;i <= 4; i++, p++){
printf("%dつ目の整数を入力してください ",i+1);
scanf("%d", p);
sum += *p;
}
p = x; /* ポインタの参照位置を配列先頭へ */
for(j = 0; j <= 4; j++){
printf("x[%d]=%d, ", j, *(p+j) );
}/*配列の要素を列挙*/
printf("\n和=%d\n ",sum); /*配列の要素の和*/
return 0;
}
0895名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ 7a87-DwBb)
垢版 |
2017/10/22(日) 15:27:37.67ID:NaoIEEjs0
まあ、なんでポインタに拘るのかわからんが、
つうか、書きと読みでアクセス方法は合わせた方がいいと思うが、
動きゃいいかw
0897名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/22(日) 16:41:26.75ID:iiKpFSsu0
起動の度に外部ファイルで変数の初期値を変えて起動したいんだけどどうすんの?
0899名無しさん@そうだ選挙に行こう! Go to vote! (ワッチョイ cee7-h3yZ)
垢版 |
2017/10/22(日) 17:06:30.45ID:iiKpFSsu0
外部ファイルに変数名と初期値を書いておきたい
レス数が900を超えています。1000を超えると表示できなくなるよ。

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