C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
>>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 学習をし始めた頃は敢えてポインタを使っていろんな書き方を試してみるのもいいと思う。
数をこなすうちに自然とよい書き方に気づくと思う。 起動の度に外部ファイルで変数の初期値を変えて起動したいんだけどどうすんの? 環境依存だし基本的に無理
バッチなりシェルスクリプトに記述しといてコマンドライン引数で渡す方が建設的 ソースに書いてない変数を実行時に導入したいってのとは違うんでないか?
あらかじめ外部ファイルで値を設定できる変数は決まっていて、
要するにリソースファイルみたいな使い方をしたいのかも知れん。
fscanf(fp, "%s=%d\n", varname, &varval);
if (strcmp(varname, "width") == 0) {
width = varval;
} else if (strcmp(varname, "height") == 0) {
height = varval;
} else {
fprintf(stderr, "cannot use variable '%s'\n", varname);
}
みたいな感じ?
この場で書いてるから洗練されてないし、動くか怪しいけど。 人が読み書きしない前提なら、構造体の領域をまるまんま読み書きしてしまえば楽だぜ。 動作時に殆ど変えない値ならファイルで良いかもしれないが
起動の都度値を変化させたいなら、コマンドラインの方が良いぞ >>901 で使った「リソースファイル」って言葉は曖昧だったね。
「設定ファイル」の方が通りがよかったかも。
皆さん文脈から分かってくれると思うけど、
VisualStudio なんかで別の意味で使う言葉だし。 「鶏を割くに焉んぞ牛刀を用いん」とも言えるけど
json,yaml,tomlなんかの読み込みライブラリ使うとか
Lua,Pythonを組み込むとかも一応回答としてはありかもね >>888
つーか全部レジスタの方面の話じゃね?
大分前の話だが、DSPでそういうのがあった >>906
ファミコンとかで使われていた6502のゼロページレジスタ
がそうだよ
MELPS7700とか名前を変えて長いこと使われた メインフレームでDIAGNOSEを使うときなんか
WCSのアドレスを指定とかね スタック変数いらねえな
グローバル変数で性能追求しようぜ 6502のゼロページが全部レジスタだと思い込んでるような記述がたまにあるけど
普通にメモリだよ オペランドを8bitに限定してコード効率上げるってのがゼロページの発想でしょ
メモリ素子が高価な時代の涙ぐましい仕組みのひとつ CPUの一時キャッシュメモリをレジスタ変数に割り当てる方が速いんじゃないか? >>911 アドレス値のフェッチが1byteだけで済むから
16bit(2byte)の絶対アドレスより速い、てメリットもあるしね。
>>912 これはアリかも。
CPUにデカいキャッシュが載る時代のゼロページ的な使い方だな。 %%%%1000%%%%
000-[HUM%58*73.1\%]/2I/3NM/61.3SNMK%?%3%51.22222222222221%
001-[[[%6/4$17.6135412α3]]]]+DOM+SIL+7%
002-UML7%[61.2[31.5[!%32∂LM17.36%!16.3!%<<<%!HSTOL7%!Q!S!=3m=<2TOL<3Q9A<2.1GHz%,DOK,HAOARA,
003-[[[HEMLOT47[<\41.2%Q,===>[MLS<DPNO<\2.3>#ESOLA!5%!3MLA!>LTOSA>7TONSA>%>%end ルネサスRXなんかもレジスタがメモリマップされてるな
アクセス禁止領域だけど >>915
そこって、デバッガがCPUレジスタ参照する為の窓だから、プログラムがその領域指すと、デバッグが困難になるから禁止してるんじゃね? デバッガー専用の作業メモリー領域もプログラムから使用禁止だったりするだろ? >>916
sfrをアクセス禁止領域に置いてどーすんだよw >>921
アクセス禁止じゃねーよw
使用禁止だ。
デバッガー使わないなら好きに使えばいい。 int i=1,n
n=i/2*2
n=0になる理由教えてください 左結合で i/2 の後に *2 が処理される
整数どおしの除算なので丸めが発生
丸めた値に 乗算が行われる int func(int) は、引数が int 型で、int 型の値を返す関数
int func(void) は、引数が無しで、int 型の値を返す関数
というのは分かったのですが
int func() のように () の中が空の場合は、どうゆう意味になりますか?
int func(void) と同じ? DMAでも使うならともかく
レジスタをメモリ空間にマッピングする利点なんてないだろ PCI以降DMAでデータ転送なんてのは無い。
あるのはバースト転送モードだ。
当然、転送に必要なレジスタはメモリにマッピングされている。 >>934
むしろデメリットさえあるな。だからデバッガが使う以外は利用されてないだろ? 内部レジスタと外部レジスタは意味がまるっきり違うんだがなぁ >>930
同じなんだけどコンパイル時の引数チェックをしなくなる。
int func(void) の関数に対して func(123) みたいにして呼ぶとコンパイルエラーだが
int func() の関数に対して func(123) で呼び出す記述があってもエラーにならない。
なんでこうなっているのかというと、昔のCにはvoidがなくて引数なしの関数は
int func() のように書くしか方法がなく、尚且つ昔のC言語は引数のチェックを
していなかったため。つまり過去のC言語ソースをコンパイルできるようにする
ためにこのような記述が残されている。今となっては余程の事がない限りこんな
書き方はしない方が良い。バグの元だ。 ヤフー知恵袋って色んな奴がC言語勉強してるやつがいるな、素人みたいな質問やら専門的な質問や大学の問題の質問やらのプログラミング質問が https://ideone.com/0GCZnF
がエラーになるのですが、
どうすればいいでしょうか? >>944
まず何のプログラミングか言わなきゃダメでしょうみんなプロだから挙動で読めちゃう人いるけどさ >>944
printfでNULL->valueをしてるから >>946
>>947
hoge()でdata->valueに値をセットしたいです。
10を表示したいです。 void hoge(data_t **data, int value) {
*data = NULL;
*data = malloc(sizeof(data_t));
if (data == NULL) return;
(*data)->value = value;
}
呼び出しを
hoge(&data,10);
これではどうか if (*data == NULL) return;
ここ間違えた、訂正 >>949
ありがとうございます。
できました!超天才! そういうことか
全然分からんかった
引数に受け渡されたポインタ変数のコピーに新しく確保したメモリのアドレス入れても呼び出し元のポインタ変数はなんも変化しないのか 引数で int の変数を書き換えても 呼び出し元には伝わらない それの延長線
int を data_t* に読み替えれば同じ理屈よ 俺の頭じゃあ理解できなかったわアロー関数は苦手だ、ここには天才がやっぱいるわ 追い詰められてる時って、ちょっとしたことを見落としたりしがちだし。
そういうときにちょっとしたつまらない問題点を指摘してくれる人が神様に思えることはある。
本当に何でこれに気づかない?って問題に延々と気づかないことあるから。 実務の世界だと、開発リーダーにとっては、この程度はさらさらと書いて欲しいと思うだろうな
この辺の考え方が理解できてないと、構造体を使ったリスト構造、木構造が作れないと思う リスト構造、木構造という言葉がわからなかったのかな? >>944 からの流れだとすると、実務で使う人とは感じなかったな。
専門外の学生さんが単位を取るために四苦ハック、
進級できたら思い出しもしない、という立場からの質問だろうと。 リスト構造木構造とか理系大学の情報系科目で誰でもやるがな
こんなところ見てる奴が知らんわけないだらアホ リストもツリーも基本の構造は一緒だろ。
ただ、鎖ね繋がってる数が違うから、
扱いが違うだけでな。 >>962
> こんなところ見てる奴が知らんわけないだらアホ
>>952みたいな奴もいるのに何を言ってるんだよ w >>965
リスト構造とか知ってるからってポインタ受け渡しのトリックに気付くとは限らんだろ 自分の知ってる関数解ってる宣言の仕方ならわかるけどさ解らない奴使ってたらもう変数が動いてるかわからんだろう
そうなったらもう謎でコードなんか読めないだろ? 引数の書き戻し系は 渡すときに値を必要としてるのかどうかは仕様次第なので 少し気を使う それより、そのアドレスはアクセス権のある場所を指してるんだよな? >>966
レベルの問題
> リスト構造とか知ってるからってポインタ受け渡しのトリックに気付くとは限らんだろ
そんな奴がいないとは言わないがそう言う奴はごろごろいるとは思えないだろ とりまリスト構造なんて誰でもしってること
>>959のレスはイミフ 「関数の引数に値渡ししかないから、
ポインタを渡すことで呼出側の変数の内容を関数側で変更する」
というのが他の言語と比較した場合、C特有のトリックと呼べるかも。
もちろん、Cの村では当然かつ基本のことだけど。 レス数が950を超えています。1000を超えると書き込みができなくなります。