C言語なら俺に聞け 142 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©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
2017/10/16(月) 14:55:55.53ID:IgMp2p2X0
https://ideone.com/91sohX
へぇ 構造体のポインタだし通しそうだけど警告出す仕様なのか
(3行目 実体は不明だけど構造体のポインタを受け取るぞ宣言で警告)
2017/10/16(月) 14:58:01.40ID:rvbv2fod0
>>775
gcc -w
2017/10/16(月) 14:58:20.84ID:XYyvKIYbd
関数の前にstruct aho;とでも書いておけ。
782デフォルトの名無しさん (ワッチョイ fb8a-z1uI)
垢版 |
2017/10/16(月) 15:04:51.05ID:QsDGIdoW0
>>778
原因はわかっています。
構造体宣言を別のヘッダーで行っているにもかかわらず、
プロトタイプ宣言しているヘッダーより上に定義がないのが原因です

>>780
gcc -w ?
#pragma GCC diagnostic ignored "-w" でしょうか?
2017/10/16(月) 15:09:07.34ID:IgMp2p2X0
本当の定義じゃなくて 仮定義を前に置くだけで消えるのな
struct foo;
void func(struct foo* arg);
784sage (ワッチョイ fb8a-z1uI)
垢版 |
2017/10/16(月) 15:25:30.24ID:QsDGIdoW0
>>783
やはりそのように潰していくしかないのでしょうね。
2017/10/16(月) 15:43:34.17ID:rvbv2fod0
>>782
-Wで始まるオプション名は無いので無視するにはコマンドラインで-wを指定するしかない
786デフォルトの名無しさん (ワッチョイ 799f-vMUl)
垢版 |
2017/10/16(月) 22:46:04.81ID:snZUUJVe0
>>784
いや、てか、そのヘッダ書き換えられないのか?
787デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/16(月) 22:49:48.00ID:tZR41NVXp
自身のポインタを構造体に宣言するのと同じ様に書けよ。
2017/10/16(月) 23:21:23.22ID:7Byc8Q4r0
>>767
C 高級アセンブラ
++ ハナモゲラ
789デフォルトの名無しさん (ワッチョイ 09b3-XdBn)
垢版 |
2017/10/17(火) 20:18:22.83ID:Q3d5MYhb0
とりあえず勉強の成果として作ってみたら失敗した
なんでだ

#include <stdio.h>

