C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
ソースコード関係の知識は苦Cやらで積めるけどソフトやらの知識はどこで積むんだ プリコンパイルヘッダーを使用するのであれば、プロジェクト内のどこかのソースファイル(例えばstdafx.cpp)を使って、プリコンパイルヘッダーを作成しないといけない。
あるソースファイルにおいてプリコンパイルヘッダーを使用するのであれば、プリコンパイル対象のヘッダーを#includeして、そのソースファイルがプリコンパイルヘッダーを使用することを設定する。
プリコンパイルヘッダーを使用しないなら、すべてのソースのプロパティでプリコンパイルヘッダーを使用しないように設定する(空のプロジェクトの規定値)。 ソースファイルが二、三個なら、とくにプリコンパイルヘッダーは、必要ない。 >>800
おとなしく>>798の言う通りにしろってこと ソースファイルのプロパティは、IDE内のソースファイルのアイコンを右クリックして「プロパティ」を選ぶと設定できる。 >>804
とりあえず空のファイルは作れたけどソースが書けん 新しいプロジェクト
↓
空のプロジェクトを作成
↓
空のソースコードファイルを追加
↓
>>789をコピペ
↓
実行 >>807
空のソースコードファイルどうやって作るんだ >>808
プロジェクト開いたときの右にあるソリューションエクスプローラの中のソースファイルというフォルダを右クリックして「追加」から「新しい項目」をクリック。
「C++ファイル」を選択した状態でファイル名の拡張子を.cに変えて「追加」ボタンを押す。 >>809
できた
もしこれから新しくファイルを作る場合はこれを一からやるのか? >>810
うん。
簡単なプログラムならVSでプロジェクト作るよりもスタートメニューのVSのフォルダの中にある開発者コマンドプロンプト使ってclコマンドでコンパイルした方が手軽だな >>812
ありがとう
これ以上はスレチだからやめておこう スレチかもしれないけどVS2017でANSI C(C99/98, ブロック先頭でしか宣言できないやつ)だけしかかけないようにできますか? みなさんは関数名の後に続く中括弧の前に改行を入れますか?入れませんか?
例えば、
int main(void) {
/* 処理 */
}
のようにするか、
int main(void)
{
/* 処理 */
}
のように書くのか、どちらが多いのか気になります。 if ()
{
}
ならいいけど
for () {
}
だと整合性無いじゃん
って話なら気にするな
だな >>815
改行入れるね。
なんでそうなったかというと、C言語は昔は引数の型をカッコ内に書けなかった。つまり
int main(argc, argv)
int argc;
char *argv[];
{
・
・
・
return 0;
}
のようにしか書けなかった。その当時から覚え始めたというのと、K&R もそれで書いて
あったのでそのまま何も考えず俺の中で改行入れるのが定着した。 for()
{
}
こうしたときに一行増えるから嫌だだっていう人が多そうだな 関数では改行して、制御構文では改行しない
みたいなオレルールにしてる c#みたいにメソッドを直接鉤括弧内にベタ書き出来る言語でもなけりゃ先行改行一択なんだがなあ 今みたいに時間単価での清算が主流になる前は、
ステップ単価清算ってのもあって、K&R以外で書くと
増量しているって言われていたの。
cb とか indent なんてコマンドはその名残かな >>826
無名関数が書けると最初の { 前の改行がおかしい気になるので
自動的に改行入れない派になるという話では? >>815
統計取る方法がないから、確実な答えはわからないと思うよ。
で、戦争のたびに出る結論が「気にするな」「仕事環境に従え」なんだよねー。
で、俺はどうかと言うと、俺も不思議と>>823に落ち着いた。 http://9cguide.appspot.com/15-05.html
これのモードの切り替えってところで判定結果違うんだが俺だけ?
pがでたらめな数字になる
コピペしても変わらなかったから多分タイプミスとかじゃないと思う 下の[実行結果] のように出力されるためには
× printf("p = %d\n",p);
○ printf("*p = %d\n",*p);
でないとな 10 1
scanf("%d%d", a, b);
こう読み込んだ時に空白を飛び越えて読み込んでくれるん?
10,1
この時はエラーになっちゃう? 多分空白はできる
,を入れたかったら%d,%dすれば多分できる scanfのフォーマット指定は面倒だぞ
正直使いこなす気すらない if () {
}
else {
}
このフォーマットだと心が平和 >>828
うん、さっぱり分からん
そもそも鉤括弧って「」だし。 >>837
入力が決められてなかったらscanfじゃあできないからわかるわー >>827
バージョン管理、コーティング規約対応用だろ
空白文字の使い方に無頓着なカスが存在する限り必須 本買うお金がないのですが公式なドキュメントってどこで見れますかね? C言語の仕様は規格が決まってるから、調べれば幾らでもネットに落ちてるんだがなぁ〜 ランタイムライブラリやプラグマやデファインの事なら使ってるコンパイラにドキュメントがあるだろ? ネスティングを気にするかどうかは各自のスタイルによる
気にならない書き方はいくらでもできるし
ファイル分割がいやでべた書きする奴はネスティング気にするだろ どう思う?
#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;
} ネスティングが浅い記述しか書かない奴にとってはどうでも良い案件なんですよ
技術計算を多用するコード例だとネスティングちゃんとしないと分けがわからなくなる >>852
コンパイラは要素数を数えられるから
(要素数を数えられない場合は省略できない) 配列は何次元でも扱える代わりに中身の管理は利用者に一任されたんだ。 >>853
配列の宣言の時です。
省略してはいけないのはどういう場面ですか? >>856
× int ary[];
○ int ary[] = {1,2,3}; >>850
どうも思わない。
ま、 register はコンパイラが無視するんだろうな。 >>850 すごく… 古くさいです…
それはともかく register 宣言した変数は
アドレス取ろうとした時点でコンパイルエラーじゃなかったかな?
あと俺の環境では auto と register の同時指定がダメと言われる。
古いコンパイラだとどっちも許されるんだっけ。 実装は知らんが、言語仕様だと昔からstorage classの指定は1つだけ registerは可能ならばレジスタに割り当てると言う意味なので、アドレス演算子を使えばレジスタに割り当てられない
利用可能なレジスタ数を超えてregisterが使われうる可能性を考えれば明らか
autoとも併用できないし、半可通としか言いようがない >>863
言いがかりをつけたいなら「規格書のxxにこう書いてある」と調べてからつけろ >>862
の前半、register変数のアドレスを取ろうとすると
gccもclangもエラーになるけど、これは規格違反と? 仕事で5年くらいMATLABやってたけど来月からC言語やらなあかん
難しそうで、もうイヤイヤ期よ
C なんて10年くらい前に大学の講義でチョロチョロってやっただけ
応援メッセージ待ってます!
(´;ω;`) >>866
Visual Studioでもエラーになる
まあ当然だわな >>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.
こう書いてある K&Rの1stでも
the address-of operator & cannot be applied to them.
って書いてあるよ 俺にはレジスタ変数に割り当てた変数を関数のアドレス渡し引数にする意図が想像できない。
そんなにオーバーヘッド気になるなら、グローバル変数でレジスタ変数宣言してしまえって思う。 >>872
外部宣言にregisterは使えないぞ オーバーヘッド気にしてたらコンテキストスイッチングとかどうすんだ? じゃあそんなクリティカルな問題無い様に、関数化する事自体を諦めた方がいいのでは? ヘッダーファイルにインライン宣言した関数を記述してしまうって解決方法もあるよな? >>868
ありがとう
このスレに書いている単語が全然分からんw
何を話してるのかも分からんw
みんな凄すぎやわ… >>878
register関係は爺の昔話だから無視していい グローバル変数をregister指定できたり楽しかったなあ いや、指定しても実際効果あるか無いかってだけだからなぁ >>878
ネットのプログラミング自習動画見てみたら? 10年前にC言語覚えたなC#もないopenGL作る時も基礎が出来てない白紙から打ち込んでたから凄い大変だったのを思い出したわ register宣言とアドレス演算子の話だけど、
Cではエラー、C++だとアドレスを取れる(register指定は無視される)、みたいね。
望洋さんのファックとWikipediaのC++に出てたわ。
…実は逆に覚えててね。
レジスタに割り当てた変数の変数のアドレスが欲しいってのは矛盾してるから、
C++は厳格にチェックするかと。 >>884
俺もそう思う
registerはprvalueであるべき レジスタってメモリ番地をもってるのか?
持ってない番外地なんじゃねえの? >>886
そうだよ。そこは誰も疑問に思ってない。 世の中には、レジスタがメモリーの先頭と同じ位置にマッピングされてるCPUだってあるけどな。 質問です。ポインタ変数を用いてキーボードから入力された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
となり、要素の列挙がうまくいかないので対策を教えていただきたいです。 そりゃ最初に p に代入した同じ入れ物に入力値を保存してるからね。
++p とかしてみたら? scanf() での値の格納先 (== sumに加える値の参照先) である p を
初期化時の &x[0] のまま進めてないから入力した値が上書きされるんだよ。
もちろん x[1], x[2], ... には値が入らない。
質問の趣旨と関係ない部分を指摘して混乱させるつもりはないんだけど、
配列 x[] の要素数が足りないのがオジさん気になるなぁ。 >>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;
} 大学で勉強し始めたばかりなので全然で…
みなさんありがとうございました。 まあ、なんでポインタに拘るのかわからんが、
つうか、書きと読みでアクセス方法は合わせた方がいいと思うが、
動きゃいいかw 学習をし始めた頃は敢えてポインタを使っていろんな書き方を試してみるのもいいと思う。
数をこなすうちに自然とよい書き方に気づくと思う。 起動の度に外部ファイルで変数の初期値を変えて起動したいんだけどどうすんの? 環境依存だし基本的に無理
バッチなりシェルスクリプトに記述しといてコマンドライン引数で渡す方が建設的 レス数が900を超えています。1000を超えると表示できなくなるよ。