int main(void)
{
int hyoji;
int kakikomi;
printf("階乗の表示:");
scanf("%d\n",&kakikomi);
for (hyoji = 1;kakikomi > 0;kakikomi--) {
hyoji = hyoji * kakikomi;
}
printf("結果は%dです", hyoji);

fflush(stdin);
getchar();

return 0;

}
790デフォルトの名無しさん (ガックシ 06eb-dPak)
垢版 |
2017/10/17(火) 20:29:18.04ID:FJCAd6676
>>789
scanfのところの\nって要らなくね
791デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/17(火) 20:54:03.89ID:Usq7nzejp
こんなすぐに桁溢れしちまう様なサンプル作ったら、何を試したいのかわからんだろ。
2017/10/17(火) 21:06:51.02ID:BSHBGdow0
しかしてfor文の中身を見るに全くの素人じゃあないな
793デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 21:08:48.81ID:Q3d5MYhb0
>>790
消したら動いた
ありがとう
2017/10/17(火) 21:24:15.93ID:0jVjcAN80
>>792
どのあたりが?
795デフォルトの名無しさん (ササクッテロロ Sp45-NqOW)
垢版 |
2017/10/17(火) 21:33:12.55ID:Usq7nzejp
初期化をあんなとこに書いたらコーディング規約で叩かれるしなぁ〜
2017/10/17(火) 21:46:54.15ID:fHKaWaxJM
>>794
forのカッコ内には同じ変数しか書いちゃダメって思ってる初心者はいるかも
個人的には変数名からCOBOLer疑惑の方が強い気がする
797デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 21:57:54.65ID:Q3d5MYhb0
VS2017でやってるんだがさっき作ったプログラムを保存して別のファイルで勉強を再開しようとして新しくファイルを作ったんだ
そしてテストも兼ねてさっきのプログラムコピペしたら
プリコンパイルヘッダーを検索中に不明なEOFが見つかりました。
'#include"stdafx.h"をソースに追加しましたか?
と出た
さっきは何もなかったのに
798デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 22:19:31.03ID:PpmRGT3a0
>>797
それな
よく分からんけど空のプロジェクトってやつでプロジェクト作って自分でソースファイル作成すれば出てこない
まあ詳しい人が教えてくれるかも
2017/10/17(火) 22:26:24.33ID:/2LkUivAd
>>797
プリコンパイルヘッダーというのは、プロジェクト内のヘッダーを事前にまとめてコンパイルしてビルドを早くする仕組みのことだ。
通常、stdafx.hというヘッダーにプロジェクトで使うヘッダーをまとめる。
一つ一つのソースファイルごとのプロパティでプリコンパイルヘッダーを作成するか、使用するかを設定できる。
800デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:30:05.39ID:Q3d5MYhb0
>>799
つまり…どういうことだってばよ
801デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:35:56.33ID:Q3d5MYhb0
ソースコード関係の知識は苦Cやらで積めるけどソフトやらの知識はどこで積むんだ
2017/10/17(火) 22:36:28.37ID:/2LkUivAd
プリコンパイルヘッダーを使用するのであれば、プロジェクト内のどこかのソースファイル(例えばstdafx.cpp)を使って、プリコンパイルヘッダーを作成しないといけない。
あるソースファイルにおいてプリコンパイルヘッダーを使用するのであれば、プリコンパイル対象のヘッダーを#includeして、そのソースファイルがプリコンパイルヘッダーを使用することを設定する。
プリコンパイルヘッダーを使用しないなら、すべてのソースのプロパティでプリコンパイルヘッダーを使用しないように設定する(空のプロジェクトの規定値)。
2017/10/17(火) 22:39:12.15ID:/2LkUivAd
ソースファイルが二、三個なら、とくにプリコンパイルヘッダーは、必要ない。
2017/10/17(火) 22:43:34.43ID:kMB04QqG0
>>800
おとなしく>>798の言う通りにしろってこと
2017/10/17(火) 22:44:21.68ID:/2LkUivAd
ソースファイルのプロパティは、IDE内のソースファイルのアイコンを右クリックして「プロパティ」を選ぶと設定できる。
806デフォルトの名無しさん (ワッチョイ 09b3-FNzi)
垢版 |
2017/10/17(火) 22:59:14.26ID:Q3d5MYhb0
>>804
とりあえず空のファイルは作れたけどソースが書けん
807デフォルトの名無しさん (ワッチョイ 5975-dPak)
垢版 |
2017/10/17(火) 23:01:36.30ID:PpmRGT3a0
新しいプロジェクト

空のプロジェクトを作成

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

>>789をコピペ

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

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

int main(void)
{
  /* 処理 */
}
のように書くのか、どちらが多いのか気になります。
816デフォルトの名無しさん (ガックシ 06eb-dPak)
垢版 |
2017/10/18(水) 18:20:58.46ID:M3PcmRrI6
入れます
2017/10/18(水) 19:40:16.86ID:3bYwz/rX0
if ()
{
}
ならいいけど
for () {
}
だと整合性無いじゃん
って話なら気にするな
だな
818デフォルトの名無しさん (ササクッテロラ Sp45-NqOW)
垢版 |
2017/10/18(水) 21:12:51.09ID:QINtBhkfp
各社のコーディング規約に合わせます。
2017/10/18(水) 21:18:46.08ID:lHCL+31VM
>>815
>>604
820デフォルトの名無しさん (ワッチョイ 799f-BSx0)
垢版 |
2017/10/18(水) 23:24:47.06ID:bG8m3FQp0
>>815
改行入れるね。

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

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

 return 0;
}

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

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

cb とか indent なんてコマンドはその名残かな
2017/10/19(木) 12:07:16.71ID:TosC+FXp0
>>826
無名関数が書けると最初の { 前の改行がおかしい気になるので
自動的に改行入れない派になるという話では?
2017/10/19(木) 12:17:59.77ID:rxi99hG50
>>823
俺もそれで落ち着いた
830デフォルトの名無しさん (ブーイモ MM71-v1IO)
垢版 |
2017/10/19(木) 12:34:12.75ID:LAmWAPnYM
>>815
統計取る方法がないから、確実な答えはわからないと思うよ。
で、戦争のたびに出る結論が「気にするな」「仕事環境に従え」なんだよねー。

で、俺はどうかと言うと、俺も不思議と>>823に落ち着いた。
2017/10/19(木) 14:41:51.95ID:cxE3kH8I0
https://ja.wikipedia.org/wiki/字下げスタイル
戦争だ
832デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:33:33.89ID:PsgLgPWo0
http://9cguide.appspot.com/15-05.html
これのモードの切り替えってところで判定結果違うんだが俺だけ?
pがでたらめな数字になる
コピペしても変わらなかったから多分タイプミスとかじゃないと思う
2017/10/19(木) 15:40:34.18ID:cxE3kH8I0
下の[実行結果] のように出力されるためには

× printf("p = %d\n",p);
○ printf("*p = %d\n",*p);

でないとな
834デフォルトの名無しさん (ワッチョイ ddb3-q7ul)
垢版 |
2017/10/19(木) 15:50:26.60ID:PsgLgPWo0
できた
ありがとう
835デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/19(木) 22:50:52.77ID:4jVxr5CI0
10 1
scanf("%d%d", a, b);
こう読み込んだ時に空白を飛び越えて読み込んでくれるん?
10,1
この時はエラーになっちゃう?
836デフォルトの名無しさん (ワッチョイ c575-G561)
垢版 |
2017/10/19(木) 22:53:39.25ID:Y4NllfOF0
多分空白はできる
,を入れたかったら%d,%dすれば多分できる
2017/10/19(木) 23:25:36.20ID:6TDKNKTM0
scanfのフォーマット指定は面倒だぞ
正直使いこなす気すらない
2017/10/19(木) 23:26:22.86ID:6TDKNKTM0
if ()
{
}
else
{
}
無いわな
2017/10/19(木) 23:41:36.02ID:c1L92+Tr0
if () {

}
else {

}

このフォーマットだと心が平和
2017/10/19(木) 23:52:20.12ID:vx5pXf0B0
>>828
うん、さっぱり分からん
そもそも鉤括弧って「」だし。
841デフォルトの名無しさん (ワッチョイ cee7-gNqP)
垢版 |
2017/10/20(金) 00:41:34.11ID:Wby94Fq80
>>837
入力が決められてなかったらscanfじゃあできないからわかるわー
2017/10/20(金) 01:19:37.06ID:l11teSHI0
>>839
俺もそれ
2017/10/20(金) 04:37:42.47ID:yDlUYSKqd
>>827
バージョン管理、コーティング規約対応用だろ

空白文字の使い方に無頓着なカスが存在する限り必須
844デフォルトの名無しさん (エーイモ SE7a-5x7G)
垢版 |
2017/10/20(金) 09:24:11.93ID:NCAWbF0uE
本買うお金がないのですが公式なドキュメントってどこで見れますかね?
845デフォルトの名無しさん (ワッチョイ ddb3-0MKJ)
垢版 |
2017/10/20(金) 09:53:04.65ID:VprmOZRL0
>>1に書いてあるのではだめなん。
2017/10/20(金) 09:58:32.79ID:rxHA3C970
質問が漠然としすぎてる。
847デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:55:02.73ID:7oD3lqB2p
C言語の仕様は規格が決まってるから、調べれば幾らでもネットに落ちてるんだがなぁ〜
848デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 10:56:41.44ID:7oD3lqB2p
ランタイムライブラリやプラグマやデファインの事なら使ってるコンパイラにドキュメントがあるだろ?
849デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:36:54.91ID:XMzxe3/+0
ネスティングを気にするかどうかは各自のスタイルによる
気にならない書き方はいくらでもできるし
ファイル分割がいやでべた書きする奴はネスティング気にするだろ
850デフォルトの名無しさん (ガックシ 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;
}
851デフォルトの名無しさん (ワッチョイ 8dd2-U5aN)
垢版 |
2017/10/20(金) 12:43:18.91ID:XMzxe3/+0
ネスティングが浅い記述しか書かない奴にとってはどうでも良い案件なんですよ
技術計算を多用するコード例だとネスティングちゃんとしないと分けがわからなくなる
852デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 17:02:28.07ID:Hcn/q6HeM
なんで配列の要素数って省略してもいいのですか?
2017/10/20(金) 17:49:45.76ID:vESwnO6R0
>>852 どの場面での話かな?
2017/10/20(金) 17:51:51.23ID:w9jbL0YF0
>>852
コンパイラは要素数を数えられるから
(要素数を数えられない場合は省略できない)
855デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/20(金) 17:57:17.39ID:7oD3lqB2p
配列は何次元でも扱える代わりに中身の管理は利用者に一任されたんだ。
856デフォルトの名無しさん (アウーイモ MM89-3GPW)
垢版 |
2017/10/20(金) 18:16:01.46ID:Hcn/q6HeM
>>853
配列の宣言の時です。
省略してはいけないのはどういう場面ですか?
857デフォルトの名無しさん (ガックシ 06ee-G561)
垢版 |
2017/10/20(金) 18:42:47.35ID:3KJGg1dF6
>>856
初期化無しの宣言とか?
2017/10/20(金) 20:01:48.14ID:l11teSHI0
>>856
× int ary[];
○ int ary[] = {1,2,3};
2017/10/21(土) 02:37:55.69ID:xu+p9cdr0
>>850
どうも思わない。

ま、 register はコンパイラが無視するんだろうな。
2017/10/21(土) 07:38:47.06ID:KIdTQfIK0
>>850 すごく… 古くさいです…

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

古いコンパイラだとどっちも許されるんだっけ。
2017/10/21(土) 08:06:44.87ID:Q5TWqxQz0
実装は知らんが、言語仕様だと昔からstorage classの指定は1つだけ
2017/10/21(土) 08:49:05.01ID:TZDyO3Kt0
registerは可能ならばレジスタに割り当てると言う意味なので、アドレス演算子を使えばレジスタに割り当てられない
利用可能なレジスタ数を超えてregisterが使われうる可能性を考えれば明らか
autoとも併用できないし、半可通としか言いようがない
2017/10/21(土) 09:07:38.36ID:1UmE9CdHM
>>862
それC++限定じゃね?
2017/10/21(土) 09:44:36.79ID:TZDyO3Kt0
>>863
言いがかりをつけたいなら「規格書のxxにこう書いてある」と調べてからつけろ
2017/10/21(土) 09:55:57.60ID:fkuXV6f/0
C++のautoは別の話
2017/10/21(土) 10:41:15.21ID:1UmE9CdHM
>>862
の前半、register変数のアドレスを取ろうとすると
gccもclangもエラーになるけど、これは規格違反と?
2017/10/21(土) 10:46:45.41ID:KlHNvq3I0
仕事で5年くらいMATLABやってたけど来月からC言語やらなあかん
難しそうで、もうイヤイヤ期よ

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

応援メッセージ待ってます!
(´;ω;`)
2017/10/21(土) 10:51:19.46ID:sVexF7NP0
がんぱれ
2017/10/21(土) 11:33:55.75ID:fkuXV6f/0
>>866
Visual Studioでもエラーになる
まあ当然だわな
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.
こう書いてある
2017/10/21(土) 11:53:08.06ID:Q5TWqxQz0
K&Rの1stでも
the address-of operator & cannot be applied to them.
って書いてあるよ
872デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:04:46.13ID:VJktQUPlp
俺にはレジスタ変数に割り当てた変数を関数のアドレス渡し引数にする意図が想像できない。
そんなにオーバーヘッド気になるなら、グローバル変数でレジスタ変数宣言してしまえって思う。
2017/10/21(土) 12:12:52.67ID:Q5TWqxQz0
>>872
外部宣言にregisterは使えないぞ
2017/10/21(土) 12:18:48.95ID:Hb3Ud/Wn0
オーバーヘッド気にしてたらコンテキストスイッチングとかどうすんだ?
875デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:43:51.25ID:VJktQUPlp
じゃあそんなクリティカルな問題無い様に、関数化する事自体を諦めた方がいいのでは?
876デフォルトの名無しさん (ササクッテロラ Sp85-DwBb)
垢版 |
2017/10/21(土) 12:46:37.26ID:VJktQUPlp
ヘッダーファイルにインライン宣言した関数を記述してしまうって解決方法もあるよな?
2017/10/21(土) 12:55:25.34ID:fkuXV6f/0
>>873
さすがにネタだろ
2017/10/21(土) 18:44:07.64ID:KlHNvq3I0
>>868
ありがとう

このスレに書いている単語が全然分からんw
何を話してるのかも分からんw
みんな凄すぎやわ…
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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