C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   文字列bを文字列aにコ ....   
     ・[6139] ケン@ポチ 
     ・[6142] miyaza 
     ・[6143] Yuki 
     ・[6144] 組木紙織 
     ・[6146] ケン@ポチ 
     ・[6147] ケン@ポチ 
     ・[6149] Yuki 
     ・[6151] ケン@ポチ 
     ・[6164] なぎ 
     ・[6169] Yuki 
     ・[6183] ケン@ポチ 
     ・[6188] ケン@ポチ 
     ・[6189] なぎ 
     ・[6191] なぎ 
     ・[6195] ケン@ポチ 
     ・[6196] Yuki 
   質問です〜。   
     ・[6052] 組木紙織 
     ・[6074] いさご 
     ・[6076] 管理人 
     ・[6079] いさご 
     ・[6083] box 
     ・[6110] 管理人 
     ・[6135] いさご 
   電卓作成中   
     ・[6102] むつ 
     ・[6103] たのもー 
     ・[6105] 管理人 
     ・[6106] むつ 
     ・[6107] 管理人 
     ・[6108] 管理人 
     ・[6109] 管理人 
     ・[6115] ダッシュ 
     ・[6116] 管理人 
     ・[6117] たのもー 
     ・[6118] 管理人 
     ・[6119] 管理人 
     ・[6125] 管理人 
     ・[6130] たのもー 
   配列とポインタ   
     ・[5730] box 
     ・[5733] りん 
     ・[5749] りん 
     ・[5750] box 
     ・[5751] りん 
     ・[5752] りん 
     ・[5754] りん 
     ・[5757] box 
     ・[5761] りん 
     ・[5808] りん 
     ・[5810] box 
     ・[5815] りん 
     ・[5917] りん 
     ・[5918] box 
     ・[5919] りん 
     ・[5920] box 
     ・[5921] りん 
     ・[5922] box 
     ・[6016] りん 
     ・[6017] box 
     ・[6018] りん 
     ・[6019] りん 
     ・[6020] box 
     ・[6023] りん 
     ・[6025] りん 
     ・[6026] りん 
     ・[6027] keichan 
     ・[6028] りん 
     ・[6029] keichan 
     ・[6060] りん 
     ・[6063] box 
     ・[6064] box 
     ・[6073] りん 
     ・[6075] りん 
     ・[6077] 組木紙織 
     ・[6078] りん 
     ・[6080] りん 
     ・[6081] box 
     ・[6082] box 
     ・[6084] りん 
     ・[6085] box 
     ・[6086] りん 
     ・[6087] box 
     ・[6089] りん 
     ・[6097] box 
     ・[6111] りん 
     ・[6112] 組木紙織 
     ・[6120] りん 
   Visual Studio.NET 20 ....   
     ・[5895] keichan 
     ・[6030] Andy 
     ・[6032] keichan 
     ・[6071] Blue 
     ・[6114] keichan 
   質問なのですが・・・   
     ・[6090] むつ 
     ・[6113] 紅茶 
   ファイルの読み書き! ....   
     ・[6036] box 
     ・[6038] み〜 
     ・[6039] むつ 
     ・[6045] み〜 
     ・[6046] み〜 
     ・[6047] miyaza 
     ・[6048] miyaza 
     ・[6049] miyaza 
     ・[6051] み〜 
     ・[6053] 組木紙織 
     ・[6055] miyaza 
     ・[6056] み〜 
     ・[6057] miyaza 
     ・[6058] み〜 
     ・[6059] miyaza 
     ・[6061] み〜 
     ・[6065] miyaza 
     ・[6072] み〜 
   C言語〜ゲームプログ ....   
     ・[5999] バグ 
     ・[6000] 風鈴 
     ・[6002] 管理人 
     ・[6015] 風鈴 
     ・[6021] 管理人 
     ・[6033] 風鈴 
     ・[6044] 管理人 
     ・[6054] 風鈴 
     ・[6062] 管理人 
     ・[6066] 風鈴 
     ・[6067] 風鈴 
     ・[6068] 管理人 
   シューティングゲーム ....   
     ・[6037] むつ 
     ・[6040] ぴよぴよ 
     ・[6043] 管理人 
   ゲームソフト完成☆   
     ・[5673] 管理人 
     ・[5674] チョッピー 
     ・[5675] 管理人 
     ・[5676] ぽん太 
     ・[5677] 管理人 
     ・[5678] ナガタ 
     ・[5679] ぽん太 
     ・[5680] 管理人 
     ・[5681] ナガタ 
     ・[5682] 管理人 
     ・[5683] ナガタ 
     ・[5684] 管理人 
     ・[5685] 管理人 
     ・[5686] ぽん太 
     ・[5687] 管理人 
     ・[5688] ぽん太 
     ・[5689] 管理人 
     ・[5690] ぽん太 
     ・[5691] 管理人 
     ・[5702] バグ 
     ・[5717] 管理人 
     ・[5723] ダッシュ 
     ・[5724] 大工 
     ・[5729] 管理人 
     ・[5735] 管理人 
     ・[5831] 太陽 
     ・[5868] 管理人 
     ・[5885] Justy 
     ・[5888] 管理人 
     ・[5891] 管理人 
     ・[5923] 神魔 
     ・[5926] 管理人 
     ・[5927] Justy 
     ・[5994] 管理人 
     ・[6031] ダッシュ 
     ・[6041] 管理人 
     ・[6042] 管理人 
     ・[56721182504896] 管理人 
   ファイルについて   
     ・[5929] 組木紙織 
     ・[5930] グー 
     ・[5931] 組木紙織 
     ・[5932] グー 
     ・[5933] 組木紙織 
     ・[5934] グー 
     ・[5935] 組木紙織 
     ・[5936] 組木紙織 
     ・[5937] グー 
     ・[5938] 組木紙織 
     ・[5939] グー 
     ・[5940] 組木紙織 
     ・[5941] グー 
     ・[5942] 組木紙織 
     ・[5943] グー 
     ・[5944] グー 
     ・[5945] グー 
     ・[5946] 組木紙織 
     ・[5947] グー 
     ・[5948] 組木紙織 
     ・[5949] box 
     ・[5950] グー 
     ・[5951] 組木紙織 
     ・[5952] グー 
     ・[5953] 組木紙織 
     ・[5954] グー 
     ・[5955] 組木紙織 
     ・[5956] グー 
     ・[5957] グー 
     ・[5958] 組木紙織 
     ・[5959] 組木紙織 
     ・[5960] グー 
     ・[5961] グー 
     ・[5962] グー 
     ・[5963] グー 
     ・[5964] 組木紙織 
     ・[5965] グー 
     ・[5966] むつ 
     ・[5967] グー 
     ・[5968] グー 
     ・[5969] バグ 
     ・[5970] グー 
     ・[5971] miyaza 
     ・[5972] miyaza 
     ・[5973] グー 
     ・[5974] むつ 
     ・[5975] miyaza 
     ・[5976] グー 
     ・[5977] miyaza 
     ・[5978] グー 
     ・[5979] miyaza 
     ・[5980] グー 
     ・[5981] むつ 
     ・[5982] miyaza 
     ・[5983] グー 
     ・[5984] グー 
     ・[5985] グー 
     ・[5986] miyaza 
     ・[5987] グー 
     ・[5988] グー 
     ・[5989] box 
     ・[5990] バグ 
     ・[5991] グー 
     ・[5992] miyaza 
     ・[5993] 管理人 
     ・[5995] グー 
     ・[6011] グー 
     ・[6012] グー 
     ・[6013] miyaza 
     ・[6024] グー 
   int型について   
     ・[6003] 管理人 
     ・[6004] 憲吾 
     ・[6005] Justy 
     ・[6008] 管理人 
   ファイルの読み込み書 ....   
     ・[5590] み〜 
     ・[5591] み〜 
     ・[5592] miyaza 
     ・[5593] み〜 
     ・[5594] miyaza 
     ・[5595] み〜 
     ・[5596] miyaza 
     ・[5597] み〜 
     ・[5598] むつ 
     ・[5599] み〜 
     ・[5600] miyaza 
     ・[5601] み〜 
     ・[5602] み〜 
     ・[5603] miyaza 
     ・[5604] み〜 
     ・[5605] むつ 
     ・[5606] み〜 
     ・[5608] み〜 
     ・[5610] み〜 
     ・[5612] miyaza 
     ・[5613] miyaza 
     ・[5614] keichan 
     ・[5615] み〜 
     ・[5616] miyaza 
     ・[5617] miyaza 
     ・[5618] み〜 
     ・[5619] miyaza 
     ・[5620] ※ 
     ・[5621] み〜 
     ・[5622] miyaza 
     ・[5623] み〜 
     ・[5624] miyaza 
     ・[5625] み〜 
     ・[5626] み〜 
     ・[5627] miyaza 
     ・[5628] ※ 
     ・[5629] み〜 
     ・[5630] GPGA 
     ・[5631] み〜 
     ・[5632] み〜 
     ・[5633] miyaza 
     ・[5634] GPGA 
     ・[5635] ※ 
     ・[5636] み〜 
     ・[5637] miyaza 
     ・[5638] ※ 
     ・[5639] バグ 
     ・[5640] むつ 
     ・[5641] み〜 
     ・[5651] み〜 
     ・[5652] 組木紙織 
     ・[5653] み〜 
     ・[5654] み〜 
     ・[5655] 組木紙織 
     ・[5656] み〜 
     ・[5657] み〜 
     ・[5658] 組木紙織 
     ・[5659] み〜 
     ・[5660] 組木紙織 
     ・[5663] み〜 
     ・[5664] 組木紙織 
     ・[5665] み〜 
     ・[5692] み〜 
     ・[5693] み〜 
     ・[5694] miyaza 
     ・[5695] み〜 
     ・[5696] miyaza 
     ・[5698] み〜 
     ・[5699] miyaza 
     ・[5700] み〜 
     ・[5701] み〜 
     ・[5703] バグ 
     ・[5704] み〜 
     ・[5705] miyaza 
     ・[5707] み〜 
     ・[5708] miyaza 
     ・[5709] miyaza 
     ・[5710] み〜 
     ・[5711] み〜 
     ・[5712] miyaza 
     ・[5713] miyaza 
     ・[5714] み〜 
     ・[5715] miyaza 
     ・[5716] み〜 
     ・[5771] み〜 
     ・[5773] miyaza 
     ・[5774] み〜 
     ・[5776] み〜 
     ・[5777] miyaza 
     ・[5778] み〜 
     ・[5779] miyaza 
     ・[5781] み〜 
     ・[5782] み〜 
     ・[5783] miyaza 
     ・[5784] keichan 
     ・[5785] み〜 
     ・[5786] み〜 
     ・[5787] miyaza 
     ・[5788] み〜 
     ・[5789] miyaza 
     ・[5790] み〜 
     ・[5791] miyaza 
     ・[5792] み〜 
     ・[5793] み〜 
     ・[5794] み〜 
     ・[5795] み〜 
     ・[5796] miyaza 
     ・[5797] み〜 
     ・[5799] miyaza 
     ・[5800] み〜 
     ・[5801] miyaza 
     ・[5802] Yuki 
     ・[5803] み〜 
     ・[5804] miyaza 
     ・[5806] miyaza 
     ・[5807] み〜 
     ・[5816] むつ 
     ・[5817] み〜 
     ・[5818] miyaza 
     ・[5819] み〜 
     ・[5820] miyaza 
     ・[5821] み〜 
     ・[5822] keichan 
     ・[5823] み〜 
     ・[5824] み〜 
     ・[5825] miyaza 
     ・[5826] み〜 
     ・[5828] むつ 
     ・[5830] み〜 
     ・[5832] miyaza 
     ・[5833] み〜 
     ・[5835] み〜 
     ・[5837] み〜 
     ・[5838] miyaza 
     ・[5839] み〜 
     ・[5840] miyaza 
     ・[5841] miyaza 
     ・[5842] み〜 
     ・[5843] miyaza 
     ・[5844] み〜 
     ・[5845] jみ〜 
     ・[5846] miyaza 
     ・[5847] keichan 
     ・[5849] むつ 
     ・[5850] み〜 
     ・[5851] み〜 
     ・[5852] miyaza 
     ・[5854] み〜 
     ・[5855] むつ 
     ・[5858] み〜 
     ・[5859] miyaza 
     ・[5861] み〜 
     ・[5886] み〜 
     ・[5892] み〜 
     ・[5893] み〜 
     ・[5896] miyaza 
     ・[5897] み〜 
     ・[5898] miyaza 
     ・[5899] み〜 
     ・[5900] miyaza 
     ・[5901] み〜 
     ・[5902] miyaza 
     ・[5903] miyaza 
     ・[5904] み〜 
     ・[5905] miyaza 
     ・[5906] み〜 
     ・[5907] miyaza 
     ・[5908] み〜 
     ・[5909] み〜 
     ・[5910] み〜 
     ・[5911] miyaza 
     ・[5912] み〜 
     ・[5913] み〜 
     ・[5914] miyaza 
     ・[5915] miyaza 
     ・[5916] み〜 
   画像の透明度を変えた ....   
     ・[5765] 管理人 
     ・[5812] 名無し 
     ・[5814] むつ 
     ・[5894] 名無し 
   PCゲームの仕様につ ....   
     ・[5589] バグ 
     ・[5607] むつ 
     ・[5668] 管理人 
     ・[5887] りむ 
     ・[5890] 管理人 
   DrawString   
     ・[5373] kuroca 
     ・[5375] Justy 
     ・[5376] バグ 
     ・[5430] kuroca 
     ・[5884] kuroca 
     ・[5889] 管理人 
   30日でできる! OS自作 ....   
     ・[5878] 管理人 
     ・[5879] ぽん太 
     ・[5880] ぽん太 
     ・[5881] 管理人 
     ・[5883] ぽん太 
   久しぶりにCの質問です ....   
     ・[5864] 管理人 
     ・[5865] 管理人 
     ・[5869] box 
     ・[5870] box 
     ・[5871] Hermit 
     ・[5872] 管理人 
     ・[5873] ダッシュ 
     ・[5874] box 
     ・[5875] ダッシュ 
     ・[5876] Justy 
     ・[5882] 管理人 
   音楽再生について   
     ・[5766] 管理人 
     ・[5860] へろへろ 
     ・[5867] 管理人 
   構造体 typedef   
     ・[5745] バグ 
     ・[5746] みき 
     ・[5764] 管理人 
     ・[5769] バグ 
     ・[5772] box 
     ・[5805] Justy 
     ・[5809] そら 
     ・[5829] 管理人 
     ・[5834] なぎ 
     ・[5848] 組木紙織 
     ・[5853] Justy 
     ・[5863] box 
     ・[5866] 組木紙織 
   二進数に変換   
     ・[5413] keichan 
     ・[5414] Blue 
     ・[5415] りょうすけ 
     ・[5706] 大阪慕情 
     ・[5719] りょうすけ 
     ・[5720] 管理人 
     ・[5725] りょうすけ 
     ・[5747] りょうすけ 
     ・[5857] プロのSEです。 
   チェーンの解釈につい ....   
     ・[5738] box 
     ・[5742] parapara 
     ・[5743] box 
     ・[5753] parapara 
     ・[5755] box 
     ・[5756] parapara 
     ・[5758] Hermit 
     ・[5759] box 
     ・[5760] Hermit 
     ・[5770] parapara 
     ・[5775] box 
     ・[5780] box 
     ・[5836] parapara 
   行数カウントについて ....   
     ・[5767] 管理人 
     ・[5768] いさご 
     ・[5827] 管理人 
   構造体のコピー   
     ・[5645] GPGA 
     ・[5646] Justy 
     ・[5647] バグ 
     ・[5813] なぎ 

Name: ケン@ポチ  ..ぴよぴよ(356ポイント)   Date: 2007/03/27(火) 08:21   No:6137       
Title: 文字列bを文字列aにコピーする関数の作成    
おはようございます。

文字列bを文字列aにコピーする関数の作成という学校の昔の課題を復習しています。

この頃はポインタと聞くだけで頭が混乱する状態でしたので、ほぼ友達にやってもらっていました。。。
現在春休み中ですのでポインタの復習がてらに挑戦しています。


以下が作成したプログラムなのですが、コンパイルの段階でエラー文を吐かれるのでちゃんと起動するかも分りません。
エラーの内容はbasic1.c 3: ) が必要
       basic1.c 19: ) が必要
というものなのですが、ちゃんと)はついていますし・・・

#include<stdio.h>

int str_copy(*p1,*p2);

int main(void){
char a[256],b[256];
char *p1,*p2;

p1= a;
p2= b;

gets(p2);

str_copy(p1,p2);

return 0;
}

int str_copy(*p1,*p2){
int c=0;
while(*p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
c++;
}
printf("%s\n",a);
printf("length=%d\n",c);
return c;
}

ちなみにこの課題ではなにがなんでもgetsを使えということでしたのでgetsを使用しています。


290ポイント を手に入れた。


Name: ケン@ポチ  ..ぴよぴよ(501ポイント)   Date: 2007/03/27(火) 08:28   No:6139     
Title: Re:文字列bを文字列aにコピーする関数の作成    
肝心の質問を書き忘れていました。

質問はエラーの解決方法を教えてくださいというものです。

なお、プログラム自体が自分の意図した物と違うかもしれないのですが、それは実際に自分で確認したいので、
間違っていても秘密にしておいてください。

もしどうしても手に負えなければ追加質問をします。


145ポイント を手に入れた。

Name: miyaza  ..初心者(7,111ポイント)   Date: 2007/03/27(火) 08:49   No:6142     
Title: Re:文字列bを文字列aにコピーする関数の作成    
int str_copy(*p1,*p2);
*p1と*p2の型がありません。プロトタイプ宣言と関数本体。

int str_copy();の内部にaが存在しないためprintf()でエラー。


65ポイント を手に入れた。

Name: Yuki  ..上級者(18,226ポイント)   Date: 2007/03/27(火) 08:52   No:6143     
Title: Re:文字列bを文字列aにコピーする関数の作成    

>エラーの内容はbasic1.c 3: ) が必要
>       basic1.c 19: ) が必要
>というものなのですが、ちゃんと)はついていますし・・・


3行目、19行目を確認するというところはOKです。

ですが、必ずしも)がついていないためのエラーとは限りませんので、
該当行の構文をよ〜〜く見直してみてください。

↓ヒント隠しておくので、マウスで選択すると見えます。

ヒント:関数の引数の型は何ですか?



26ポイント を落としてしまった。

Name: 組木紙織  ..初心者(7,898ポイント)   Date: 2007/03/27(火) 08:56   No:6144     
Title: Re:文字列bを文字列aにコピーする関数の作成    
charを忘れていますね。
修正箇所にはコメントを入れてあります。

関数の宣言、定義の部分には引数には引数の型を明示的に教えてあげる必要があります。

#include<stdio.h>

int str_copy(char *p1, char *p2);//修正箇所

int main(void){
char a[256],b[256];
char *p1,*p2;

p1= a;
p2= b;

gets(p2);

str_copy(p1,p2);

return 0;
}

int str_copy(char *p1,char *p2){ //修正箇所
int c=0;
while(*p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
c++;
}
printf("%s\n",a); //このaの意図が不明
printf("length=%d\n",c);
return c;
}


261ポイント を落としてしまった。

Name: ケン@ポチ  ..ぴよぴよ(661ポイント)   Date: 2007/03/27(火) 08:59   No:6146     
Title: Re:文字列bを文字列aにコピーする関数の作成    
miyazaさんありがとうございました!!

char *p1,char *p2と書き直し、aの部分をp1にする事でちゃんと?表示されました。

ただ文字列と文字列の長さはちゃんと表示されるのですが、間に変な文字が出てきます。
例えばThis is a penと打つと、
This is a pen
怖N 怖
length=13
といった感じになります。これの原因は分かりますでしょうか?


160ポイント を手に入れた。

Name: ケン@ポチ  ..ぴよぴよ(657ポイント)   Date: 2007/03/27(火) 09:02   No:6147     
Title: Re:文字列bを文字列aにコピーする関数の作成    
書き込んでいる間にコメントが。
Yukiさん、組木紙織さんありがとうございました。型を忘れるなんて、ポインタ云々の前にちゃんと覚えておかなきゃ駄目ですよね^^;

printf("%s\n",a); //このaの意図が不明とのことですが、これはaをp1に変更する事で、無事表示させる事ができました。



4ポイント を落としてしまった。

Name: Yuki  ..上級者(18,323ポイント)   Date: 2007/03/27(火) 09:08   No:6149     
Title: Re:文字列bを文字列aにコピーする関数の作成    

while(*p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
c++;
}


この部分でp1のポインタは"This is a pen"の1番最後に移動してます。
先頭から表示させたいのであれば、先頭のアドレスをよそに退避しておく必要があります。



97ポイント を手に入れた。

Name: ケン@ポチ  ..ぴよぴよ(814ポイント)   Date: 2007/03/27(火) 09:21   No:6151 解決!     
Title: Re:文字列bを文字列aにコピーする関数の作成    
int str_copy(char *p1,char *p2){
int c=0;
while(*p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
c++;
}
while(p1>p2){
p1--;
}
printf("%s\n",p1);
printf("length=%d\n",c);
return c;
}

よそに退避の仕方が分からなかったのでこの様に書き直した結果、変な文字は表示されなくなり自分が意図したものになりました!

ありがとうございました!


157ポイント を手に入れた。

Name: なぎ  ..中級者(14,483ポイント)   Date: 2007/03/27(火) 10:11   No:6164     
Title: Re:文字列bを文字列aにコピーする関数の作成    
while(p1>p2){
p1--;
}

このコードは、非常に問題のあるコードです。
また、もしも、なんだかわからないけれど、適当に書き直したら動いてしまった……という行動は、今後、非常に困ったことになります。
このままの行動をとり続けると、将来原因不明のバグを量産することになります。

例えば、上記で、「意図したものになりました」というプログラムの、先頭を、

char a[256],b[256];
から、
char b[256],a[256];
に入れ替えて、何が起こるか確認してみてください。
そして、なぜ、意図しない結果になるかも考えてみると良いと思います。

さて、この場合は、あえて書くなら

while(p1>p2){
p1--;
}

よりも、

p1 = p2;

です。


305ポイント を手に入れた。

Name: Yuki  ..上級者(18,485ポイント)   Date: 2007/03/27(火) 10:19   No:6169     
Title: Re:文字列bを文字列aにコピーする関数の作成    
よその退避方法です。

int str_copy(char *p1,char *p2){
int c=0;
char *p1_wk;

p1_wk = p1;
while(*p2 != '\0'){
*p1 = *p2;
p1++;
p2++;
c++;
}
while(p1>p2){
p1--;
}

p1 = p1_wk;

printf("%s\n",p1);
printf("length=%d\n",c);
return c;
}



退避方法の例であって、プログラムの完成品ではありません。
実行してみると、改善箇所が見えてくると思います。


162ポイント を手に入れた。

Name: ケン@ポチ  ..かけだし(1,936ポイント)   Date: 2007/03/27(火) 10:49   No:6183     
Title: Re:文字列bを文字列aにコピーする関数の作成    
gets(p2)でp2の先頭アドレスが返され、それをstr_copy(char *p1,char *p2)に放り込む。
すると関数内で\0までbからaに文字がコピーされる。
アドレスはp1p2共に終端まで行っている。
先頭から表示させたいのでp1のアドレスを先頭に戻したい。
ならばp2とp1は同じアドレスだからp1>p2で先頭に戻そう。

といった考えの下に
while(p1>p2){
p1--;
}
というソースを書きました。
ですが、こうやって説明しようと頭で考えているうちに気づいたんですが、p1とp2って同じアドレスじゃないですよね。
aのアドレスを0番地とするとbは258番地になるのかな?だからchar a[256],b[256];の場合はp2の方が大きくて・・・するとp1>p2自体もおかしくなってきますね。

p1=p2ということは、p2のアドレスをp1のアドレスに代入するから両方とも同じアドレスになるということですよね?てことはこの場合p2++でp2のアドレスは最後まで行っちゃってるからp1にもp2の最後のアドレスが入るということでしょうか。それともgetsでとってきたp2の先頭アドレスが入るのでしょうか?

後者ならばp1=p2の書き方は理解できますが、前者ならばなぜ先頭に戻さなくてもいいのか分りません。。


404ポイント を手に入れた。

Name: ケン@ポチ  ..かけだし(2,277ポイント)   Date: 2007/03/27(火) 11:02   No:6188     
Title: Re:文字列bを文字列aにコピーする関数の作成    
なぎさんとYukiさんのヒントを下に以下のように書き直してみました。



#include<stdio.h>

int word_copy(char *p1,char *p2);

int main(void){
char a[256],b[256];


gets(b);

word_copy(a,b);

return 0;
}

int word_copy(char *p1,char *p2){
int c=0;
char *p3;

p3 = p2;
while(*p2 !='\0'){
*p1 = *p2;
p1++;
p2++;
c++;
}
p1 = p3;
printf("%s\n",p1);
printf("length=%d\n",c);
return c;
}

p3にp2の先頭アドレスを代入しておいて、最後にp1にp3のアドレスを代入しました。これによりp2の先頭アドレスがp1に代入され表示もされるようになりました!!

って書いててまた疑問が。

p1にp2の先頭アドレスを代入したら文字が表示されるのは当然だと思うのです。だってp2とp1は同じアドレスを指しているのだからp2の中身とp1の中身も同じはずですよね。
ということはこれはコピーされたわけじゃなく、p2そのものを表示したにすぎないのでしょうか?


341ポイント を手に入れた。

Name: なぎ  ..中級者(14,832ポイント)   Date: 2007/03/27(火) 11:04   No:6189     
Title: Re:文字列bを文字列aにコピーする関数の作成    

失礼しました。

p1 = p2;
でもだめですね。
実は、これ単純に、
while(p1>p2)
{
p1--;
}
がうまく動いた時の結果を書いただけなのですね。
最初、p1 > p2 が成立していたのなら、p1 を戻して、p1 == p2 になったところで止まりますから、安全な下記かとしては、
p1 = p2;
これで、p1, p2 の最初の関係によらず、同じ結果になります。

というわけで、ちゃんと動いたように見えたのは、見間違いだったのかなと。



129ポイント を手に入れた。

Name: なぎ  ..中級者(14,908ポイント)   Date: 2007/03/27(火) 11:06   No:6191     
Title: Re:文字列bを文字列aにコピーする関数の作成    
> ということはこれはコピーされたわけじゃなく、p2そのものを表示したにすぎないのでしょうか?

そうです。
ちゃんとコピーされたかどうかを確認するためには、呼び出し側で、
a と b をそれぞれ
printf("a = %s\n", a);
こんな感じで表示してみる必要があります。

または、(保存もとの)p2 ではなくて、(保存先の)p1 を表示すればOKです。



76ポイント を手に入れた。

Name: ケン@ポチ  ..かけだし(2,335ポイント)   Date: 2007/03/27(火) 11:15   No:6195 解決!     
Title: Re:文字列bを文字列aにコピーする関数の作成    
呼び出し側にprintf("a = %s\n", a); を書き加えた所ちゃんとa=this is a pen と表示されました!!この事からコピー成功といえます。本当にありがとうございました!!

58ポイント を手に入れた。

Name: Yuki  ..上級者(18,352ポイント)   Date: 2007/03/27(火) 11:20   No:6196     
Title: Re:文字列bを文字列aにコピーする関数の作成    
もうひとつのスレでなぎさんが指摘されていますが、
コピーした後かならず'\0'(文字列の終端)を代入するようにしてください。

while(*p2 !='\0'){
*p1 = *p2;
p1++;
p2++;
c++;
}

*p1 = '\0';


"たまたま"動くと放置されやすいバグです。


133ポイント を落としてしまった。



Name: いさご  ..ぴよぴよ(413ポイント)   Date: 2007/03/24(土) 11:57   No:6050       
Title: 質問です〜。    
こんにちは。いさごです。
While loopで{}を付け忘れた場合どうなるか宿題がでました。
自分でやってみたところ、コンパイルは出来たのですが、
whileの部分でプログラムが止まり、終了できなくなりました。
考えてみたのですが、実際に中で何が起きているのかよく分かりません。
どなたか教えていただけませんか?


121ポイント を手に入れた。


Name: 組木紙織  ..初心者(7,689ポイント)   Date: 2007/03/24(土) 13:10   No:6052     
Title: Re:質問です〜。    

if(/*判定*/) /*内容*/

if(/*判定*/){
/*内容*/
}


を比べてみてください。


7ポイント を手に入れた。

Name: いさご  ..ぴよぴよ(528ポイント)   Date: 2007/03/25(日) 09:25   No:6074     
Title: Re:質問です〜。    
回答ありがとうございます。

ifでの結果は二つとも同じでした。
一本道を進むだけであれば{}の有無は影響しないということでしょうか・・・?
ただwhileの場合、whileの条件を満たしているのに、
{}を忘れるとwhileの中身が一度も実行されないのがどうしてなのかまだわかりません。
一度実行してから止まるなら想像は付くのですが・・・。
すみません。


115ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,912ポイント)   Date: 2007/03/25(日) 10:41   No:6076     
Title: Re:質問です〜。    
if文で書く上記/*内容*/の部分を色々変更してコンパイルしてみてください。
カッコがあるかないかでどのようにかわるのか確認するためにこのようなプログラムを書いてみました。

それぞれの大きなカッコは一つ一つのプログラムに分かれていることを強調したものです。

#include <stdio.h>


int main(){

{
printf("1\n");
if(1==1)
printf("2\n");
printf("3\n");
if(1==2)
printf("4\n");
printf("5\n");
}

{
int i=0,a=0;
while(i<10)
i++;
a++;
a++;
printf("a=%d\ti=%d\n",a,i);
}

{
int i,a=0;
for(i=0;i<10;i++)
a++;
a++;
a++;
printf("a=%d\ti=%d\n",a,i);
}

return 0;
}


このプログラムをじっくり見て、どのように処理が行われるからこうような出力になるのか考えてみてください。


424ポイント を手に入れた。

Name: いさご  ..ぴよぴよ(728ポイント)   Date: 2007/03/25(日) 12:17   No:6079     
Title: Re:質問です〜。    
丁寧な回答ありがとうございます。
書いてくださったプログラムをあちこち弄繰り回してみて、
なんとなく分かった気がしました。
whileの場合、条件の更新がwhileの真下にあればその部分だけループされる、と言う事でしょうか。

int i=0,a=0;
 while(i<10)
a = a + i
i++;
printf("a=%d\ti=%d\n",a,i);

私の書いたプログラムは簡略化するとこんな感じだったため、
while部分でプログラムが止まったのだと思われます。
この考えで合っているのか不安ですが・・・。


200ポイント を手に入れた。

Name: box  ..比類無きプログラマー(61,739ポイント)   Date: 2007/03/25(日) 13:29   No:6083     
Title: Re:質問です〜。    

while(i<10)
a = a + i;
i++;

は、

while(i<10) {
a = a + i;
}
i++;

と等価です。
while文によるループの中で、i < 10 という条件を
ずっと満たし続ける(i の値を更新していない)ため、
プログラムは無限ループします。
止まっているのではなく、「実行しっぱなし」なのです。



110ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(244,394ポイント)   Date: 2007/03/26(月) 03:58   No:6110     
Title: Re:質問です〜。    
boxさんのおっしゃっている「実行しっぱなし」を目で見てわかるようにしたのが下のプログラムです。
whileの条件をちょっといじくって「a++;かi++;がどちらか20億回計算されたら終了」するようにしてあります。
(プログラムの意味を直訳すると「iの値もaの値もどちらも20億より小さい時ループ」)

PCのスペックによってはずっと黒い画面のままだと思いますので、気長に何か表示されるまで待ってください。
この黒い画面のままのときは裏でひたすら計算が行われているのです。(20億回もね。)
 

#include <stdio.h>

int main(){
long int i=0,a=0;
while(i<2000000000 && a<2000000000)
a++;
i++;
printf("a++;は%10d回計算されました。\ni++;は%10d回計算されました。\n",a,i);
return 0;
}
 

>whileの場合、条件の更新がwhileの真下にあればその部分だけループされる、と言う事でしょうか。

その通りです。
whileに限らず、カッコを省略するものにはそれが適応される事が多いです。
if文であったり、for文であったり、while文であったり。

カッコを沢山書くとうっとうしいので、よく1行しか実行する文が無い時は省略して書きます。


for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(i==j){
printf("iとj同じ\n");
}
}
}

これと

for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(i==j)
printf("iとj同じ\n");

これは同じことです。
書いてある次の行のみ有効になります。
基本的に「次の;まで」だと思ってください。


 


412ポイント を落としてしまった。

Name: いさご  ..ぴよぴよ(834ポイント)   Date: 2007/03/26(月) 21:36   No:6135 解決!     
Title: Re:質問です〜。    
boxさん、管理人さん、丁寧な回答ありがとうございます。
とても良くわかりました。わかるとループって意外と楽しいですね。
ループを書くときに気をつける点も同時に理解できたと思います。
ありがとうございました!


106ポイント を手に入れた。



Name: たのもー  ..ぴよぴよ(599ポイント)   Date: 2007/03/26(月) 01:44   No:6101       
Title: 電卓作成中    
皆さんお久しぶりです。
C言語の勉強のほうは基本は一通り終えました。
ので、電卓を作ろうと思って一応作っては見ましたが
まったく使い物になりません。
キタナイソースコードだとは思いますが一応
見てみてください。
汚点や改良点などたくさんあると思います。
もし見つけられたら、アドバイスお願いしますm(_ _)m


↓↓ソースコードです↓↓
#include<stdio.h>
int h;
char j;
int i;
main (){
int l;
scanf("%d",&l);
h=l;

while(1){
scanf("%d",&i);
printf("足し算の場合はaを、引き算の場合はbを、掛け算の場合はcを、割り算の場合はdを、+,ー,×,÷の代わりに押してください。\n");
scanf("%c",&j);
if(j == 'c' ){
h=i*h;
continue;
}
else if(j == 'a'){
h=i+h;
continue;
}
else if(j == 'b'){
h=h-i;
continue;
}
else if(j == 'd'){
h=h/i;
continue;
}
else{
printf("プログラムを終了します。\n");
break;
}

}
printf("合計は%dです。",h);
return 0;
}

 


469ポイント を手に入れた。


Name: むつ  ..初心者(8,866ポイント)   Date: 2007/03/26(月) 01:58   No:6102     
Title: Re:電卓作成中    
・「ゼロ割」というのはご存知ですか。
0 で割る事は御法度なんですよ。
・int ではなく double の方がいいのでは。
・自分は、if() continue; より switch() break;の方が好み。


46ポイント を手に入れた。

Name: たのもー  ..ぴよぴよ(633ポイント)   Date: 2007/03/26(月) 02:27   No:6103     
Title: Re:電卓作成中    
超速解答ありがとうございます。
よく勉強していなかったせいか
「ゼロ割」というのがわかりません。
良ければ教えてください。


34ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,945ポイント)   Date: 2007/03/26(月) 03:01   No:6105     
Title: Re:電卓作成中    
数字を0で割ってはいけないと言う事ご存知ですか?
小学校で習うのですが、小学校の担任は自分自身なんで0で割ってはいけないのか解っていない場合が多いので、教えられている方は意味もわからず教えられたんじゃないかと思います。

うちんとこはホントひどい教え方でした・・。

三角関数の表にもtanが90°のとこだけ「値なし」となっているはずです。
何故0で割ってはいけないかと言うと・・。


180ポイント を落としてしまった。

Name: むつ  ..初心者(8,968ポイント)   Date: 2007/03/26(月) 03:02   No:6106     
Title: Re:電卓作成中    
y = 1 ÷ 0 を展開して、
1 = y × 0 とすると、y がいくつであっても 0 を掛けるので 0 となり、
1 = 0 と矛盾がおきてしまう。

多くの場合、「ゼロ割」によって、プログラムが強制終了すると思われます。


102ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,982ポイント)   Date: 2007/03/26(月) 03:09   No:6107     
Title: Re:電卓作成中    

a * b = c

という式があったとします。これはプログラムの代入式ではなく数式だと思ってください。

特に難しい式な訳ではなく、

1 * 2 = 2

1かけ2は2だという当たり前の式です。これは両辺をbで割る・・つまり2で和っても同じ等式になりますね。

1 * 2 / 2 = 2 / 2

これは

1 = 1

になりますから正しいです。両辺を等しい数で割ると等式がなりたっていたのなら計算後もきちんとなりたちます。
これだけ解っていたら大丈夫。



a * b = c

について

2 * b = c

であると仮定します。
ここでbが0である時、cは0でなければ等式は成り立ちません。
しかし両辺をbで割って

2 = c/b

とした時、bが0である時、この等式を成り立たせるにはcに何をいれたらいいですか・・?

そう、bが0になってしまうと等式が成り立たない。。。つまりcの解は「正解の値が無い」ということになってしまいます。

ですからtanの表に「値なし」と書いてある部分があるわけですね。

ですから値は0で割ってはいけません。


37ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,995ポイント)   Date: 2007/03/26(月) 03:09   No:6108     
Title: Re:電卓作成中    
う、かぶりました、すみませんm(_ _|||)m

13ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(244,806ポイント)   Date: 2007/03/26(月) 03:39   No:6109     
Title: Re:電卓作成中    
これは学校の課題ですか?
ご自分で興味で作成されているのでしょうか?

規定された仕様に沿わなくていいのでしたら色々簡単に実装出来ます。
ただし複雑な計算、優先順位やカッコ優先条件などを付けようとすると少し複雑になってきます。
例えば 

2.3 + 4 * 7.2 / (4.3 + 8)
 
こういう計算です。
とりあえず2つの値の計算だけやればいいのなら
例えば 

2.3 * 8.1
 
みたいな計算だけでいいのなら簡単です。

int型を使用されてらっしゃいましたが、2/3のような計算がint型では出来ないのでdouble型を使用してみましょう。

double val1,val2,ans;

val1,val2が2つの値を格納する変数で、ansに答えを代入します。

演算記号を格納する為に

char c;

で一つ文字型の変数を用意しておきます。

scanf("%lf%c%lf",&val1,&c,&val2);

このように書くことで、double型のval1,val2に値が格納でき、なおかつ真ん中の記号をchar型で代入する事が出来ます。

今cには「+-*/」のどれかの記号がはいっていますから、この記号にわけて計算してやればいいですね。

後は単に出力してやりましょう。

上記の事をプログラムで書くとこうなります。


#include <stdio.h>

int main(){
double val1,val2,ans;
char c;

printf("計算式を入力してください。(例 2.12*3.99)\n");

scanf("%lf%c%lf",&val1,&c,&val2);

switch(c){
case '+':
ans = val1 + val2;
break;
case '-':
ans = val1 - val2;
break;
case '*':
ans = val1 * val2;
break;
case '/':
ans = val1 / val2;
break;
default:
printf("異常な演算子の入力\n");
return 0;
}

printf("%f %c %f = %f\n",val1,c,val2,ans);

return 0;
}


こうかくとスマートに書けますよね。
switch文を使いましたけど、使い方わかりました?

ここで先ほど問題になった、「分母が0なら割り算をしない」という条件を付け加えたら
2つの値の計算プログラムとしては完璧です。

カッコや優先順位を気にせずにだらだらかけたり足したり延々としていくプログラムなら
こんな要領のプログラムをループさせればいいでしょう。



811ポイント を手に入れた。

Name: ダッシュ  ..中級者(11,985ポイント)   Date: 2007/03/26(月) 15:37   No:6115     
Title: Re:電卓作成中    
ゼロ割についての補足をば。

等式 y=a÷0があったとします。

(@)aが0でないとき(1とか3とかなんでもいいです。)
  これについては先に解答されてるので省略

(A)a=0のとき

  y=0÷0
  y×0=0

ここでyに何を入れてもこの等式は成立してしまいます。
何を入れても解になるなんて解とは言えません。

よってゼロ割は禁止なわけです。
ちなみに前者を『不能』後者を『不定』というようです。


193ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(244,456ポイント)   Date: 2007/03/26(月) 15:59   No:6116     
Title: Re:電卓作成中    
あぁ数学IIIをやっていた頃が遠い昔のように思えます・・。
大学受験の頃は必死になってやったものですが、今では線形代数位しか出来ません・・。
忘れるってもったいないことですね(T_T


62ポイント を手に入れた。

Name: たのもー  ..ぴよぴよ(718ポイント)   Date: 2007/03/26(月) 16:12   No:6117 解決!     
Title: Re:電卓作成中    
丁寧な解答ありがとうございました。
とてもわかりやすく解説していただいたので、
また一歩上達したと思います。
本当にありがとうございました。

ちなみにこのプログラムは興味があったので作ってみました。
私はまだ高1なので学校の課題ではありません。


85ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(244,516ポイント)   Date: 2007/03/26(月) 16:23   No:6118     
Title: Re:電卓作成中    
高1ですかぁ、皆さん早くから勉強されてらっしゃるのですね〜(´_`;
そのお年でC言語を一通り勉強されたとは・・管理人も頑張らなくては^^;


60ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(244,640ポイント)   Date: 2007/03/26(月) 16:30   No:6119     
Title: Re:電卓作成中    
条件の書き方の練習で言えばジャンケンプログラムとかいいのではないでしょうか^^
私がはじめて作ったゲームもジャンケンでした。

コンソール画面から単に入力を受け取って乱数で勝ち負け判定する
つまり実行結果は



最初はグー!ジャンケン・・・

press 1:グー 2:チョキ 3:パー
1
あなたは「グー」
コンピュータは「チョキ」
あなたの勝ちです!

 


こんな感じになります。
後になって思ったのですが、このプログラムの書き方はものすごく沢山あります。
全部条件をif文で書くという「賢くない書き方」しか最初出来ませんが
徐々に理解していくうちに「賢い書き方」が解るようになってきます。

アルゴリズムを考える問題として少し難しいですが、こういう「遊びながら覚える」って勉強の仕方が私は好きでした^^


124ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(248,850ポイント)   Date: 2007/03/26(月) 17:44   No:6125     
Title: Re:電卓作成中    
「ジャンケンプログラムを作ろう!」のトピで
そのプログラムについて紹介したのでよければ見てください^^


53ポイント を手に入れた。

Name: たのもー  ..ぴよぴよ(738ポイント)   Date: 2007/03/26(月) 20:02   No:6130     
Title: Re:電卓作成中    
ありがとうございます。
今から読みに行きます。


20ポイント を手に入れた。



Name: りん  ..ぴよぴよ(339ポイント)   Date: 2007/03/17(土) 16:05   No:5727       
Title: 配列とポインタ    
はじめまして、りんと言います。配列とポインタについて質問させていただきます。

まず、ポインタというのはアドレスを格納している(格納する)ものですよね?
int a;
int *pa;
a = 5;
pa = &a aのアドレスをポインタpaに代入すると
*pa == a ということになりますよね。
つまり、*paというポインタはアドレスを入れてあげないことには、ほとんど意味がないものになりますよね?
また、pa=&aをすることによって*paはaのアドレスの中にある値を見ることができるようになるってことですよね? このような解釈でよろしいでしょうか?

次に、文字列とポインタなのですが、文字列は配列ですよね?
char str[] = "good";@
char *str = "good";A @Aは同じことらしいのですが、ここがよく理解できないです。


私のポインタについての理解の仕方が間違っているのですか??




339ポイント を手に入れた。


Name: box  ..熟練のプログラマー(56,126ポイント)   Date: 2007/03/17(土) 16:46   No:5730     
Title: Re:配列とポインタ    
> つまり、*paというポインタはアドレスを入れてあげないことには、ほとんど意味がないものになりますよね?

ほとんどではなく、全く意味がありません。
一般に、ポインタ変数を定義しただけでは、中身は不定(何が入っているかわからない)です。
中身が不定の状態で、その中身をどこかのアドレスだと思ってアクセスすると、
場合によってはプログラムが異常終了します。

> char str[] = "good";@
> char *str = "good";A @Aは同じことらしいのですが、ここがよく理解できないです。

@とAは同じではありません。
@は、char型の配列strの0番目〜4番目の各要素に、'g', 'o', 'o', 'd', '\0' をセットしています。
Aは、"good"という文字列リテラルのアドレスを、char *型のstrにセットしています。

Aの後、
str = "no good";
とすることはできます。"no good"という、別の文字列リテラルのアドレスをchar *型の変数に
代入しているからです。
それに対して、@の後、
str = "no good";
とすることはできません。コンパイル時に「左辺値が必要」という内容のエラーが出ます。


263ポイント を手に入れた。

Name: りん  ..ぴよぴよ(352ポイント)   Date: 2007/03/17(土) 18:31   No:5733     
Title: Re:配列とポインタ    
boxさんありがとうございます。
スッキリしました。


13ポイント を手に入れた。

Name: りん  ..ぴよぴよ(621ポイント)   Date: 2007/03/18(日) 13:16   No:5749     
Title: ポインタを引数として使う    
ポインタを引数として使うことについて質問させていただきます。
まず、コードなのですが、細かいところは省略しています。

int avg(int *px); @

int main(void){
int test[2];
int i;
int ans;

printf("点数入力\n");
for(i = 0; i < 2; i++){
scanf("%d",&test[i]);
}

int avg(test);   A

printf("%d",ans);

return 0;
}

int avg(int *px){  B
int sum = 0;
int j;

for(j = 0; j < 2; j++){
sum = sum + *(px+1);
}
return sum/2;
}

ポインタというのはアドレスが入っているわけですよね?すると、Aのtest先頭要素のアドレスがこの場合だとBのpxに入ってくるということでいいのでしょうか?
そして、*pxでtestのアドレスの中身を操作している。?その際、今回はポインタを使っているので、値はコピーではなくもとの値そのものを操作していることになりますよね?

ちょっとあまりうまく自分の言いたいことが書けず、分かりにくい文章だと思いますがよろしくおねがいします。


269ポイント を手に入れた。

Name: box  ..熟練のプログラマー(57,014ポイント)   Date: 2007/03/18(日) 14:40   No:5750     
Title: Re:ポインタを引数として使う    

> ポインタというのはアドレスが入っているわけですよね?すると、Aのtest先頭要素のアドレスがこの場合だとBのpxに入ってくるということでいいのでしょうか?

そうです。

> そして、*pxでtestのアドレスの中身を操作している。?その際、今回はポインタを使っているので、値はコピーではなくもとの値そのものを操作していることになりますよね?

pxには、呼び出し側のtestの先頭アドレスという値が入っています。
*pxとすれば、pxが指している領域の内容を取得できます。

なお、avg関数における

> sum = sum + *(px+1);

は正しくありません。+1ではなく、+jでなければなりません。
あるいは、

sum += px[j];

と書く方が簡潔かもしれません。
p をポインタ変数、n を整数とするとき、一般に
*(p+n) と p[n] は等価です。


2倍のポイントを手に入れた! 200ポイント を手に入れた。

Name: りん  ..ぴよぴよ(637ポイント)   Date: 2007/03/18(日) 15:16   No:5751     
Title: Re:ポインタを引数として使う    
boxさんありがとうございます。

16ポイント を手に入れた。

Name: りん  ..ぴよぴよ(670ポイント)   Date: 2007/03/18(日) 15:54   No:5752     
Title: ポインタのポインタ    
ポインタのポイインタが混乱しています。
アドレスやら値やらごちゃごちゃしてきてしまっています。何か整理つきそうな例ないですかね?


33ポイント を手に入れた。

Name: りん  ..かけだし(1,100ポイント)   Date: 2007/03/18(日) 17:02   No:5754     
Title: Re:ポインタのポインタ    
どなたか教えて下さい。

#include<stdio.h>

main()
{
int i=10;
int *p;
int **point;

p=&i;
point=&p; /* ポインタpのアドレスを代入 */

printf(" i = %d\n",i);     @ 問題なし
printf(" *p = %d\n",*p);    A pにはiのアドレスが格納されていてそのアドレスの中にある値は10ということですよ
                    ね?
    printf("**point = %d\n",**point); B pointのなかにはpのアドレスが格納され、さらにpの中にはiのアドレスがあるので、そ 
                    その中アドレスの中にある値は10ということですよね?

    printf(" &i = %p\n",&i);    C 問題なし
printf(" p = %p\n",p);    D iのアドレスが格納されている。
printf(" *point = %p\n",*point);  E 
printf(" &p = %p\n",&p);    F ここはp = &iをしていますが、この場合はp自身のアドレスを表しているのですよね?
printf(" point = %p\n",point);  G  
printf(" &point = %p\n",&point);  HここもFと同じように、point自身のアドレスを表しているだけですよね?

/* 結果
i = 10
*p = 10
**point = 10
&i = 0064FE00
p = 0064FE00
*point = 0064FE00
&p = 0064FDFC
point = 0064FDFC
&point = 0064FDF8

E・・・よく分からないです。
pにはiのアロレスが格納され、*pの値は10になりますよね?すると、pointに格納されているのはpのアドレスで値は10になると思う
のですが・・・。????
G・・・ここのよくわからないです。。

頭の中がグルグルしてます。。。あ〜・・・


430ポイント を手に入れた。

Name: box  ..熟練のプログラマー(57,363ポイント)   Date: 2007/03/18(日) 21:11   No:5757     
Title: Re:ポインタのポインタ    

くだんの結果によると、関連するアドレスとその中身は
下図のようになっています。

アドレス 中身
+------------+
0x0064FDF8 | 0x0064FDFC |
| |
+------------+
0x0064FDFC | 0x0064FE00 |
| |
+------------+
0x0064FE00 | 10 |
| |
+------------+

> printf(" *p = %d\n",*p);    A pにはiのアドレスが格納されていてそのアドレスの中にある値は10ということですよね?

そうです。

>     printf("**point = %d\n",**point); B pointのなかにはpのアドレスが格納され、さらにpの中にはiのアドレスがあるので、そ 
>                     その中アドレスの中にある値は10ということですよね?

そうです。

> printf(" *point = %p\n",*point);  E 
> printf(" &p = %p\n",&p);    F ここはp = &iをしていますが、この場合はp自身のアドレスを表しているのですよね?

p = &iは、していないです。
&pは、pのアドレスです。pointの値と同じです。

> printf(" point = %p\n",point);  G  
> printf(" &point = %p\n",&point);  HここもFと同じように、point自身のアドレスを表しているだけですよね?

そうです。

> i = 10
> *p = 10
> **point = 10
> &i = 0064FE00
> p = 0064FE00
> *point = 0064FE00
> &p = 0064FDFC
> point = 0064FDFC
> &point = 0064FDF8
>
> E・・・よく分からないです。
> pにはiのアロレスが格納され、*pの値は10になりますよね?すると、pointに格納されているのはpのアドレスで値は10になると思う
> のですが・・・。????

「pointに入っているのはpのアドレス」までは、そのとおりです。
pのアドレスですから、0x0064FDFCです。
0x0064FDFC(pのアドレス)が指している先が、0x0064FE00(iのアドレス)です。
0x0064FE00(iのアドレス)が指している先が、10(iの値)です。

> G・・・ここのよくわからないです。。

pointの値(0x0064FDFC)は、pのアドレスです。ここから、すぐ上の段落へと続いていきます。
つまり、
pointは&p(pのアドレス)に等しいです。
pは&i(iのアドレス)に等しいです。


273ポイント を手に入れた。

Name: りん  ..かけだし(1,121ポイント)   Date: 2007/03/18(日) 22:36   No:5761     
Title: Re:ポインタのポインタ    
boxさんありがとうございます。 メモリイメージまで書いていただいて非常に助かります。
熟読させていただきます。


21ポイント を手に入れた。

Name: りん  ..かけだし(1,185ポイント)   Date: 2007/03/19(月) 11:46   No:5808     
Title: 関数ポインタ    
関数ポインタがイマイチ理解できないというか、わざわざ関数をポインタで呼び出すより普通に関数を呼び出したほうが簡単じゃない?関数ポインタを使うメリットが分からないです。どういうときに使うべきか。

64ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,517ポイント)   Date: 2007/03/19(月) 13:18   No:5810     
Title: Re:関数ポインタ    
> 関数ポインタがイマイチ理解できない

先だっての「ポインタへのポインタ」は十分に理解できましたか?
まだ理解できていないとすると、まずはそちらを先に済ませてから
関数ポインタの話へ進む方がよいと思います。

関数ポインタの話をする際、これまでとは別に、新しいスレッドを
立てる方がよいようにも思います。


120ポイント を落としてしまった。

Name: りん  ..かけだし(1,225ポイント)   Date: 2007/03/19(月) 13:57   No:5815 解決!     
Title: Re:関数ポインタ    
boxさん了解しました。ポインタのポインタをもう少し勉強してから新たなスレたてさせていただきます。
そのときはよろしくお願いします!


40ポイント を手に入れた。

Name: りん  ..かけだし(1,570ポイント)   Date: 2007/03/20(火) 15:01   No:5917     
Title: Re:関数ポインタ    
ちょっと微妙なことなんですけど・・・・。
このコードってちゃんと合計でる?私のだと出ないのですが。
又、for(i = 0; i < sizeof a /sizeof a[0]; i++)のところが
何をしてるのかよく分からないですね。とくにsizeofのところです。
あと、sum += *p++;ってのはsum = sum + *p;と同じことですよね?

何分、独学なもので間違って覚えてしまうと後々つらいと思うので。


#include <stdio.h>

int main(void) {

int a[] = {1,2,3,4,5,6,7,8,9,10};
int *p;
int i;
int sum;
p = a;

for(i = 0; i < sizeof a /sizeof a[0]; i++) {
sum += *p++;
}

printf("%d",sum);

return 0;
}


345ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,996ポイント)   Date: 2007/03/20(火) 15:24   No:5918     
Title: Re:関数ポインタ    

> このコードってちゃんと合計でる?私のだと出ないのですが。

合計値が正しくないのは、最初にゼロで初期化していないためです。

> 又、for(i = 0; i < sizeof a /sizeof a[0]; i++)のところが

sizeof a は、配列a全体の大きさ(バイト数)を得ます。
sizeof a[0] は、配列aの先頭要素の大きさを得ます。
したがって、sizeof a /sizeof a[0] は、配列aの要素数を得ます。今回の例では、10です。
配列の要素数をコンピュータに数えさせる際の、定番のやり方です。

> あと、sum += *p++;ってのはsum = sum + *p;と同じことですよね?

同じではありません。
sum = sum + *p;
p++;
の2つの文と同じです。


141ポイント を手に入れた。

Name: りん  ..かけだし(1,606ポイント)   Date: 2007/03/20(火) 15:32   No:5919     
Title: Re:関数ポインタ    
boxさんありがとうございます。

なぜか答えが5540になってしまったのですけど。(ちゃんと初期化しました)


36ポイント を手に入れた。

Name: box  ..熟練のプログラマー(59,046ポイント)   Date: 2007/03/20(火) 15:42   No:5920     
Title: Re:関数ポインタ    
> なぜか答えが5540になってしまったのですけど。(ちゃんと初期化しました)

では、コード全体を見せてください。
私のところでは、sumをゼロに初期化したら55という正しい結果を得ました。


50ポイント を手に入れた。

Name: りん  ..かけだし(1,570ポイント)   Date: 2007/03/20(火) 15:46   No:5921     
Title: Re:関数ポインタ    
できていました!!!boxさんわざわざすいませんでした!!
でも、sum += *p++;とsum = sum + *pが微妙ですね。なかなか難しいです。


36ポイント を落としてしまった。

Name: box  ..熟練のプログラマー(59,440ポイント)   Date: 2007/03/20(火) 16:44   No:5922     
Title: Re:関数ポインタ    

こんな絵が参考になるでしょうか。

a[0] a[1] a[2] a[3] a[4] ...
+----+----+----+----+----+
| 1 | 2 | 3 | 4 | 5 | ...
+----+----+----+----+----+

p = a; で、pはaの先頭要素を指す。

for文によるループに入る。

sumに、現在pが指している領域の内容(==1)を加える。
pを、1要素分だけ進める。
この2行が、「sum += *p++;」の意味。

a[0] a[1] a[2] a[3] a[4] ...
+----+----+----+----+----+
| 1 | 2 | 3 | 4 | 5 | ...
+----+----+----+----+----+

pは、ここを指している。
終了条件を満たしていないので、ループの中の処理を続ける。

sumに、現在pが指している領域の内容(==2)を加える。
pを、1要素分だけ進める。

a[0] a[1] a[2] a[3] a[4] ...
+----+----+----+----+----+
| 1 | 2 | 3 | 4 | 5 | ...
+----+----+----+----+----+

pは、ここを指している。
終了条件を満たしていないので、ループの中の処理を続ける。

以下省略



394ポイント を手に入れた。

Name: りん  ..かけだし(1,661ポイント)   Date: 2007/03/22(木) 20:28   No:6016     
Title: Re:関数ポインタ    

#include <stdio.h>

int main(void) {
char *p;
char *str = "hello";

for(p = str; *p !='\0'; p++) {
putchar(*p);
}
return 0;
}

forの中身なのですが、p++の所って*p++でもできますよね?テキストではp++ですけど。
ポインタ演算が微妙です。


91ポイント を手に入れた。

Name: box  ..熟練のプログラマー(59,836ポイント)   Date: 2007/03/22(木) 20:47   No:6017     
Title: Re:関数ポインタ    

> forの中身なのですが、p++の所って*p++でもできますよね?テキストではp++ですけど。

*p++と書いても、プログラムの動作は全く同じです。
つまり、今回の場合、* を付けることは無意味です。

【解説】
*p++ を実行する、ということは、次の2つの文を実行することと等価です。
*p;
p++;

ここで、
*p;
という文は、p が指している領域の内容を取得するだけで、他の変数に代入するなどの
処理を行なっていません。
例えば、int 型の変数 a に任意の値が入っているとして、
a;
という文に実質的な意味がないことはおわかりかもしれません。それと全く同じです。



114ポイント を手に入れた。

Name: りん  ..かけだし(1,671ポイント)   Date: 2007/03/22(木) 20:57   No:6018 解決!     
Title: Re:関数ポインタ    
boxさんありがとうございます。

10ポイント を手に入れた。

Name: りん  ..かけだし(1,740ポイント)   Date: 2007/03/22(木) 21:04   No:6019     
Title: Re:関数ポインタ    
char *str ="hello" @ と
char *str[]="hello" A って同じ事ですか?・・・・違いますよね?

@の場合はhelloという文字列のアドレスをstrに入れてるということで
Aは・・・・。分からないです。


69ポイント を手に入れた。

Name: box  ..熟練のプログラマー(59,908ポイント)   Date: 2007/03/22(木) 21:25   No:6020     
Title: Re:関数ポインタ    

> Aは・・・・。分からないです。

Aの場合は、char型へのポインタの配列を定義しようとしています。
配列の要素数は、1です。

なお、配列の初期化を行なう際は、要素を { と } で囲む必要があります。
char *str[] = { "hello" };
のようにしてください。




72ポイント を手に入れた。

Name: りん  ..かけだし(1,751ポイント)   Date: 2007/03/23(金) 05:55   No:6023     
Title: Re:関数ポインタ    
boxさんありがとうございます。

11ポイント を手に入れた。

Name: りん  ..かけだし(1,987ポイント)   Date: 2007/03/23(金) 08:45   No:6025     
Title: Re:関数ポインタ    
やっぱりちょっと分からないですね。Aが。
char型へのポインタの配列が(char *str[])、char *strとどのようにちがうのでしょう?
char *str = {"hello"}・・・文字列のアドレスをstrに入れているというのは分かります。が、
char *str[]={"hello"}・・・char型へのポインタの配列??いったいどのようなものなのでしょう?
              アドレスを格納するための配列ができるということ?

両方ともポインタだから、アドレスを格納することはわかるのですが、そこから先がわからないでどす。


236ポイント を手に入れた。

Name: りん  ..かけだし(1,999ポイント)   Date: 2007/03/23(金) 09:35   No:6026     
Title: Re:関数ポインタ    
char str4[2][4] ={{"eee","fff","ggg"},{"hhh","iii","jjj"}};コンパイルできないのですが、どこか変?
初期化子が多すぎるってでます。


12ポイント を手に入れた。

Name: keichan  ..上級者(18,632ポイント)   Date: 2007/03/23(金) 09:47   No:6027     
Title: Re:関数ポインタ    
文字列配列として扱いたいのであれば

char* char4[2][3] = {{"eee", "fff", "ggg"}, {"hhh", "iii", "jjj"}};


文字配列としてなら

char str4[2][4] = {{'e', 'e', 'e', '\0'}, {'f', 'f', 'f', 'f'}};


と言う風に初期化できます。


95ポイント を手に入れた。

Name: りん  ..かけだし(2,029ポイント)   Date: 2007/03/23(金) 09:58   No:6028     
Title: Re:関数ポインタ    
ポインタの配列っていうのは、二次元配列に近い感じでうsか?

30ポイント を手に入れた。

Name: keichan  ..上級者(19,246ポイント)   Date: 2007/03/23(金) 13:49   No:6029     
Title: Re:関数ポインタ    

ポインタ変数と配列は別物ですので別々にして理解を深めた方が良いでしょう。

char* a = "abc";

これを図にしてみると
char* 型変数である a がメモリの p番地 に生成されたとすると
+----------------------------+
p番地 | "abc"を指すアドレス(n番地) |
+----------------------------+

そして n番地は以下の様になっています。

+----------+
n番地 | 'a' |
+----------+
n+1番地 | 'b' |
+----------+
n+2番地 | 'c' |
+----------+
n+3番地 | '\0' |
+----------+


これを単に配列にしているだけですので、

char* b[3] = {"abc", "de", "f"};

char* 型配列変数である b がメモリの p番地 に生成されたとすると

+-----------------------------+
p番地 | "abc"を指すアドレス(n1番地) |
+-----------------------------+
p+1番地 | "de"を指すアドレス(n2番地) |
+-----------------------------+
p+2番地 | "f"を指すアドレス(n3番地) |
+-----------------------------+

+----------+ +----------+ +----------+
n1番地 | 'a' | n2番地 | 'd' | n3番地 | 'f' |
+----------+ +----------+ +----------+
n1+1番地 | 'b' | n2+1番地 | 'e' | n3+1番地 | '\0' |
+----------+ +----------+ +----------+
n1+2番地 | 'c' | n2+2番地 | '\0' |
+----------+ +----------+
n1+3番地 | '\0' |
+----------+


単純にこれだけの事です。


614ポイント を手に入れた。

Name: りん  ..かけだし(2,021ポイント)   Date: 2007/03/24(土) 17:23   No:6060     
Title: Re:関数ポインタ    

#include <stdio.h>
#include <string.h>

int main(void) {
char str1[] = "abcdefg";
char str2[80], *p1, *p2;

p1 = str1 + strlen(str1)-1;
p2 = str2;

while(p1 >= str1){
*p2++ = *p1--;
*p2 ='\0';
}
printf("%s,%s",str1,str2);
return 0;
}

p1 = str1 + strlen(str1)-1;
p2 = str2;
この二つはそれぞれアドレスを入れてるのですよね?配列の宣言がしてありますから。

whileからが分からないです。


8ポイント を落としてしまった。

Name: box  ..比類無きプログラマー(60,480ポイント)   Date: 2007/03/24(土) 18:26   No:6063     
Title: Re:関数ポインタ    

> p1 = str1 + strlen(str1)-1;
> p2 = str2;
> この二つはそれぞれアドレスを入れてるのですよね?配列の宣言がしてありますから。

p1は、str1の先頭のアドレスから、str1の文字数分だけ進み、1つ戻っています。
str1の文字数は7ですので、結局、p1は、str1の先頭から6文字分進んでいます。
つまり、p1は、str1の最後の文字'g'を指しています。
一方、p2は、str2の先頭を指しています。

> whileからが分からないです。

7文字だと説明が少し長くなりますので、str1[]に"abc"が入っていることにして説明します。

【whileの前の準備段階】
p1は、上で書いたとおり、str1の最後の文字'c'を指している。
p2は、str2の先頭文字を指している。この時点では、内容は不定(str2を初期化していないため)。

【whileの中身】
p1は'c'を指しているので、str1(つまり、先頭文字'a'のアドレス)以上の値を持つ。
ループを継続する条件を満たしているので、ループの中に入る。

p2が指している場所(str2の先頭、0文字目と呼ぶことにする)に、
p1が指している場所の内容'c'を代入する。
代入後、p2のアドレスを1つ進めて、p1のアドレスを1つ戻す。
さらに、そのときp2が指している場所に、文字列終端用の'\0'を代入する。
この時点で、p2はstr2の1文字目('\0')を指し、p1は'b'を指している。
まだ、ループの継続条件を満たしている。

p2の1文字目に、p1が指している'b'を代入する。
代入後、p2のアドレスを1つ進めて、p1のアドレスを1つ戻す。
さらに、そのときp2が指している場所に、文字列終端用の'\0'を代入する。
この時点で、p2はstr2の2文字目('\0')を指し、p1は'a'を指している。
まだ、ループの継続条件を満たしている。

p2の2文字目に、p1が指している'a'を代入する。
代入後、p2のアドレスを1つ進めて、p1のアドレスを1つ戻す。
さらに、そのときp2が指している場所に、文字列終端用の'\0'を代入する。
この時点で、p2はstr2の3文字目('\0')を指し、p1は'a'の直前(内容は不定)を指している。
ここで、ループの継続条件を満たさなくなる。

【whileを抜けた後】
str1は"abc"の先頭文字'a'を指しているので、書式文字列"%s"を使うと、"abc"と出力する。
一方、while文によるループの中でp2が指している場所に文字を代入しているということは、
準備段階においてp2をstr2の先頭文字のアドレスで初期化していたことが効いてきて、
結局のところstr2の要素の中に文字を代入したことになる。書式文字列"%s"を使うと、"cba"と出力する。

【結論】
str2には、str1の文字順を逆転させた内容が入る。


504ポイント を手に入れた。

Name: box  ..比類無きプログラマー(61,524ポイント)   Date: 2007/03/24(土) 18:38   No:6064     
Title: Re:関数ポインタ    

図を描くと、こんな感じです。

【準備段階】

+------+------+------+------+
str1 | 'a' | 'b' | 'c' | '\0' |
+------+------+------+------+

p1は、ここを指している

+------+------+------+------+
str2 | 不定 | 不定 | 不定 | 不定 | ......
+------+------+------+------+

p2は、ここを指している


【ループ(1回目終了時)】

+------+------+------+------+
str1 | 'a' | 'b' | 'c' | '\0' |
+------+------+------+------+

p1は、ここを指している

+------+------+------+------+
str2 | 'c' | '\0' | 不定 | 不定 | ......
+------+------+------+------+

p2は、ここを指している


【ループ(2回目終了時)】

+------+------+------+------+
str1 | 'a' | 'b' | 'c' | '\0' |
+------+------+------+------+

p1は、ここを指している

+------+------+------+------+
str2 | 'c' | 'b' | '\0' | 不定 | ......
+------+------+------+------+

p2は、ここを指している


【ループ(3回目終了時)】

+------+------+------+------+
str1 | 'a' | 'b' | 'c' | '\0' |
+------+------+------+------+

p1は、ここを指している(内容は不定)

+------+------+------+------+
str2 | 'c' | 'b' | 'a' | '\0' | ......
+------+------+------+------+

p2は、ここを指している

この時点でループの継続条件を満たさなくなる。
"abc"と"cba"を出力する。



2倍のポイントを手に入れた! 1,044ポイント を手に入れた。

Name: りん  ..かけだし(2,057ポイント)   Date: 2007/03/25(日) 09:16   No:6073     
Title: Re:関数ポインタ    
boxさんへ
丁寧な解説ありがとうございます!!本当にたすかりました!!


36ポイント を手に入れた。

Name: りん  ..かけだし(2,248ポイント)   Date: 2007/03/25(日) 09:32   No:6075     
Title: Re:関数ポインタ    

int main(void) {
char *p;
p = "aa bb cc";
printf(p);
return 0;
}


printf(p)でなんで文字列aa bb ccが出力されるのでしょう?
p="aa bb cc"で文字列の先頭アドレスがpに格納されているのはわかるのですが、アドレスが指している値を
表示するときって*pとするのではないのですか?
でも、この場合だとprintf(*p)とするとint型は渡せないというエラーがでてしまいます。
printf("%c",*p)だとaだけが表示される。なぜでしょう??


191ポイント を手に入れた。

Name: 組木紙織  ..初心者(8,086ポイント)   Date: 2007/03/25(日) 11:55   No:6077     
Title: Re:関数ポインタ    
printf()の第一引数は const *char になっています。
つまり文字列へのポインタを与えていることになります。

printf()の関数はその第一引数を読み込んで解析をしてから
第二引数以降を判断しています。

よって、
>printf(p);
は文字列へのポインタを与えているので、問題なく動きます。

>printf("%c",*p)だとaだけが表示される。なぜでしょう??
は"%c"に秘密があります。"%s"に変更すると文字列が表示されるはずです。
printf()は色々と使い方があるのでじっくりと調べてみたらいいと思います。


141ポイント を手に入れた。

Name: りん  ..かけだし(2,311ポイント)   Date: 2007/03/25(日) 12:07   No:6078     
Title: Re:関数ポインタ    
組木紙織さんへ
>printf()の第一引数は const *char になっています。
>つまり文字列へのポインタを与えていることになります。

なるほど!!納得です!!ありがとうございます!!


63ポイント を手に入れた。

Name: りん  ..かけだし(2,407ポイント)   Date: 2007/03/25(日) 12:40   No:6080     
Title: Re:関数ポインタ    
#include <stdio.h>
#include <string.h>
int main(void) {
char *p;
char str[80];

do{
printf("文字入力\n");
gets(str);
}while(strcmp(p,str));
return 0;
}

この場合のgets(str)のstrというのは文字列のポインタとなるのですよね?


96ポイント を手に入れた。

Name: box  ..比類無きプログラマー(61,595ポイント)   Date: 2007/03/25(日) 13:20   No:6081     
Title: Re:関数ポインタ    
> printf(p)でなんで文字列aa bb ccが出力されるのでしょう?

printf(p);
は、場合によっては正しくない動きをします。
試しに、pを
"aa b%db cc" や
"aa%s bb cc" にしてみてください。
おかしな内容を出力したり、プログラムが異常終了したりします。
printf("%s", p);
のように、書式文字列を明示的に指定してください。


71ポイント を手に入れた。

Name: box  ..比類無きプログラマー(61,629ポイント)   Date: 2007/03/25(日) 13:24   No:6082     
Title: Re:関数ポインタ    

> この場合のgets(str)のstrというのは文字列のポインタとなるのですよね?

そうです。
ところで、ループの継続条件である

> }while(strcmp(p,str));

について説明していただけますか?


34ポイント を手に入れた。

Name: りん  ..かけだし(2,411ポイント)   Date: 2007/03/25(日) 15:11   No:6084     
Title: Re:関数ポインタ    
boxさんへ
解説ありがとうございます。

> }while(strcmp(p,str));

>について説明していただけますか?


ごめんなさい。わからないです、


4ポイント を手に入れた。

Name: box  ..比類無きプログラマー(61,774ポイント)   Date: 2007/03/25(日) 16:39   No:6085     
Title: Re:関数ポインタ    
> ごめんなさい。わからないです、

そのプログラムに、どういう動きをさせたいのでしょうか?
C言語のことを離れて、文章で書いていただけますか?


35ポイント を手に入れた。

Name: りん  ..かけだし(2,462ポイント)   Date: 2007/03/25(日) 17:22   No:6086     
Title: Re:関数ポインタ    
boxさんへ
私のつかっているテキストによると、stopと入力されるまで文字列の読み取りを繰り返すプログラム
と書いてあります。


51ポイント を手に入れた。

Name: box  ..比類無きプログラマー(61,820ポイント)   Date: 2007/03/25(日) 17:28   No:6087     
Title: Re:関数ポインタ    
> stopと入力されるまで文字列の読み取りを繰り返すプログラム

では、プログラムのどこかに"stop"と何かを比べる、
というコードがないとまずいではないですか。


46ポイント を手に入れた。

Name: りん  ..入門者(2,539ポイント)   Date: 2007/03/25(日) 18:59   No:6089     
Title: Re:関数ポインタ    
#include <stdio.h>

int main(void) {
int *p;
int q;

p = &q;
q = 1;
*p++;
return 0;

}
@このコードですけど、*p++ってのはポインタpのアドレスをインクリメントしているのですよね?

A(*p)++にした場合はqをインクリメントしていることですよね?



77ポイント を手に入れた。

Name: box  ..比類無きプログラマー(62,029ポイント)   Date: 2007/03/25(日) 22:42   No:6097     
Title: Re:関数ポインタ    
> @このコードですけど、*p++ってのはポインタpのアドレスをインクリメントしているのですよね?
>
> A(*p)++にした場合はqをインクリメントしていることですよね?

この話をする前に、「stopと入力されるまで文字列の読み取りを繰り返すプログラム」の件を
片付ける必要はないですか?


33ポイント を手に入れた。

Name: りん  ..入門者(2,608ポイント)   Date: 2007/03/26(月) 07:29   No:6111     
Title: Re:関数ポインタ    
stopと入力されるまで文字列の読み取りを繰り返すプログラムですけど、stopと入力してもループおわらないですね。

このテキストは一体なんなんだ・・・


69ポイント を手に入れた。

Name: 組木紙織  ..初心者(8,159ポイント)   Date: 2007/03/26(月) 08:49   No:6112     
Title: Re:関数ポインタ    
テキストのニュアンスを知らないので正しいかどうか分かりませんが、
上記のことがテキストに書いていれば誤植だと思います。

1行直せば仕様どうりに動くので、直してみたらいいと思います。



73ポイント を手に入れた。

Name: りん  ..入門者(2,718ポイント)   Date: 2007/03/26(月) 17:34   No:6120     
Title: Re:関数ポインタ    
#include <stdio.h>

int main(void) {
int *p;
int q;

p = &q;
q = 1;
*p++;
return 0;

}
@このコードですけど、*p++ってのはポインタpのアドレスをインクリメントしているのですよね?

A(*p)++にした場合はqをインクリメントしていることですよね?



110ポイント を手に入れた。



Name: Andy  ..ぴよぴよ(285ポイント)   Date: 2007/03/19(月) 20:35   No:5856       
Title: Visual Studio.NET 2003について    
お世話になります。
今、Windowフォームでプログラムを作成していますが、スレッドを作成しようと思い、
調べたところ、BackgroundWorkerコンポーネントを追加して
バックグラウンドで処理をすると記載されていました。

「ツールボックス」にもそのようなコンポーネントはなく、
追加できません。

.NET 2003でBackgroundWorkerコンポーネントを使用する場合は
どのようにしたらいいのでしょうか?

どうぞよろしくお願い致します。


138ポイント を手に入れた。


Name: keichan  ..上級者(18,537ポイント)   Date: 2007/03/20(火) 09:44   No:5895     
Title: Re:Visual Studio.NET 2003について    
System.ComponentModel名前空間の中に存在します。
ただし、.NET Framework 2.0 で実装されたものですので、
開発環境が.NET Framework 1.x では使用できません。


51ポイント を手に入れた。

Name: Andy  ..ぴよぴよ(340ポイント)   Date: 2007/03/23(金) 14:42   No:6030 解決!     
Title: Re:Visual Studio.NET 2003について    
回答ありがとうございます。
使用できなさそうですね。
ワーカースレッドで検討してみます。
ありがとうございました。


55ポイント を手に入れた。

Name: keichan  ..上級者(19,340ポイント)   Date: 2007/03/23(金) 18:25   No:6032     
Title: Re:Visual Studio.NET 2003について    
>使用できなさそうですね。
いいえ、.NET Framework2.0 SDKをインストールすればVS2003でも使用できます。

下記アドレスにてSDKダウンロードできますので、試してみてはいかがでしょうか?
http://www.microsoft.com/downloads/details.aspx?familyid=FE6F2099-B7B4-4F47-A244-C96D69C35DEC&displaylang=ja


94ポイント を手に入れた。

Name: Blue  ..ぴよぴよ(184ポイント)   Date: 2007/03/25(日) 03:26   No:6071     
Title: Re:Visual Studio.NET 2003について    
>NET Framework2.0 SDKをインストールすればVS2003でも使用できます。
使用できるのでしょうか?

IDEを使っている場合、デフォルトのままだと.NET Framework1.1用にコンパイル
してしまうので、そこらへんを換えれるのでしょうか?
(1.1で2.0のコンポーネントを直接は使えないはず。
MC++とC++/CLIではコードの記述の仕方も異なるし)

それとももっと別の方法、たとえばActiveXコントロールみたいにして使うということでしょうか?


122ポイント を手に入れた。

Name: keichan  ..上級者(19,570ポイント)   Date: 2007/03/26(月) 11:10   No:6114     
Title: Re:Visual Studio.NET 2003について    

以前VS2003で.NET Framework2.0で作成されたコンポーネントを使っていた記憶があったので

簡単にできるものと思い込んでいました。

.NET Framework2.0のコアコンポーネントが使用できるか試してみました。

試した工程は以下の通り


1.VS2003を起動し、C#アプリケーションプロジェクトの作成

2.プロジェクトプロパティ -> 共通のプロパティ -> 全般 のサポートされているランタイム
  からデフォルト以外のバージョンを選択し、app.configを作成。

3.VSを一旦終了し、app.configを.NET Framework2.0用バージョンに書き換え。
   supportedRuntime, requiredRuntime, assemblyBinding appliesTo,
   dependentAssembly それぞれのバージョンを変更。
   #publicKeyToken は触っていない。

4.VSを起動し、該当プロジェクトのコンパイル成功

5.起動時にエラー(エラーメッセージ:プロセスにアタッチできません。)


上記方法では version2.0 に変更できませんでした。
不確かな情報を出してしまい申し訳ありませんでした。


230ポイント を手に入れた。



Name: 紅茶  ..ぴよぴよ(27ポイント)   Date: 2007/03/25(日) 18:28   No:6088       
Title: 質問なのですが・・・    
初めまして紅茶と申します。
早速質問なんですが、DXライブラリをダウンロードしてVC++を起動させるところまでいったのですが、
次のF5を押して全画面にあの(女の人がいて背景が黒の)画像を出すことができないのですがどうしたらいいのでしょうか?


27ポイント を手に入れた。


Name: むつ  ..初心者(8,820ポイント)   Date: 2007/03/25(日) 19:34   No:6090     
Title: Re:質問なのですが・・・    
拡張子が sln のファイルはVC++.NETのプロジェクトファイルです。
【dsw:VC++ 6.0 ワークスペース】【sln:VS.NET ソリューション】

VC++.NET以外をお使いなら以下の方法を試してください。

1.作業用フォルダを作成
  例:「c:\work\c\」
2.「サンプルプログラム実行用フォルダ」の中身を作業用フォルダにコピー

3.VC++を起動して、
「ファイル」->「新規作成」->「プロジェクトタブ選択」->「Win32 Application選択」->
「プロジェクト名にDxlibLessonを入力しOK」->「空のプロジェクト選択し終了・OK」->

4.プロジェクトにファイルを追加
「プロジェクト」->「プロジェクトへ追加」->「ファイル」->
「"test.cpp" "DxDirectX.h" "DxLib.h" を追加」->「F5:ビルド」->「ESCで終了」

5.Debugフォルダに実行ファイルが吐き出されます。
c:\work\C\DxlibLesson\Debug\DxlibLesson.exe

                                      以上


2倍のポイントを手に入れた! 726ポイント を手に入れた。

Name: 紅茶  ..ぴよぴよ(5ポイント)   Date: 2007/03/26(月) 10:51   No:6113 解決!     
Title: Re:質問なのですが・・・    
なんとかできました^^ ありがとうございましたm(_ _)m

22ポイント を落としてしまった。



Name: み〜  ..プログラマー(27,234ポイント)   Date: 2007/03/23(金) 21:41   No:6035       
Title: ファイルの読み書き!!    
お久しぶりです!!みなさんにアドバイスを沢山頂きようやくファイルのことが分かってきました。本当に感謝
しております!!下のコードでちょっと問題発生です!!アドバイスよろしくお願いします!!

//書き込みコード
#include <stdio.h>
#define NUM 3

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
char point[NUM][10];
char buf[NUM][256];
int i;
fp = fopen("student.txt","w");
if(fp == NULL) {
return 1;
}
printf("FILE OPEN\n");

for(i = 0; i < NUM; i++) {
printf("%d人目",i + 1);
printf("NO>>>");
scanf("%s",buf);
fprintf(fp,"NO>>>%s\n",buf);
printf("NAME>>>");
scanf("%s",buf);
fprintf(fp,"NAME>>>%s\n",buf);
printf("POINT>>>");
scanf("%s",buf);
fprintf(fp,"POINT>>>%s\n",buf);
}
printf("書き込み終了\n");

fclose(fp);
return 0;
}


//読み込みコード
#include <stdio.h>
#define NUM 3

int main(void){
FILE *fp;
int buf[20];
int i;

fp = fopen("student.txt","r");
if(fp == NULL) {
return 1;
}
printf("FILE OPEN\n");

for(i = 0; i < NUM; i++){
printf("%d人目\n",i + 1);
fgets(&buf,sizeof(buf),fp);
printf("%s\n",buf);
fgets(&buf,sizeof(buf),fp);
printf("%s\n",buf);
fgets(&buf,sizeof(buf),fp);
printf("%s\n",buf);
}
fclose(fp);
return 0;
}

書き込み、読み込み成功しているのですが、読み込みコードをコンパイルするときfgets()の部分で警告
「問題のあるポインタの変換」とでてしまいます。どうしてでしょう?


577ポイント を手に入れた。


Name: box  ..熟練のプログラマー(59,976ポイント)   Date: 2007/03/23(金) 22:11   No:6036     
Title: Re:ファイルの読み書き!!    

> //書き込みコード
> char no[NUM][10];
> char name[NUM][20];
> char point[NUM][10];

no, name, pointは、定義しただけで使っていません。
よいのでしょうか?

> scanf("%s",buf);

2次元配列にしている意味がないように見えます。
buf[i] と書くべきでありましょう。

> //読み込みコード
> int buf[20];

char型で書き込んだ内容を、なぜint型で読み込むのでしょうか?

> fgets(&buf,sizeof(buf),fp);

第1引数の&は不要です。


68ポイント を手に入れた。

Name: み〜  ..プログラマー(27,364ポイント)   Date: 2007/03/23(金) 22:52   No:6038     
Title: Re:ファイルの読み書き!!    
boxさんご指摘&アドバイスありがとうございます!!
>no, name, pointは、定義しただけで使っていません

確かに使ってないですね。マズイですね。buf[i]とするべきでしたね。。


>char型で書き込んだ内容を、なぜint型で読み込むのでしょうか?

うっかりしてました・・^^; まだまだ勉強不足ですね。。


130ポイント を手に入れた。

Name: むつ  ..初心者(8,094ポイント)   Date: 2007/03/23(金) 23:19   No:6039     
Title: Re:ファイルの読み書き!!    
以下のソースは、
 ・入力してすぐ書き込み用データ蓄積、読み込んですぐ表示
 (データ入力・読み込み後のチェックをしていない)
 ・数値も全てcharで扱っている。
この通りなので、あまり良い例ではありませんが、
最低限、お望みの動作はするかと思います。
修正点はかなりありますので、み〜さんのソースと見比べてみてください。

※ソースを読みやすくする為に、空白を適所にいれると、ケアレスミスも減りますよ。

/* 書き込み */
#include <stdio.h>
#define NUM 3
int main( void )
{
FILE *fp;
char buf[ 256 ];
int i;
fp = fopen( "student.txt", "w" );
if( fp == NULL ) {
return 1;
}
printf( "FILE OPEN\n" );

for( i = 0; i < NUM; i++ ) {
printf( "%d人目\n", i + 1 );
printf( "NO>>>" );
scanf( "%s", &buf );
fprintf( fp, "%s\n", buf );

printf( "NAME>>>" );
scanf( "%s", &buf );
fprintf( fp, "%s\n", buf );

printf( "POINT>>>" );
scanf( "%s", &buf );
fprintf( fp, "%s\n", buf );
}
printf( "書き込み終了\n" );
fclose( fp );
return 0;
}

/* 読み込みコード */
#include <stdio.h>
#include <string.h>
#define NUM 3

int main( void )
{
FILE *fp;
unsigned char buf[ 256 ];
int i;
fp = fopen( "student.txt", "r" );
if( fp == NULL ) {
return 1;
}
printf( "FILE OPEN\n" );

for( i = 0; i < NUM; i++ ){
printf( "%d人目\n", i + 1 );

fgets( buf, sizeof( buf ), fp );
// fgetsは改行も取ってきてしまうので、改行を\0に置き換え
// 読み込んだ内容をチェックする時に改行が邪魔をするので
buf[ strlen( buf ) - 1 ] = '\0';
// 改行をつけて表示
printf( "%s\n", buf );

fgets( buf, sizeof( buf ), fp );
buf[ strlen( buf ) - 1 ] = '\0';
printf( "%s\n", buf );

fgets( buf, sizeof( buf ), fp );
buf[ strlen( buf ) - 1 ] = '\0';
printf( "%s\n", buf );
}
fclose( fp );
return 0;
}


412ポイント を手に入れた。

Name: み〜  ..プログラマー(27,380ポイント)   Date: 2007/03/24(土) 08:41   No:6045     
Title: Re:ファイルの読み書き!!    
むつさんへ。
わざわざありがとうございます。参考にさせていただきます。


16ポイント を手に入れた。

Name: み〜  ..プログラマー(28,528ポイント)   Date: 2007/03/24(土) 09:22   No:6046     
Title: Re:ファイルの読み書き!!    
今度はバイナリファイルに書き込み、ランダムアクセスをするというものです。
バイナリファイルというものは、普通人間が見ても分からないようになっていますよね。だが、私が書き込んだ
ファイルを見ると、このようにファイルのなかに書き込まれていました↓

123 e N a abc e N a m e d O b 10 e N a 456 e N a def e N a m e d O b 20 e N a 789 e N a ghi e N a m e d O b 30 e N a

確かにNOには123,NAMEにはabcとしました。書き込みの時のファイルの拡張子がいけないのでしょうか?普通バイナリテキストの時の拡張子は.txtとはしないのですか?
PS:私の場合ファイルはバイナリエディタなど使っていません。普通のメモ帳に書き込んでいます。

ランダムアクセスのfseek(fp,0,SEEK_SET);は先頭から0バイト目を読み込むというものですよね?そしてfread(&buf,10,1,fp)で10バイト分を1回読み込むということじゃないですか。すると私の場合、123と出てきてしますのですが、これでいいのでしょうか?文字は1バイトだから123abc1045とでると思うのですが。。


NO>>>123 name>>>abc point>>>10
NO>>>456 name>>>def point>>>20
NO>>>789 name>>>ghi point>>>30
とバイナリファイルにはかきこみました。

//書き込みコード
#include <stdio.h>
#define NUM 3

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
char point[NUM][10];
char buf[NUM][256];
int i;
fp = fopen("student1.txt","wb");
if(fp == NULL) {
return 1;
}
printf("FILE OPEN\n");

for(i = 0; i < NUM; i++) {
printf("%d人目",i + 1);
printf("NO>>>");
scanf("%s",buf);
fwrite(&buf,10,1,fp);
printf("NAME>>>");
scanf("%s",buf);
fwrite(&buf,20,1,fp);
printf("POINT>>>");
scanf("%s",buf);
fwrite(&buf,10,1,fp);
}
printf("書き込み終了\n");

fclose(fp);
return 0;
}


読み込みコード
#include <stdio.h>

int main(void) {
FILE *fp;
char buf[20];

fp = fopen("student1.txt","rb");
if(fp == NULL){
return 1;
}
printf("FILE OPEN\n");

fseek(fp,0,SEEK_SET);
fread(&buf,10,1,fp);
printf("%s",buf);

fclose(fp);
return 0;
}


1,148ポイント を手に入れた。

Name: miyaza  ..初心者(6,561ポイント)   Date: 2007/03/24(土) 11:17   No:6047     
Title: Re:ファイルの読み書き!!    
今回の書き込みで
31 31 34 00 CC CC
という感じでバイナリが続いていきます。結局テキストファイルというもの自体がこういったバイナリを文字に変換して表示するものなので。メモ帳で開き続ける限り普通じゃない部分 CC CC なども表示されますが、正常な書き込み部分も表示されます。


136ポイント を手に入れた。

Name: miyaza  ..初心者(6,610ポイント)   Date: 2007/03/24(土) 11:21   No:6048     
Title: Re:ファイルの読み書き!!    
そもそも文字コードを書き込んでいるのだからメモ帳で開けるのは当たり前です。これがint型で数値を書き込んでいたらメモ帳では読み取れませんが。

49ポイント を手に入れた。

Name: miyaza  ..初心者(6,805ポイント)   Date: 2007/03/24(土) 11:37   No:6049     
Title: Re:ファイルの読み書き!!    
> ランダムアクセスのfseek(fp,0,SEEK_SET);は先頭から0バイト目を読み込むというものですよね?そしてfread
> (&buf,10,1,fp)で10バイト分を1回読み込むということじゃないですか。すると私の場合、123と出てきてします
> のですが、これでいいのでしょうか?文字は1バイトだから123abc1045とでると思うのですが。。

最初の書き込み部分でNOを10バイト書き込んでいるからです。

だから頭から10バイトがNOでそこから20バイトが文字という感じです。10バイトの部分は書き込んだデータと残りがあり読み込んだときに正常な部分しか表示されないため123と表示されます。
だから、123abc1045と表示されたらその方が異常です。

31 31 34 00 CC CC CC CC CC CC

こんなかんじでNOが10バイト分書き込まれています。そして 31 31 34 の部分が123をあらわして 00 が終端を表しているのでここまでしか表示されません。


195ポイント を手に入れた。

Name: み〜  ..プログラマー(28,548ポイント)   Date: 2007/03/24(土) 12:01   No:6051     
Title: Re:ファイルの読み書き!!    
miyazaさん解説ありがとうございます。

20ポイント を手に入れた。

Name: 組木紙織  ..初心者(7,945ポイント)   Date: 2007/03/24(土) 13:38   No:6053     
Title: Re:ファイルの読み書き!!    
バイナリーで読み込んでを16進数で表示するプログラムです。
参考までにどうぞ。


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

int main(int argc, char *argv[])
{
FILE *fp, *fp2;
unsigned char ch ,out[2];
int num;
if(argc != 2){
printf("error! program end ");
return EXIT_SUCCESS;
}
fp = fopen(argv[1],"rb");
if(fp == NULL){
printf("Don't open file\n");
return EXIT_SUCCESS;
}else{
printf("file open\n");
}

//処理の中心
while(!feof(fp)){
for(num =0;num<0xf;num++){
fread(&ch ,sizeof(ch) ,1, fp);
if(feof(fp)) break;
printf("%2x ",ch);
}
printf("\n");
}
fclose(fp);
return EXIT_SUCCESS;
}


256ポイント を手に入れた。

Name: miyaza  ..初心者(6,695ポイント)   Date: 2007/03/24(土) 16:47   No:6055     
Title: Re:ファイルの読み書き!!    
> 31 31 34 00 CC CC CC CC CC CC
>こんな感じでNOが10バイト分書き込まれています。そして 31 31 34 の部分が123をあらわして 00 が終端を表してい>るのでここまでしか表示されません。

間違えました

訂正

31 32 33 00 CC CC CC CC CC CC
こんな感じでNOが10バイト分書き込まれています。そして 31 32 33 の部分が123をあらわして 00 が終端を表しているのでここまでしか表示されません。


110ポイント を落としてしまった。

Name: み〜  ..プログラマー(28,910ポイント)   Date: 2007/03/24(土) 16:53   No:6056     
Title: Re:ファイルの読み書き!!    
組木紙織さんありがとうございます。


//書き込みコード
#include <stdio.h>
#define NUM 3

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
char point[NUM][10];
char buf[NUM][256];
int i;
fp = fopen("student.txt","w");
if(fp == NULL) {
return 1;
}
printf("FILE OPEN\n");

for(i = 0; i < NUM; i++) {
printf("%d人目",i + 1);
printf("NO>>>");
scanf("%s",buf);
fprintf(fp,"NO>>>%s\n",buf);
printf("NAME>>>");
scanf("%s",buf);
fprintf(fp,"NAME>>>%s\n",buf);
printf("POINT>>>");
scanf("%s",buf);
fprintf(fp,"POINT>>>%s\n",buf);
}
printf("書き込み終了\n");

fclose(fp);
return 0;
}

ファイルにコンソールから入力させる方法ってscanf(),fgets()以外になにかありませんかね??
getschar()だと結構面倒だけど実際は使われてるもんなのでしょうか?私のコードでgetschar()で入力
させていくとしたらどうですかね?すごく面倒なことになりそうなんですけど・・・・。


362ポイント を手に入れた。

Name: miyaza  ..初心者(6,713ポイント)   Date: 2007/03/24(土) 17:08   No:6057     
Title: Re:ファイルの読み書き!!    
getcahr()を使うのであれば、while()で改行文字が入力されるまで、ループさせるような感じでいいと思います。

18ポイント を手に入れた。

Name: み〜  ..プログラマー(29,022ポイント)   Date: 2007/03/24(土) 17:18   No:6058     
Title: Re:ファイルの読み書き!!    
>getcahr()を使うのであれば、while()で改行文字が入力されるまで、ループさせるような感じでいいと思います。


でも私のコードだとかなり面倒ですよね?一人一人のデータをforでループさせて、さらにwhileでもループさせせるわけですよね??


112ポイント を手に入れた。

Name: miyaza  ..初心者(6,750ポイント)   Date: 2007/03/24(土) 17:22   No:6059     
Title: Re:ファイルの読み書き!!    
> でも私のコードだとかなり面倒ですよね?一人一人のデータをforでループさせて、さらにwhileでもループさせせる> わけですよね??
そうですね。
しかしgetchar()は一文字しか読み取れないのでループ文で読み込むしかないと思います。




37ポイント を手に入れた。

Name: み〜  ..プログラマー(29,062ポイント)   Date: 2007/03/24(土) 17:26   No:6061     
Title: Re:ファイルの読み書き!!    
すると、わざわざgetcharなんて使わなくてもいいですよね?

getcharを使う場合ってどういう場合なのですか?一文字だけって・・・。


40ポイント を手に入れた。

Name: miyaza  ..初心者(6,796ポイント)   Date: 2007/03/24(土) 20:02   No:6065     
Title: Re:ファイルの読み書き!!    
一文字だけ入力したいとき。
入力処理をより厳密にしたいときなどに使えると思います。

一文字だけというのをいかした使い方をすればいいと思います。


46ポイント を手に入れた。

Name: み〜  ..プログラマー(29,088ポイント)   Date: 2007/03/25(日) 08:18   No:6072     
Title: Re:ファイルの読み書き!!    
miyazaさんへ
いつもいつも分かりやすい解説ありがとうございます!!


26ポイント を手に入れた。



Name: 風鈴  ..ぴよぴよ(171ポイント)   Date: 2007/03/21(水) 22:13   No:5998       
Title: C言語〜ゲームプログラミングの館〜#0の19について    
19. キャラををキー入力によって移動させる。にて

int image[24],x=640/2,y=480/2; //分割して保存するためのimage,描画する座標を示すx,y

とありますが、

int image[24],x=320,y=240; //分割して保存するためのimage,描画する座標を示すx,y

上下の二つではどのような違いがあるのでしょうか。


171ポイント を手に入れた。


Name: バグ  ..プログラマー(33,257ポイント)   Date: 2007/03/21(水) 22:17   No:5999     
Title: Re:C言語〜ゲームプログラミングの館〜#0の19について    
同じです。

DxLibで作られるウインドウが640×480の広さである事を分かりやすくしただけだと思います。

ああいった書き方をする事で、変数の意味が分かりやすくなりますよね?(^-^)


58ポイント を手に入れた。

Name: 風鈴  ..ぴよぴよ(194ポイント)   Date: 2007/03/21(水) 22:21   No:6000 解決!     
Title: Re:C言語〜ゲームプログラミングの館〜#0の19について    
なるほど、そういった配慮までされていたのですね。
ありがとうございます、助かりました。


23ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(241,265ポイント)   Date: 2007/03/21(水) 22:53   No:6002     
Title: Re:C言語〜ゲームプログラミングの館〜#0の19について    
はい、バグさんのおっしゃるとおりです^^
人の書いたプログラムってただでさえ読みにくいので、何とかわかりやすく伝えようと色々と工夫しているつもりです^^;
「ここがよくわからない!」
「ここをもうちょっと改善してほしい!」
ってとこあればいつでも教えてください☆


2倍のポイントを手に入れた! 216ポイント を手に入れた。

Name: 風鈴  ..ぴよぴよ(121ポイント)   Date: 2007/03/22(木) 19:57   No:6015     
Title: C言語〜ゲームプログラミングの館〜#0,32    
度々質問すいません。

32. 乱数の初期化の仕方のサンプル分をそのまま、コピー&ペーストをしたところ何も表示されなかったのですが
何か問題でもあるのでしょうか。

31.のランダムな数の作り方はなんの問題なく、「実行結果」のように動作します。



73ポイント を落としてしまった。

Name: 管理人 [URL]  ..ハッカー(242,315ポイント)   Date: 2007/03/23(金) 02:08   No:6021     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
32節のプログラムがうまく実行できないと言うことでお調べしたのですが、
こちらの環境では正常に表示されます。
お使いのPCのスペックが低い場合、表示までに時間がかかる場合がありますので、
念のため1分位そのままじっくり待ってみてください。
それでも表示されない場合また聞いてください。


4ポイント を手に入れた。

Name: 風鈴  ..ぴよぴよ(224ポイント)   Date: 2007/03/23(金) 18:29   No:6033     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
起動し、何分か置いたのですが表示されませんでした。
一応,31節,33節も試しにやってみたところ、そちらは無事実行できました。

DXライブラリ BorlandC++用(Ver2.22f)を使用しています。
OS]Windows 2000 professional
DirectX]9.0c

です。


103ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,381ポイント)   Date: 2007/03/24(土) 02:43   No:6044     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
printfDx関数が使用できないように感じられます。
他の関数は使用できるのに何故でしょうね。
一度このソースをコンパイルしてもらえないでしょうか。


#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;

printfDx("DXライブラリ入門");

WaitKey();
DxLib_End();
return 0;
}


242ポイント を手に入れた。

Name: 風鈴  ..ぴよぴよ(296ポイント)   Date: 2007/03/24(土) 15:49   No:6054     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
わざわざありがとうございます。
やってみたところ、やはり真っ黒な画面のままでした。

この場合、開発元に質問したほうがいいのでしょうか。


72ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,418ポイント)   Date: 2007/03/24(土) 17:59   No:6062     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
ハイ、そのほうがいいと思います。
DXライブラリ製作者様が同じような質問掲示板をたてていらっしゃいますので
聞いてみてください。
http://hpcgi2.nifty.com/natupaji/aska.cgi


37ポイント を手に入れた。

Name: 風鈴  ..ぴよぴよ(314ポイント)   Date: 2007/03/24(土) 21:47   No:6066 解決!     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
ありがとうございました、色々試行錯誤してみようと思います。

18ポイント を手に入れた。

Name: 風鈴  ..ぴよぴよ(330ポイント)   Date: 2007/03/24(土) 22:16   No:6067     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
えっとですね、質問してみたところ早速答えが返ってきたのですが
ScreenFlip 関数を使っていないためということがわかりました。
使用してみたところ、サンプルプログラムも上記のプログラムも無事実行されました。

一応、報告です。


16ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,469ポイント)   Date: 2007/03/25(日) 01:03   No:6068     
Title: Re:C言語〜ゲームプログラミングの館〜#0,32    
確かにリファレンスにはそう書いてあるのですが、私の環境では何故か表示されるので、
そう書いてきました。。。
やはり通常の環境では表示されないんですね。
HPの記載直しておきます。
ありがとうございました。


51ポイント を手に入れた。



Name: ぴよぴよ  ..ぴよぴよ(428ポイント)   Date: 2007/03/23(金) 19:20   No:6034       
Title: シューティングゲームの館#6について    
はじめまして。
「シューティングゲームの館」を参考にプログラムを組み始めた初心者です。
[BorlandC++ Compiler 5.5],[BCC Developer]の環境のもとで進めてきました。

シューティングゲームの館6節の「プログラム分割」(http://dixq.net/s/6.html)について、
[img_sound_load.cpp/initial.cpp/background.cpp/player.cpp/fps.cpp/main.cpp/GlobalVariable.h/ExternGV.h]
の各ファイルを作成し、メイクを実行したのですが、

Error: 外部シンボル '_img_sound_load' が未解決
Error: 外部シンボル '_initialization' が未解決
Error: 外部シンボル '_SetColor' が未解決
Error: 外部シンボル '_Background' が未解決
Error: 外部シンボル '_PlayerControl' が未解決
Error: 外部シンボル '_Background2' が未解決
Error: 外部シンボル '_FpsTimeFanction' が未解決

というエラーが発生し、失敗してしまいます。
とても初歩的な質問ですが、どうか解決法のアドバイスをよろしくお願い致しますm(_ _;)m

最後に、過去ログの検索は行いましたが、万一既出でしたら申し訳ありません。


428ポイント を手に入れた。


Name: むつ  ..初心者(7,682ポイント)   Date: 2007/03/23(金) 22:39   No:6037     
Title: Re:シューティングゲームの館#6について    
当方のBCC Developer 1.2.21上で、BCC用DXライブラリを使うと警告が多くでます。
恐らく何らかの設定が必要なのでしょう。(デフォルトでは警告を出さない様ですし)
DXライブラリ作者は、VC++上で開発しているのではないかと思いますので、
VC++を開発環境とされるといいかもしれません。

・Visual C++ 2005 Express Edition 日本語版
 http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
・最新のVC++用のDXライブラリ
をダウンロードして、VC++上でコンパイルしてはいかがでしょう。

 当方の環境VC++ 6.0では、
単純にプロジェクト作成し、各ファイル追加の後、
画像ファイル群をフォルダにコピーするだけで、
エラー・警告ともに無く正常にコンパイルできました。


276ポイント を手に入れた。

Name: ぴよぴよ  ..ぴよぴよ(505ポイント)   Date: 2007/03/24(土) 00:23   No:6040 解決!     
Title: Re:シューティングゲームの館#6について    
>むつ様
この度は明快丁寧な回答をありがとうございます。
先ほどVC++に変更してコンパイルした所、無事成功しました。

う〜ん(゜゜;
不思議ですが作業が再開できて何よりです。
未熟者ながらも少しずつ理解できるよう努めたいと思います。
本当にありがとうございました(^^


77ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,139ポイント)   Date: 2007/03/24(土) 02:39   No:6043     
Title: Re:シューティングゲームの館#6について    
むつさん、ありがとうございます。

HPにBCCでの実行の仕方も書くべきですね、
今回のご質問を今後生かしたいと思います><


55ポイント を手に入れた。



Name: 管理人 [URL]  ..ハッカー(231,928ポイント)   Date: 2007/03/17(土) 02:07   No:5672       
Title: ゲームソフト完成☆    
作っていたゲームソフトが完成しましたのでお知らせいたします^^

何とか帰省する前に春休みのうちに完成させたいと、1日15時間も16時間もプログラム書いてはパソコンの前で食事して寝て、おきてプログラミング・・
という生活をした結果風邪ひいてしまいました^^;
布団の中からもがきながらでもパソコンをいじくり、何とか完成しました(笑

もうかなりバグチェックはしたつもりなんですが、絶対バグがどこかで出るとは思います^^;
バグがもし出たらご報告お願いします♪

まだ絵的に登録商品のものをまねて作っているので、そこを変更する必要があり、
正式に配布は出来ませんが、
形になったので常連様だけにお渡しします☆
よければ遊んでみてください^^

内容はボンバーマンとほとんど同じです。

操作説明、内容説明は次の投稿をご覧ください。



ダウンロードはこちら


修正版を他トピにアップしました。
「スーパーボムマン」のトピからダウンロードしてください。


275ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(232,928ポイント)   Date: 2007/03/17(土) 02:20   No:5673     
Title: Re:ゲームソフト完成☆    
セーブ・ロード機能はセーブがオートで、ロードはメニューから行えます。
セーブは面をクリアすると自動的に行われるので操作する必要はありません。

操作説明はメニューの「OPTION」から確認できます。
ゲーム中にゲームパッドのSELECTボタンか、キーボードのスペースキーを押すことでも確認できます。
これはゲーム中に操作を促しますので、おぼえる必要はありません。

F12キーで強制終了です。

まだ不安定な部分があると思いますので、かならず大事なデータは全て保存してから、突然止まってしまったとき、そのまま終了してもいいようにしてからゲームをしてください。

このゲームはゲームパッドで遊んでもらうことを想定して作ってあります。
キーボードではかなり操作しにくいです。一応キーボードでもできますが。
特にプレステのコントローラーで遊んでもらうように作ってあります。
プレステのコントローラーをUSB端子につなげるための器具はどこの電気屋さんでも売っていますので、
よければ、そちらも試してみてください。

ボンバーマンは有名なゲームなのでルールの説明は要らないと思いますけど、必要なら聞いてください。
爆弾で敵を倒してゴールを見つけてゴールするというゲームです。


あと、必要環境ですが、それなりに性能のいいパソコンでないと動きません。
計7種類のパソコンで動作させてみましたが、
Celeron1.2Ghz
Pentium4 1.2Ghz
では正常に動きませんでした。
一応ゲームは出来ますが、動作が遅かったり、グラデーショングラフィックするときに極端に処理が遅くなったりしました。
Pentium4 2.56Ghzでは快適に動作しました。
Pentium4 3.2Ghz 3.4Ghzでもかなり快適に動きました。
Core2DuoのハイエンドモデルではPen4 3.4と変わらぬ動作でした。

グラフィックボードはそこまでのスペックは必要ないようです。

スペックが足りないと極端に動作が遅くなります。
ゲーム中にFPSが表示されます。

FPSは60が標準になるように作ってあります。

58〜62 正常
55〜58 若干スペック不足
55以下 スペック不足

こんな感じです。ゲーム中表示されるFPSを確認してください。
また、ゲームしてくださった方、パソコンのスペックと動作状況を報告していただけると助かりますm(_ _)m

では長々とお読みいただきありがとうございました^^
プレイしてくださるかたへ、
一生懸命作りましたので是非最後までプレイしてください(><
ご意見・ご感想お待ちしております☆


1,000ポイント を手に入れた。

Name: チョッピー  ..ぴよぴよ(81ポイント)   Date: 2007/03/17(土) 02:33   No:5674     
Title: Re:ゲームソフト完成☆    
すこしやらせてもらいました
すごい完成度ですね!!感動しました
しかしドット絵がうまいですね
自分絵が下手だからうらやましいです!!


47ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(233,034ポイント)   Date: 2007/03/17(土) 02:44   No:5675     
Title: Re:ゲームソフト完成☆    
チョッピー様、ありがとうございます^^

いつもいい加減に途中で投げてしまっていましたけど、今回はがんばって完成させました^^
これからも拡張していく予定です☆

特にキーボードで文字を入力するとその文字が出てくると思いますが、そこは
将来チャット画面になる予定です♪

なお、絵は本物のゲームを見ながら見ながら書いたものですから私のスキルではありません^^;

プレイ報告ありがとうございました^^


106ポイント を手に入れた。

Name: ぽん太  ..中級者(12,123ポイント)   Date: 2007/03/17(土) 02:54   No:5676     
Title: Re:ゲームソフト完成☆    
お!
ついに完成しましたか!!
ダウンロードさせて頂きますm(__)m
ぼくも夜更かしをして3連続で風邪を引いてしまいました。


41ポイント を落としてしまった。

Name: 管理人 [URL]  ..ハッカー(233,088ポイント)   Date: 2007/03/17(土) 03:20   No:5677     
Title: Re:ゲームソフト完成☆    
完成することのない永遠に拡張していく仕様ではありますが一応形になりました^^
プレイ是非お願いします♪

ぽん太さん無理はだめですよ・・・と人に言える立場じゃないので黙っておきますw


54ポイント を手に入れた。

Name: ナガタ  ..入門者(4,908ポイント)   Date: 2007/03/17(土) 03:26   No:5678     
Title: Re:ゲームソフト完成☆    
さっそくプレイさせていただきました.

市販のゲームみたいですね.

今引越しをしてたんですけど,一度しまったコントローラーとUSBのコネクタを引っ張り出してやってました.
気づいたら熱中してやってましたw

自分のPCはCeleron 1.3GHzでもしっかり動きましたよ.






129ポイント を手に入れた。

Name: ぽん太  ..中級者(12,208ポイント)   Date: 2007/03/17(土) 03:26   No:5679     
Title: Re:ゲームソフト完成☆    
円周率の謎がようやくわかった気がします^^ うひひ

凝ってますねぇ〜

STAGE1をやってみました。ジョイパッドがないため少々苦戦しました。

敵も頭いいですね せっかくブロックを壊しても逃げやがるw

うぅ 苦戦しました・・・。 

じっくり堪能させて頂きます。


85ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(234,070ポイント)   Date: 2007/03/17(土) 03:33   No:5680     
Title: Re:ゲームソフト完成☆    
真夜中なのに皆さんありがとうございます^^

>ナガタさん

お久しぶりです!

>さっそくプレイさせていただきました.
>市販のゲームみたいですね.

プレイしていただき、ありがとうございます〜^^
最初は極限までそっくりに作ろうと思ったんですが、
よく考えたらそっくりにする必要ないじゃん?
と思い、いろいろ独自の要素を付け加えていきました^^
たとえば、本物のボンバーマンは爆弾すり抜けとキックって併用できないじゃないですか
だけどキックボタンを実装することで併用が可能になります。
ステージが進むと出てくる「あの要素」は私独自の考えですし、
いろいろ考えてこれからも拡張していきますよ^^

>今引越しをしてたんですけど,一度しまったコントローラーとUSBのコネクタを引っ張り出してやってました.
気づいたら熱中してやってましたw

う、すみません^^;でもうれしいです^^
ちょっとキーボードじゃ難しいですものねぇ><;

>自分のPCはCeleron 1.3GHzでもしっかり動きましたよ.

おぉ、そうですか!
グラデーショングラフィックするときなど処理が重くなりませんでした?
途中で音楽がとぎれるとことかありませんでした?
ノートパソコンのセレロンだったから動かなかったのかな私のは^^;


2倍のポイントを手に入れた! 982ポイント を手に入れた。

Name: ナガタ  ..初心者(5,016ポイント)   Date: 2007/03/17(土) 03:39   No:5681     
Title: Re:ゲームソフト完成☆    
自分のPC,ノートですけど,普通に出来ましたよ.
たまに内部で何かの処理をしてるっぽい時にFPSが下がるときがあったんですけど,
それ以外は全然できますよ.

あと,自分のコントローラだと,ボタンの配置が違うものがありました.
キックがXボタン,無敵解除がL2,キックをとめるのがL2でした


108ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(234,663ポイント)   Date: 2007/03/17(土) 03:39   No:5682     
Title: Re:ゲームソフト完成☆    
>ぽん太さん

>円周率の謎がようやくわかった気がします^^ うひひ

うひひw
そうです、オープニングのあの円を描く計算をするときに円周率が必要だったんですw
いや〜ぽん太さんに教えてもらえなかったら出来ませんでしたよ^^
スタッフロールにぽん太さんの名前が必要でしたね!(笑

>凝ってますねぇ〜

「素人の作ったゲームのチャチさ」をどこまでぬぐい取れるだろうかとその点をがんばりました。
なのでオープニングだけでもあれ作るのにたった5〜6秒のために10時間位かかっています・・・。
グラデーション画像も表示方法も全部手作りなので。
出来たときは「できた〜!・・・でもこんな一瞬?;」みたいなかんじでしたよw


>STAGE1をやってみました。ジョイパッドがないため少々苦戦しました。
>敵も頭いいですね せっかくブロックを壊しても逃げやがるw

キーボード操作は難しいですよね><;
ジョイパッド前提なので、かなりユーザー中なかせな設定です^^;
最後のほうにでてくる敵はなかなか賢く作りましたよ^^
単純に追ってくるだけじゃなく、こっちじゃだめだと思ったらある程度道を変更する機能をつけています☆
ですので単純に毎回同じ方法で近づいてきたりしません^^

>じっくり堪能させて頂きます。
またのご報告お待ちしています〜^^


593ポイント を手に入れた。

Name: ナガタ  ..初心者(5,037ポイント)   Date: 2007/03/17(土) 03:40   No:5683     
Title: Re:ゲームソフト完成☆    
間違えました.キックをとめるのがL1です

21ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(234,769ポイント)   Date: 2007/03/17(土) 03:42   No:5684     
Title: Re:ゲームソフト完成☆    
>自分のPC,ノートですけど,普通に出来ましたよ.

あ、そうですか?
私のノートには何か処理が重くなるようなものがはいっているのかな^^;
わかりました。ご報告に感謝します♪

>あと,自分のコントローラだと,ボタンの配置が違うものがありました.
>キックがXボタン,無敵解除がL2,キックをとめるのがL2でした

あれ、無敵解除とキックをとめるボタンが同じでしたか??
それはまずい><;
しかし確かにジョイパッドによってボタンの配置は違いますし、
キーの割り当てオプション機能は早くつけないといけませんね!


106ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(234,806ポイント)   Date: 2007/03/17(土) 03:43   No:5685     
Title: Re:ゲームソフト完成☆    
なるほど、そういう違いを含めて、注意事項に書いたほうがよさそうですね。
いろいろ試してみます。
ありがとうございます^^


37ポイント を手に入れた。

Name: ぽん太  ..中級者(12,248ポイント)   Date: 2007/03/17(土) 03:52   No:5686     
Title: Re:ゲームソフト完成☆    
スペックは
Pentium M 1.1GHz
256MB
のノートです。
オープニングが若干途切れる部分がありましたが気にはなりませんでした。
FPSもだいだい59.8や59.9で安定していましたがボムマンが爆風をくらった
後に何故かFPSが下がりました。偶然かもしれません。
一瞬でしたが42くらいまで下がりました。
ゲームをプレイすることにおいては全然支障なく楽しむことができました!!


40ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(234,860ポイント)   Date: 2007/03/17(土) 03:57   No:5687     
Title: Re:ゲームソフト完成☆    
ご報告ありがとうございます^^

詳しい情報、参考になります。

Pentium M 1.1だと終盤キツクなってくるかもしれません><;
無事最後までいけばいいのですが!

OS XPですか?


54ポイント を手に入れた。

Name: ぽん太  ..中級者(12,407ポイント)   Date: 2007/03/17(土) 04:11   No:5688     
Title: Re:ゲームソフト完成☆    
はい、XP SP2です。
爆風の後のFPSの低下は気のせいでした。
オープニングのオーロラの輝きなんですが
あれは円を描くものですか??
ぼくのパソコンでは画面下に120°弧を描いて止まって、
しばらくしてREMICAL SOFTと表示されます。
ここからはスムーズにいきました。
少なくともぼくはそう感じました。
PS one のコントローラはあるのですがそれでもできますか?
安かったらUSB端子買ってみようかな^^


159ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(235,128ポイント)   Date: 2007/03/17(土) 04:31   No:5689     
Title: Re:ゲームソフト完成☆    
オープニングは口で説明しにくいですね〜^^;
一度大学かどこかのスペックの高いパソコンでご覧になるとよく分かると思います^^

私はPen M 1.2のノートを持っているのですが、それだと
正常にオープニングが表示されずメニューまでいかずにフリーズしてしまいます。
256メガしかメモリがないのでメモリ不足かもしれませんが。

Celeronのノートの方もきちんと動きません。。
うまくいけばゲームできるんですが、、。

何か駐在ソフトみえないところで動いてるのかな〜><;

Core2Duoのデスクトップだとだいたいロードが2秒、オープニングが4〜5秒位です。
ノートだとロードの30秒位、オープニングに15秒位かかってしまいます;


PSワンのコントローラーってプレステと同じコントローラーですよね?
それなら大丈夫です♪
変換器具は
「ゲームパッドコンバータ」といい
http://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0-ELECOM-JC-PS101USV-USBtoPS%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%91%E3%83%83%E3%83%89%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF/dp/B00008B3NI

こんなやつです^^


268ポイント を手に入れた。

Name: ぽん太  ..中級者(12,490ポイント)   Date: 2007/03/17(土) 04:40   No:5690     
Title: Re:ゲームソフト完成☆    
学校の性能いいやつでWindowsを使ったことがないので
できるかわかりませんが試してみます。

おぉAmazonってこんなものまで売ってやがるんですね。
しかも安いですね。
外に出る機会があったら買いたいと思います。
出不精なものでなかなか外に出る機会が・・・・。
開発本当にお疲れ様でしたm(_ _)m


83ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(235,169ポイント)   Date: 2007/03/17(土) 04:42   No:5691     
Title: Re:ゲームソフト完成☆    
ありがとうございます^^
コンバータはちょっと大きな電気屋さんならどこにでも売ってると思うので是非チェックしてみてください♪


41ポイント を手に入れた。

Name: バグ  ..プログラマー(33,045ポイント)   Date: 2007/03/17(土) 10:49   No:5702     
Title: Re:ゲームソフト完成☆    
うちの場合、古いPCなせいかFPSが15位で安定しています。とりあえず、遊べますけどね(笑)

時々ですが、敵が爆弾をすり抜けて追いかけてくる事があるようです。条件は、こちらが敵の真後ろにピッタリ張り付いて、敵が方向転換する直前位に爆弾を設置すると、何故かすり抜ける事が多いようです。ただ、それも毎回ではないので、条件が別にあるのかもしれませんが(^_^;)

私も、早く新作のColorDropを完成させないとなぁ…。いい刺激になりました(^-^)


138ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(235,394ポイント)   Date: 2007/03/17(土) 12:49   No:5717     
Title: Re:ゲームソフト完成☆    
十五!?

それだと、ありえないくらい遅いんじゃないでしょうか・・^^;

おそらくFPSは15以下だと表示されないように設定していたと思います;

もしもよろしければスペックを教えていただけないでしょうか。参考にしたいので^^

めちゃ古いノートで試してみたところFPSが40以下になるようなPCだとあちこちバグが起きるようです。

しかしそれは明らかにプログラムがおかしくないところでも起きてしまうので

プログラムの問題ではないような気がするんですが、スペックが低いとカウンタ数値をとびとびで計算してしまうなんてあるんでしょうかね・・。

よくわからないです><。

ColorDrop楽しみにしていますよ^^


225ポイント を手に入れた。

Name: ダッシュ  ..中級者(10,648ポイント)   Date: 2007/03/17(土) 14:29   No:5723     
Title: Re:ゲームソフト完成☆    
見せ付けられました。管理人さんの凄さを。

いやー、びっくりしました。オープニングからあれですから、どこか市販のソフトなんじゃないかと思いましたよ。10時間もかかっていたものとは・・・。

はぁ、僕も早く作りたくなっちゃいました。大学入ったら絶対作りますよ!!そのためにはとにかく受験終わらすしかないですね。なんかちょっと方向性が違いますが、いい刺激になりました。

ちなみに僕のスペックは若干不足でした。


203ポイント を手に入れた。

Name: 大工  ..中級者(12,493ポイント)   Date: 2007/03/17(土) 14:53   No:5724     
Title: Re:ゲームソフト完成☆    
お久しぶりです大工です(・ω・)/


ゲームいいっすね(^O^)/
ゲーム作りたいんですけど・・・・

プログラム書くのは好きなんですが・・・・
絵を描くのがめんどくさくて仕方ないです(爆)


2倍のポイントを手に入れた! 180ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(235,564ポイント)   Date: 2007/03/17(土) 16:41   No:5729     
Title: Re:ゲームソフト完成☆    
ダッシュさん、ありがとうございます^^

実はオープニングが一番処理が重いんです^^;
オープニングは普通4秒〜5秒位で終わるはずなんですが、それだとかなり時間がかかってしまったのでは><。
処理を重くすれば複雑そうに見える表示が出来るのは当たり前ですね。
「処理が軽くて見栄えのする」表示の仕方について検討する必要がありそうです。
受験がんばってください^^

大工さん

そうなんですよね・・絵が大変で大変で・・。
普通に書くとプログラム書いてる時間と変わらないくらいの時間絵を描いていたりします。
プログラムを書く人は大抵絵がかけなかったり音楽が作れなかったりします・・。
絵もかけて、音楽も作れて、プログラムがプロ級・・と言う人は東方のZUNさん位なんじゃないでしょうかw


338ポイント を手に入れた。

Name: 管理人  ..ハッカー(235,794ポイント)   Date: 2007/03/17(土) 18:49   No:5735     
Title: Re:ゲームソフト完成☆    
ただ今2つバグが発見されています。

1、キックした時残像が残る。

2、爆弾をけって止めた時、手前1区間が通行できなくなる。

この他最後までゴールが出現しなかった場合、6秒後に左上にゴールを強制ポップさせるという対策がされています。

もしゴールが出てこないような事がありましたら、また、他にバグがありましたら教えてください。


171ポイント を手に入れた。

Name: 太陽  ..ぴよぴよ(112ポイント)   Date: 2007/03/19(月) 15:06   No:5831     
Title: Re:ゲームソフト完成☆    
初めまして!日記を読んでいてこちらにおじゃましました。
作成されたゲームの方やってみました。
すごいですね!
本物と変わらない・・いやそれ以上だと思いました。
こんなすごいゲームがC言語で作れるのかと感動しました。
これからもゲーム作成頑張ってください!


112ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(238,522ポイント)   Date: 2007/03/19(月) 21:16   No:5868     
Title: Re:ゲームソフト完成☆    
太陽さん,プレイしていただきありがとうございます^^
作るには作ってもバグの完全に無いものを作ることはすごく難しいことだと実感しました^^;
あれから色々自分でバグを見つけてみたはいいものの,どこが悪いのか分からず四苦八苦しています;

これからもよろしくお願いします^^


112ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(68,706ポイント)   Date: 2007/03/20(火) 03:08   No:5885     
Title: Re:ゲームソフト完成☆    
 WOW、管理さん、すごいっすね。

 ここまで形になってるとは。
 オブジェクトもよく動いていますし、ステージも実に多彩ですよね。
 グラフィックス面でも加算・減算はもとより、レンダーテクスチャーも使ったりしていて
見栄えも一人で作ったにしては相当なものだと思います。
 この段階で致命的なバグもないというのも素晴らしいことです。
 さらに、概ね 55fps以上で動いていたので(XP PentiumM1.73)、ほぼ快適にプレイできました。


 ただ1点だけ。
 あのスタッフロールだけはちょっと・・・(w



>ステージが進むと出てくる「あの要素」
 あれですね。
 ラストステージの?
 あれには苦しめられました(w



 あとはバグ(らしきもの?)報告です。

・ ステージ選択で FINALSTAGEを選択したら敵がいないステージ19が始まる。
・ FINALSTAGEでクリア後、出口が2つ(左上とボスのいたところ)あることがある。
・ FINALSTAGEで死ぬと画面を暗くしているエフェクトが取れる。


57ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(239,589ポイント)   Date: 2007/03/20(火) 07:32   No:5888     
Title: Re:ゲームソフト完成☆    
おぉ、さっそく全部プレイしていただき、バグまで見つけてくださるとは^^w

ちなみに、教えていただいたバグのうち、真ん中のものだけがバグです。

本物のボンバーマンもそうですが、FINALステージはFINALステージであることを意識させるために連続ではプレイできなくなっています。
しかしSTAGE19を毎回しなくてはならないのはだるいので、敵がいないところからスタートするようにしました。
FINALステージは19をクリアしたときに同じ空間に現れる何か特別なものであるように感じさせるためにFINALでゲームオーバーになった瞬間19に戻ってしまうように演出しましたが
演出しきれてないのでバグのようになってしまいましたw

出口が2つ出てしまうのは、修正版をアップロードしてしまったために新しく出てきたバグです。
このバグはその日のうちにすぐに修正したのですが、実はキックしたとき、残像が残るバグや、
体力現象にたまにバグが出るなど、他のバグも一緒に直してからアップしようとして
現在に至っていますのでまだアップ出来ていません。
キックをするとごくまれにとめた爆弾の手前または先が見えない通行付加エリアになってしまうバグもありました。
ちょっと原因がわからず現在ひたすらコードを追っています。

>この段階で致命的なバグもないというのも素晴らしいことです

ありがとうございます。ホンとはたくさんあったんですよw
かれこれ40回以上全クリするほどプレイしました。
何度も何度もプレイしてバグを見つけていきました。
それでも発見しきれないバグがあるもので、完全な形でリリースすることは難しいなと実感しました。


スタッフロールは半分受け狙い的なところもありますw
最初ははじめの部分しかなかったんですが、あの曲が好きで、全部きいてほしかったんです。
FF10のエンディングを見ながらスタッフの名前を書きましたw


PentiumM1.73だとオープニングがかなり遅かったりFINALに入るときに最初の部分でとまったり
したでしょう^^;
私のノートがほとんど同じスペックなんですが、いちいちコンパイル実行にとても時間がかかって大変でしたw


以前から知っていただいているJustyさんにはぜひともプレイしていただきたかったんですよ^^
本当は目に見えるバグの無い修正版があったのに古いバージョンしかアップしてなくて残念です。
私からみたら神の領域にいらっしゃるJustyさんからこのような言葉をもらえて光栄です^^


859ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(239,928ポイント)   Date: 2007/03/20(火) 08:19   No:5891     
Title: Re:ゲームソフト完成☆    
実は単位時間当たりに一番時間をかけたのがオープニング映像なんですよ。
気合の分だけ処理も重くなってしまい、低スペックPCでは最初から重いという悪い印象をつけるものになってしまいました^^;
アルファブレンドするだけでこんなにも処理の重さがかわるのかと今回の作製で色々とスペックと処理時間の面でも勉強になりました。

それと案外たくさんの人がPenMやCeleronなどの低スペックパソコンをお使いだということもわかりました^^;
どれくらいの処理をさせてよいかという基準になりますので、そういう面でも勉強になりました。


56ポイント を手に入れた。

Name: 神魔  ..ぴよぴよ(689ポイント)   Date: 2007/03/20(火) 21:41   No:5923     
Title: Re:ゲームソフト完成☆    
どうも、神魔というものです。
早速プレイさせていただきましたが普通のゲームと変わらなくてびっくりしました。
僕もここまで完成度の高いゲームは作れないにしろ、このゲームを目標にして作っていきたいです。

現在キーボードでプレイしているため操作しにくくまだラスボスを倒せていません。
雑魚キャラがたくさん出てくるともうだめです。
今度ゲームパッドコンバータとやらを購入してリベンジしようと思っております。


104ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(240,711ポイント)   Date: 2007/03/20(火) 23:15   No:5926     
Title: Re:ゲームソフト完成☆    
>神魔さん,

プレイ報告ありがとうございます^^
ゲームパッドコンバータについて,今日立てた他トピで説明しておりますのでよければ参考にしてください☆
FINAL STAGEまでプレイしてくださったようで,ありがとうございます。
是非ともラスボスを倒してくださいまし☆

>僕もここまで完成度の高いゲームは作れないにしろ

いえいえ,別に特別な事はなにもしてないですよ^^
単純な基本構文をだらだらならべただけで出来ています。
なので,これ位のゲームすぐにお作りいただけると思います,頑張ってください☆


197ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(69,088ポイント)   Date: 2007/03/21(水) 02:14   No:5927     
Title: Re:ゲームソフト完成☆    
>FINALステージは19をクリアしたときに同じ空間に現れる何か特別なものであるように感じさせるため
 なるほど、そうでしたか。


>最初ははじめの部分しかなかったんですが、あの曲が好きで、全部きいてほしかったんです。
 ふむふむ。


>PentiumM1.73だとオープニングがかなり遅かったり
 んー、特にそういう感じはなかったです。
 音と演出は一致してました。


>FINALに入るときに最初の部分でとまったり
 このスレにあるバージョンではあまり気になりませんでした。


>以前から知っていただいているJustyさんにはぜひともプレイしていただきたかったんですよ^^
 ありがとうございます。


> 実は単位時間当たりに一番時間をかけたのがオープニング映像なんですよ。
 かかってそうですね。
 こういうのは汎用エフェクトシステムとしてツール化してしまうと
楽そうですが・・・・。



 では早速新しいバージョンでも試してみます。


382ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(241,049ポイント)   Date: 2007/03/21(水) 20:11   No:5994     
Title: Re:ゲームソフト完成☆    
>こういうのは汎用エフェクトシステムとしてツール化してしまうと

確かにそうですね〜。
私がゲームを作るときは毎回1から作ってシステム化しないので手間がかかってしかたありません^^;
1度作ったものはシステム化して今後使えるようにしていくことも大事ですね^^b

>このスレにあるバージョンではあまり気になりませんでした。

そうですか、1.2と1.7では結構違いがあるようですね。
参考になります^^


2倍のポイントを手に入れた! 278ポイント を手に入れた。

Name: ダッシュ  ..中級者(11,616ポイント)   Date: 2007/03/23(金) 16:45   No:6031     
Title: Re:ゲームソフト完成☆    
ぷは〜〜。やっと全クリ。管理人さん!いくらなんでもラス面は鬼畜ですよ〜〜〜。なんか桁違いの難しさです。コントローラー繋ぐの持ってないんでキーボードでやってたんですが、苦労しました。

他に全クリされた方はどちらの方法でプレイされてるんでしょうか?


85ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,055ポイント)   Date: 2007/03/24(土) 02:34   No:6041     
Title: Re:ゲームソフト完成☆    
お〜〜ありがとうございます〜^^
全クリおめでとうございます♪
ってことはスタッフロールまでごらんいただけました??

>いくらなんでもラス面は鬼畜ですよ〜〜〜。

実際5回位ゲームオーバーになってからクリアしていただけるような難易度に設定したつもりですが、
アクションが得意な人不得意な人でかなり分かれると思いますし、
難易度の設定にかなり何度も調整を行いました。
苦労して苦労して・・・

「あ、やった〜!クリアできた!」
と思った瞬間スタッフロールになったほうがなんか感動しません??
そういう感じを出したかったんです^^

私はかれこれ何十回と全クリするほどバグチェックしたので、
1面からラスボスクリアまでノーダメージでいけるようになってしまい、
どれくらいが難しいのか簡単なのかさっぱりわからなくなってしまい、苦労しました^^;
ダッシュさんのPCではラスボスに入るとこのアルファブレンドするときなど
処理が送れて音楽がとまったり映像が遅くなったりしたこともあったでしょう。
それに懲りずに全面クリアするまで遊んでいただけてうれしいです^^

>他に全クリされた方はどちらの方法でプレイされてるんでしょうか?

うちの姉はゲームが得意ではないのですが、コントローラーでやらせると5回目位でラストステージはクリアしていました。
キーボードでは無理のようです。
ですのでコントローラー用とキーボード用の2種類の実行ファイルを作りました。
実際私はキーボードでもコントローラーでもノーダメージで越せてしまいます・・そりゃ誰よりも何度もやったので^^;
作った本人だから敵がどういう動きをするか、どうよけたらいいかも全部知っているので出来て当たり前ですねw
ラスト、ヒントにあった避け方わかりました?
あ、言わなくても結構ですよ^^


566ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(243,084ポイント)   Date: 2007/03/24(土) 02:36   No:6042     
Title: Re:ゲームソフト完成☆    
ちなみにレスは、修正版を配布しているトピ「スーパーボムマン」のトピにお願いします☆

29ポイント を手に入れた。

Name: 管理人 [URL]   Date: 2007/06/22(金) 18:34   No:56721182504896     
Title: Re:ゲームソフト完成☆    
「スーパーボムマンのトピ」はこちらです。
http://www.play21.jp/board/formz.cgi?action=res&resno=5924&page=&lognum=20&id=dixq&rln=6283&vino=28




Name: グー  ..ぴよぴよ(242ポイント)   Date: 2007/03/21(水) 09:14   No:5928       
Title: ファイルについて    
このプログラムなんですけど、警告、エラーが出まくり。なんで?
ヘッダーとかも別に間違っていないと思うけど・・・・。
なんでだろ?


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

int main(void) {

int i;
int sum;
int val;
double avg;
sum = 0;
avg = 0;
FILE *fp;
if(fp = fopen("test.txt","r") == NULL) {
printf("file open erroe\n");
return 1;
}
printf("file open\n");

for(i= 0; "" ; i++) {
fscanf(fp, "%d\n",&val);
if(val == 0) {
break;
}
sum = sum + val;
}
}
avg = sum / i;

printf("合計>>%d,平均>>%d",sum,avg);

fclose(fp);
return 0;
}


242ポイント を手に入れた。


Name: 組木紙織  ..初心者(5,983ポイント)   Date: 2007/03/21(水) 09:26   No:5929     
Title: Re:ファイルについて    
気になる部分だけコメント入れてあります。
修正はしていないですが、修正すればコンパイルできると思います。

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

int main(void) {

int i;
int sum;
int val;
double avg;
sum = 0;
avg = 0;
/*宣言位置が違う、先頭で定義していない。*/
FILE *fp;
/*優先順位の問題により先に[==]を考えている*/
if(fp = fopen("test.txt","r") == NULL) {
printf("file open erroe\n");
return 1;
}
printf("file open\n");

for(i= 0; "" ; i++) {
fscanf(fp, "%d\n",&val);
if(val == 0) {
break;
}
sum = sum + val;
}
/*括弧が一つ多い*/
}
avg = sum / i;

printf("合計>>%d,平均>>%d",sum,avg);

fclose(fp);
return 0;
}


241ポイント を手に入れた。

Name: グー  ..ぴよぴよ(874ポイント)   Date: 2007/03/21(水) 09:41   No:5930     
Title: Re:ファイルについて    

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

int main(void) {
FILE *fp;

int i;
int sum;
int val;
double avg;
sum = 0;
avg = 0;

fp = fopen("test.txt","r");
if(fp == NULL) {
printf("file open erroe\n");
return 1;
}
printf("file open\n");

for(i= 0; ; i++) {
fscanf(fp, "%d\n",&val);
if(val == 0) {
break;
}
sum = sum + val;
}

avg = sum / i;

printf("合計>>%d,平均>>%d",sum,avg);

fclose(fp);
return 0;
}

こんな感じにしました。確かにコンパイルはできたのですが、avgに代入した値は使われていないとかで警告
が一つでました。そのまま実行したら、file openとだけでて動かなくなってしまいました。


2倍のポイントを手に入れた! 632ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,110ポイント)   Date: 2007/03/21(水) 09:49   No:5931     
Title: Re:ファイルについて    
まず[test.txt]の中身が気になります。最後が0で終わっていますか?

avgは最初に0で初期化してありますが、0で初期化する必要はこの場合ありませんよね?
コンパイラ0で初期化して、その値を使っていないということを警告しています。

最後にforの部分は無限ループとなるので[for(;;)]とするのが一般的だと思います。
その場合には[i]の宣言は必要なくなります。

これらの点に気をつけてみてください。


127ポイント を手に入れた。

Name: グー  ..かけだし(1,028ポイント)   Date: 2007/03/21(水) 09:54   No:5932     
Title: Re:ファイルについて    
一応成功しました。test.txtの中身は
150
164
153
174
189
185
168
156
152
174
173
169
です。
for()の中の条件式をi < 12としたらできました。でも一々条件式かいていたら面倒ですね。


2倍のポイントを手に入れた! 154ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,171ポイント)   Date: 2007/03/21(水) 09:56   No:5933     
Title: Re:ファイルについて    
すみません
訂正です。
[i]はループ以外の部分でも使っていました。
この場合は単純に無限ループだけに使っているわけではないので、問題ないです。
すみませんでした。


61ポイント を手に入れた。

Name: グー  ..かけだし(1,081ポイント)   Date: 2007/03/21(水) 10:01   No:5934     
Title: Re:ファイルについて    
いえいえい。アドバイスありがとうございます。
ところで、for(;;)というのはどういうことなのでしょう?確かに私のテキストにもfor()文は条件式がありませんでした。


53ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,261ポイント)   Date: 2007/03/21(水) 10:02   No:5935     
Title: Re:ファイルについて    
面倒でないようにするためには
1:テキストファイルの最後を0にする。
2:ファイルの終わりを確認する手段を入れる。
3:テキストファイルの先頭に要素の数を入れて、ループをその回数だけまわす。

といった手段があります。


90ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,383ポイント)   Date: 2007/03/21(水) 10:11   No:5936     
Title: Re:ファイルについて    
簡単に説明すると、永久に続くループを作る手段の方法のひとつとでも覚えてください。
while(1){}も同じような効果があります。


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

int main(void) {

int i=0;

/*
永久にループが続くので
Ctrl + Cなどで止めてください
*/
for(;;){
printf("%d\n",i);
}
return 0;
}


122ポイント を手に入れた。

Name: グー  ..かけだし(1,405ポイント)   Date: 2007/03/21(水) 10:13   No:5937     
Title: Re:ファイルについて    
私の持っているテキストでは、こんなコードになっています。
while(fscanf(fp, "%d",&val) != EOF)の部分がよく分からないですね。
あと、cntが、未定義のシンボルとでてしまいます。なぜでしょう?

#include <stdio.h>

int main(void) {
FILE *fp;
int val;
int sum;
int cnt;

if((fp = fopen("test.txt","r")) == NULL) {
return 1;
}
printf("oprn\n");

cnt = 0;
while(fscanf(fp, "%d",&val) != EOF) {
sum = sum + val;
cont++;
}

if(cnt > 0) {
printf("合計>>%d,平均>>%d",sum,sum/cnt);
}
fclose(fp);
return 0;
}


2倍のポイントを手に入れた! 324ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,499ポイント)   Date: 2007/03/21(水) 10:21   No:5938     
Title: Re:ファイルについて    
EOFはEnd OF Fileの略です。
ファイルの最後を示すものと考えてください。
>while(fscanf(fp, "%d",&val) != EOF) {
この部分でファイルが終わるまでループをまわし続けるという意味になります。

cntとcontありますが、タイプミスですか?


116ポイント を手に入れた。

Name: グー  ..かけだし(1,456ポイント)   Date: 2007/03/21(水) 10:23   No:5939     
Title: Re:ファイルについて    
タイプミスです。

あと、scanfとsscanfがかいてあるのですが、どの様に違うのでしょう?sscanfを使うメリットとはなにか
あるのでしょか?


51ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,564ポイント)   Date: 2007/03/21(水) 10:42   No:5940     
Title: Re:ファイルについて    
簡単に言うと
scanf()はコンソール入力から、sscanf()は文字列から入力元()を取るという違いがあります。

簡単に使い方を示しておきます。

#include <stdio.h>

int main(void) {
char string[] = "125 a";
int num;
char ch;

sscanf(string, "%d %c",&num, &ch);

printf("%d %c\n",num, ch);

return 0;
}


メリットは
scanf()はある一定の条件においてはプログラムが正しくない動きをすることがあり、
それを防ぐためにsscanf()を使うことが多いです。

というような感じです。
このことに関しては色々な場所で議論されているので調べてみたらどうでしょうか?


65ポイント を手に入れた。

Name: グー  ..かけだし(1,713ポイント)   Date: 2007/03/21(水) 10:46   No:5941     
Title: Re:ファイルについて    

#include <stdio.h>

int main(void) {
FILE *fp;
int val;
int sum;
int cnt;
char buff[100];

if((fp = fopen("test.txt","r")) == NULL) {
return 1;
}
printf("oprn\n");

cnt = 0;
while(fgets(buff,buff[100],fp)) {
sscanf(buff,"%d",&val);
sum = sum + val;
cnt++;
}

if(cnt > 0) {
printf("合計>>%d,平均>>%d",sum,sum/cnt);
}
fclose(fp);
return 0;
}


これだと、コンパイルはできるのですが実行できないです。なぜか、ループ処理の中の条件式を
書かないと私のは動きませんね。やっぱりVisual stadioとか入れるべきなのかな?

後、fgets()ってファイルの読み込みとなっていますが、書き込みもできますよね?
fgets(第一引数、第二引数、stdin)として、fprintf()をつかってやれば?


257ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,693ポイント)   Date: 2007/03/21(水) 11:29   No:5942     
Title: Re:ファイルについて    
私自身はVisual stadioは重いのであまり好きではないのですが、確かにあったほうが便利な部分は多いです。

本題に入りますが、
fget()の引数と、戻り値は何であるか知っていますか?
この場合はコンパイルが出来ても動作は正しく動かないです。

char *fgets(char *文字列, int 数値, FILE *ストリーム)
となっています。
今気をつけるのは二番目の引数の数値の部分と戻り値の部分です。
二番目の引数の意味は文字列に読み込む文字数を与えないといけないです。
上のプログラムでは文字列の100番目の部分にある部分を数値で読み取った場合の値となるので
通常は読み込む文字数をそのまま入れればよいでしょう。

戻り値ですが、この戻り値は文字列へのポインタを返しますので、whileの条件判断の部分に
入れるのは不適当だと思います。


fgets(buff,99,fp);
で入力して、
として終わりの判断はfeof()関数を使ってあげればよいかと思います。

fgets()だけでは書き込みは不可能です。
この関数は文字列の読み込みに使うだけなので、書き込むためには読み込んだ文字列を
別の関数を使って書き込みしないといけなくなります。

その意味ではfget(,,stdin)でコンソールから読み取った文字列をfprintf()でファイルに書き込むことはできますが。


129ポイント を手に入れた。

Name: グー  ..かけだし(1,747ポイント)   Date: 2007/03/21(水) 12:21   No:5943     
Title: Re:ファイルについて    
組木紙織さん詳しい解説ありがとうございます。

なんか訳わからなくなってきてしまいました。私の持っているテキストって・・・一体・・。


34ポイント を手に入れた。

Name: グー  ..かけだし(2,103ポイント)   Date: 2007/03/21(水) 12:39   No:5944     
Title: Re:ファイルについて    
ちょっと混乱したので基礎にもどります。

#include <stdio.h>

int main(void) {
FILE *fp;
int i;
int val;
int sum;

fp = fopen("test.txt","r");
if(fp == NULL) {
return 0;
}
printf("OPEN!!\n");

i = 0;
sum = 0;
while(fscanf(fp,"%d",&val) != EOF ){
sum = sum + val;
i++;
}

printf("合計:%d,平均:%d",sum,sum/i);

fclose(fp);
return 0;
}

これは成功したコードです。合計、平均がしっかりコンソールに出てきました。テキストファイルの中身は、
10
20
30
40
50
60
70
80
90です。
最初の方にwhile()の中身については教えていただいたので理解できました。
ただ、今度は文字列を読み込んでみようとおもうのですが、fscanf()ではダメですよね?
また、fscanf()だと色々と危険性の問題もあるようなので。
例えば、テキストファイルの中身がABCDEFという文字列だった場合です。文字列の場合はfgets()を使うの
でしょうか??


356ポイント を手に入れた。

Name: グー  ..かけだし(2,151ポイント)   Date: 2007/03/21(水) 13:04   No:5945     
Title: Re:ファイルについて    
文字列の読み込みに成功しました。ファイルにはabcdefgと書いておき読み込んだものです。コードは↓
</pre>
#include <stdio.h>

int main(void) {
FILE *fp;
int i;
char ch[20];

fp = fopen("test1.txt","r");
if(fp == NULL) {
return 1;
}
printf("OPEN!!\n");


for(i = 0; i < 8; i++){
fgets(&ch[i],20,fp);
}

/*
while(fgets(&ch[i],20,fp) != EOF){
i++;
}
*/
     printf("%s",ch);
fclose(fp);
retrun 0;
}
</pre>
for(i = 0; i < 8; i++)のところの条件式なのですが、今は読み込む数が少ないので数えれば分かるのですが、
数え切れないような量を読み込むときはどうしたらいいのでしょう?

また、最初はwhile()文(コメント部分)でやったのですが、コンパイルすらできませんでした。
0を検出するとか色々書いてあったのですが、よく分からなかったですね・・。ただwhile()の方が、
EOFとか使っているので、色々とトラブルは未然に防げるみたいですけど、なかなか理解できないです。




48ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,519ポイント)   Date: 2007/03/21(水) 13:12   No:5946     
Title: Re:ファイルについて    
文字列を入れる配列の大きさを十分大きくすればfscanf()でも問題はないです。
ABCDEFの文字列だと要素が7以上あれば問題はないです。(何で7以上か分かりますか?)
また引数の部分を"%s"ではなく"%6s"として取り込む文字数を指定することが出来ます。

fget()の場合は、取り込む文字数を指定しているので配列のサイズを取り込む文字数以上にしておけば
問題はないです。


文字列の場合fscanf()もfget()も取り込む文字数と配列のサイズとの兼ね合いを気をつけておけば
問題はないと思います。


174ポイント を落としてしまった。

Name: グー  ..かけだし(2,235ポイント)   Date: 2007/03/21(水) 13:24   No:5947     
Title: Re:ファイルについて    
>>ABCDEFの文字列だと要素が7以上あれば問題はないです。(何で7以上か分かりますか?)
 char型は1バイトでabcdefで6バイト、それで最後の\0も必要だからですか?

後、私が書いたコードのfor()の条件式なのですが、i<1としてもしっかりと読み取れます。これはどういうことでしょう?

 


84ポイント を手に入れた。

Name: 組木紙織  ..初心者(6,837ポイント)   Date: 2007/03/21(水) 13:41   No:5948     
Title: Re:ファイルについて    
>char型は1バイトでabcdefで6バイト、それで最後の\0も必要だからですか?
そうです。文字列を扱うときには最後の\0を意識して扱う必要があります。

>後、私が書いたコードのfor()の条件式なのですが、i<1としてもしっかりと読み取れます。これはどういうこ>とでしょう?

テキストファイルの中身を

abcdefghijklmnopqrtsuvwxyz
このようにして次のプログラムを実行してみてください。
で考えてみてください。
ポイントはfget()が何処まで文字を読み取るか?と、fget()は何をバッファに入れるか?ということです。

#include <stdio.h>

int main(void) {
FILE *fp;
int i;
char ch[20];

fp = fopen("test1.txt","r");
if(fp == NULL) {
return 1;
}
printf("OPEN!!\n");



fgets(&ch[0],20,fp);
printf("%s\n",ch);
fgets(&ch[1],20,fp);
printf("%s\n",ch);



fclose(fp);
return 0;
}


318ポイント を手に入れた。

Name: box  ..熟練のプログラマー(59,519ポイント)   Date: 2007/03/21(水) 13:46   No:5949     
Title: Re:ファイルについて    

> for(i = 0; i < 8; i++){
> fgets(&ch[i],20,fp);
> }

ここのループの、変数 i の意味と、fgets 関数の第1引数の意味を教えてくださいますか?
ファイルポインタ fp から、最大20バイトを、どこへ格納しようとしているのでしょうか?
ch[i] のアドレスでよいのでしょうか?



79ポイント を手に入れた。

Name: グー  ..かけだし(1,964ポイント)   Date: 2007/03/21(水) 14:01   No:5950     
Title: Re:ファイルについて    

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]
a b c d e f g h i j k l m n o p q r s t u

fgets(&ch[0],20,fp);の第二引数が20だからchar[0]から20個読み取りなさいということでここまで読み込んだ。それで最後に\0が来るから実際に文字を読み込んでいるのは19個。\0もあわせて20個20バイトになる。

fgets(&ch[1],20,fp);はatuvwzとでてきました。よく分からないです。


271ポイント を落としてしまった。

Name: 組木紙織  ..初心者(7,253ポイント)   Date: 2007/03/21(水) 14:08   No:5951     
Title: Re:ファイルについて    
一番のポイントはfget()は文字列を扱うということです。

一度目のfget()で読み込み文字列
abcdefghijklmnopqrs

&ch[0]に代入
  ↓ここから代入
ch[0] ch[1] ch[2] ch[3] ch[4] ch[5] . . .
+++++++++++++++++++++++++++++++++++++++++++++++++
+ + + + + + +
+ a + b + c + d + e + f +
+ + + + + + +
+++++++++++++++++++++++++++++++++++++++++++++++++


二度目のfget()で読み込む文字列
tuvwxyz

&ch[1]に代入
      ↓ここから代入
ch[0] ch[1] ch[2] ch[3] ch[4] ch[5] . . .
+++++++++++++++++++++++++++++++++++++++++++++++++
+ + + + + + +
+ a + t + u + v + w + x +
+ + + + + + +
+++++++++++++++++++++++++++++++++++++++++++++++++


416ポイント を手に入れた。

Name: グー  ..かけだし(1,994ポイント)   Date: 2007/03/21(水) 14:12   No:5952     
Title: Re:ファイルについて    
なるほど〜。
でも、二回目の読み込みのとき aも出てきてしまったのは?


30ポイント を手に入れた。

Name: 組木紙織  ..初心者(7,223ポイント)   Date: 2007/03/21(水) 14:19   No:5953     
Title: Re:ファイルについて    
>printf("%s\n",ch);
は文字列を何処から表示するのでしょうか?
ch[0]? ch[1]?


30ポイント を落としてしまった。

Name: グー  ..かけだし(2,017ポイント)   Date: 2007/03/21(水) 14:25   No:5954     
Title: Re:ファイルについて    
う〜・・・aからですか?
でも、aは二回も表示させてくないですよね。


23ポイント を手に入れた。

Name: 組木紙織  ..初心者(7,262ポイント)   Date: 2007/03/21(水) 14:35   No:5955     
Title: Re:ファイルについて    
そうですね。
通常は上記のような扱い方をしません。
通常は
fget(ch,20,fp);
といったような使い方をします。


39ポイント を手に入れた。

Name: グー  ..かけだし(2,061ポイント)   Date: 2007/03/21(水) 14:43   No:5956     
Title: Re:ファイルについて    
>>通常fget(ch,20,fp); といったような使い方をします

そしたらfor()は意味がないですよね??


44ポイント を手に入れた。

Name: グー  ..かけだし(2,149ポイント)   Date: 2007/03/21(水) 14:46   No:5957     
Title: Re:ファイルについて    
やっぱりなぜaから二回目も出てくるのか分からないです。

>printf("%s\n",ch);
は文字列を何処から表示するのでしょうか?
ch[0]? ch[1]?
がわからないですね?なぜaからなのか。


88ポイント を手に入れた。

Name: 組木紙織  ..初心者(7,310ポイント)   Date: 2007/03/21(水) 14:47   No:5958     
Title: Re:ファイルについて    
はい。そのとおりです。
for()なしで問題のプログラムを実行してみましたか?
問題なく動くと思います。


48ポイント を手に入れた。

Name: 組木紙織  ..初心者(7,392ポイント)   Date: 2007/03/21(水) 14:53   No:5959     
Title: Re:ファイルについて    
printf("%s",ch);


int i=0;
for(;;){
if(ch[i] == '\0')break;
printf("%c",ch[i]);
i++;
}

と考えたら分かると思います。


82ポイント を手に入れた。

Name: グー  ..かけだし(2,138ポイント)   Date: 2007/03/21(水) 14:55   No:5960     
Title: Re:ファイルについて    
for文使わないでもできました。

11ポイント を落としてしまった。

Name: グー  ..かけだし(2,167ポイント)   Date: 2007/03/21(水) 14:58   No:5961     
Title: Re:ファイルについて    
上のコード実行しても何もおきないのですが・・・・。

29ポイント を手に入れた。

Name: グー  ..かけだし(2,204ポイント)   Date: 2007/03/21(水) 15:03   No:5962     
Title: Re:ファイルについて    
コードの実行できました。a〜sまでが二回でてきました。

でも良く分からない。。


37ポイント を手に入れた。

Name: グー  ..かけだし(2,294ポイント)   Date: 2007/03/21(水) 15:06   No:5963     
Title: Re:ファイルについて    
実行したコードはこれです。

#include <stdio.h>

int main(void) {
FILE *fp;
int i;
char ch[20];

fp = fopen("test1.txt","r");
if(fp == NULL) {
return 1;
}
printf("OPEN!!\n");
fgets(ch,20,fp);

i=0;
for(;;){
if(ch[i] == '\0')break;
printf("%c",ch[i]);
i++;
}
printf("%s\n",ch) ;

fclose(fp);
return 0;
}


90ポイント を手に入れた。

Name: 組木紙織  ..初心者(7,682ポイント)   Date: 2007/03/21(水) 15:08   No:5964     
Title: Re:ファイルについて    

上のコードは考え方だけなのでそのままでは実行出来ないはずです。
一通り形にしてみると次のようになります。


#include <stdio.h>

int main(void) {

char ch[] = "abcde";
int i;

/* %sを使った場合*/
printf("%s",ch);

printf("\n");

/*%sを%cとループで代用した場合*/
i=0;
for(;;){
/*ここを注意深くみてください*/
if(ch[i] == '\0')break;
printf("%c",ch[i]);
i++;
}

return 0;
}


2倍のポイントを手に入れた! 290ポイント を手に入れた。

Name: グー  ..かけだし(2,335ポイント)   Date: 2007/03/21(水) 15:30   No:5965     
Title: Re:ファイルについて    
なんとか自分なりに理解できました。

後、気になっていたのですが、数字を読み取る時にEOFを使ったじゃないですか。あれって文字列の時は使わなくていいのですか?


41ポイント を手に入れた。

Name: むつ  ..初心者(6,871ポイント)   Date: 2007/03/21(水) 15:33   No:5966     
Title: Re:ファイルについて    
ファイルから複数行読み取る際には、ファイルの終端(EOF)がわからないといけないですよね。
次のステップは、複数行の読み取りでしょうかね。

※ch[ここに一行分格納できるだけのサイズ]
※fgets( ch, ここのサイズを決定する, fp );

その後、ここをご覧ください。
http://www.bohyoh.com/CandCPP/C/Library/fgets.html

【 改行文字 】を読み取ったとき、
またはファイルの終わりを検出したときに、文字の読取りは終了し、
【 読み取った改行文字 】も配列に格納する。

このように、chへ取り込まれた改行をなくしたいなら、
'\0'で置き換える作業が必要かと思います。


183ポイント を手に入れた。

Name: グー  ..入門者(2,646ポイント)   Date: 2007/03/21(水) 16:17   No:5967     
Title: Re:ファイルについて    
むつさんありがとうございます。
今、数値をfgets()で読み取り、数値に変換して計算するということをやっています。


#include <stdio.h>

int main(){
FILE *fp;
char ch[20];
int i;
int sum = 0;
int val;

fp = fopen("test.txt","r");
if(fp == NULL) {
return 1;
}
printf("ok\n");
i = 0;
sum = 0;
while(fgets(ch,20,fp)){
sscanf(ch,"%d",&val);
sum = sum + val;
i++;
}
printf("%d",sum);
fclose(fp);
return 0;
}


while(fgets(ch,20,fp))のところが良く分からないですね・・・。
whileってループですよね?条件式とかもないし。どういうことなんでしょう?fgets()の中身は
だいぶ分かってきました。


311ポイント を手に入れた。

Name: グー  ..入門者(2,865ポイント)   Date: 2007/03/21(水) 16:37   No:5968     
Title: Re:ファイルについて    
ファイルに出力する問題でテキストの練習問題解いているのですが、実行するとエラーになってしまいます。どこがおかしいのでしょうか?scanfで入力させるのは良くないですかね?


#include <stdio.h>

int main(void) {
FILE *fp;
char no[10];
char name[20];
char point[10];
int i;

fp = fopen("student.txt","w");
if(fp == NULL) {
printf("エラーです\n");
return 1;
}
printf("FILE OPEN\n");

for(i = 0; i < 3; i++) {
printf("%d人目の入力\n");
scanf("%s",no[i]);
scanf("%s",name[i]);
scanf("%s",point[i]);
}
for(i =0; i < 3; i++) {
fprintf(fp,"%s\n",no[i]);
fprintf(fp,"%s\n",name[i]);
fprintf(fp,"%s\n",point[i]);
}
fclose(fp);
return 0;
}




219ポイント を手に入れた。

Name: バグ  ..プログラマー(33,188ポイント)   Date: 2007/03/21(水) 16:49   No:5969     
Title: Re:ファイルについて    
scanfの引数はアドレスじゃなかったかと…?
滅多に使わないから、うろ覚えなので、間違ってたらすみません…m(__)m


48ポイント を手に入れた。

Name: グー  ..入門者(2,901ポイント)   Date: 2007/03/21(水) 16:52   No:5970     
Title: Re:ファイルについて    
今アドレス&を付けて実行したら、入力はできるのですが、入力が終わるとエラーになってしまいます。

36ポイント を手に入れた。

Name: miyaza  ..初心者(5,973ポイント)   Date: 2007/03/21(水) 16:55   No:5971     
Title: Re:ファイルについて    
printf("%d人目の入力\n");の%dにあてはまる変数や値がないからです。

scanf("%s",no[i]);
としていますがこれでは、一人目の人のデータを入力した後、二人目の人のデータを入力したときno[1]の部分から上書きしてしまうことになります。
name
point
も同様です。
3人分のデータを保存するのなら二次元配列にすることをおすすめします。



63ポイント を手に入れた。

Name: miyaza  ..初心者(5,992ポイント)   Date: 2007/03/21(水) 16:59   No:5972     
Title: Re:ファイルについて    
> printf("%d人目の入力\n");の%dにあてはまる変数や値がないからです。
関係ありませんでした。しかし値は必要だと思います。


19ポイント を手に入れた。

Name: グー  ..入門者(3,087ポイント)   Date: 2007/03/21(水) 17:01   No:5973     
Title: Re:ファイルについて    
miyazaさんありがとうございます。できました。こういうことですね。

#include <stdio.h>

int main(void) {
FILE *fp;
char no[3][10];
char name[3][20];
char point[3][10];
int i;

fp = fopen("student.txt","w");
if(fp == NULL) {
printf("エラーです\n");
return 1;
}
printf("FILE OPEN\n");

for(i = 0; i < 3; i++) {
printf("%d人目の入力\n",i + 1);
scanf("%s",&no[i]);
scanf("%s",&name[i]);
scanf("%s",&point[i]);
}
for(i =0; i < 3; i++) {

fprintf(fp,"%s\n",no[i]);
fprintf(fp,"%s\n",name[i]);
fprintf(fp,"%s\n",point[i]);

}
fclose(fp);
return 0;
}

コンソールから入力させるときはscanf()よりもいい方法ないですかね?scanf()はあまりよくないみたいで。


186ポイント を手に入れた。

Name: むつ  ..初心者(7,129ポイント)   Date: 2007/03/21(水) 17:03   No:5974     
Title: Re:ファイルについて    
入力した内容を、直接ファイルに格納し、
なおかつ、no[]、name[]、point[]を以後使わないのであれば、
以下のようになると思います。

#include <stdio.h>
int main(void) {
FILE *fp;
char no[10];
char name[20];
char point[10];
int i;
fp = fopen("student.txt","w");
if(fp == NULL) {
printf("エラーです\n");
return 1;
}
printf("FILE OPEN\n");
for(i = 1; i <= 3; i++) {
printf("%d人目の入力\n", i );
scanf("%s", &no);
scanf("%s", &name);
scanf("%s", &point);
//
fprintf(fp,"%s\n",no );
fprintf(fp,"%s\n",name );
fprintf(fp,"%s\n",point);
}
fclose(fp);
return 0;
}


258ポイント を手に入れた。

Name: miyaza  ..初心者(6,016ポイント)   Date: 2007/03/21(水) 17:05   No:5975     
Title: Re:ファイルについて    
> コンソールから入力させるときはscanf()よりもいい方法ないですかね?scanf()はあまりよくないみたいで。
fgets()を使ってみたらどうでしょう。

fgets(no[i],sizeof(no[i]),stdin);

こんな感じで


24ポイント を手に入れた。

Name: グー  ..入門者(3,032ポイント)   Date: 2007/03/21(水) 17:08   No:5976     
Title: Re:ファイルについて    
fgets()って読み込むときじゃないんですか??
scanf()よりもメリットあるのでしょうか??というより、fgets()でもコンソールから入力させられるなんて!!


55ポイント を落としてしまった。

Name: miyaza  ..初心者(6,026ポイント)   Date: 2007/03/21(水) 17:14   No:5977     
Title: Re:ファイルについて    
> fgets()って読み込むときじゃないんですか??
読み込んでますよ。標準入力から、だからfgets()の第三引数をstdinとしています。


10ポイント を手に入れた。

Name: グー  ..入門者(3,148ポイント)   Date: 2007/03/21(水) 17:18   No:5978     
Title: Re:ファイルについて    
なるほど!確かに読み込んでいますよね。標準入力から。説得力ありますよ。

fgets()で読み込むメリットってなんすかね?質問ばかりですみません。


2倍のポイントを手に入れた! 116ポイント を手に入れた。

Name: miyaza  ..初心者(6,077ポイント)   Date: 2007/03/21(水) 17:30   No:5979     
Title: Re:ファイルについて    
> fgets()で読み込むメリットってなんすかね?質問ばかりですみません。
一行だけ読み取れます。スペースも読み取れる。メリットというかscanf()との違いですが。

逆に聞きますがなんでscanf()よくないんでしょうか?


51ポイント を手に入れた。

Name: グー  ..入門者(3,512ポイント)   Date: 2007/03/21(水) 17:32   No:5980     
Title: Re:ファイルについて    
一度目はしっかりと読み込めたのですが、2回目3回目読み込むと、数字がめちゃくちゃになっているのですが、どういうことでしょうか?

#include <stdio.h>

int main(void) {
FILE *fp;
char no[3][10];
char name[3][20];
char point[3][10];
int i;
int val;
int sum;

fp = fopen("student.txt","r");
if(fp == NULL) {
printf("エラーです\n");
return 1;
}
printf("FILE OPEN\n");
/*
//書き込み用
for(i = 0; i < 3; i++) {
printf("%d人目の入力\n",i + 1);
scanf("%s",&no[i]);
scanf("%s",&name[i]);
scanf("%s",&point[i]);
}
for(i =0; i < 3; i++) {

fprintf(fp,"%s\n",no[i]);
fprintf(fp,"%s\n",name[i]);
fprintf(fp,"%s\n",point[i]);

}
*/
//読み込み用
sum = 0;
for(i = 0; i < 3; i++) {
fgets(no[i],10,fp);
fgets(name[i],20,fp);
fgets(point[i],10,fp);
//sscanf(point[i],"%d",&val);
//sum = sum + val;

}
for(i = 0; i < 3; i++) {
printf("%s\n",no[i]);
printf("%s\n",name[i]);
printf("%d\n",&point[i]);
}
printf("合計%d",sum);
fclose(fp);
return 0;
}




364ポイント を手に入れた。

Name: むつ  ..初心者(7,406ポイント)   Date: 2007/03/21(水) 17:48   No:5981     
Title: Re:ファイルについて    
今、入力した内容を直接ファイルに書き込んでいるので
書き込みの方で、for文を2つに分ける必要がありません。

以下に示したように、1つのfor文で処理してはいかがでしょう。

また、書き込みの方で、入力内容は一時的に格納するだけですので、
no[]、name[]、point[]に格納する必要は無いですよ。

もう1つchar buf[ 256 ];というのを用意して、
以下のようにしてみてください。

for( i = 1; i < 3; i++ ) {
printf( "%d人目の入力\n",i );
scanf( "%s", &buf );
fprintf( fp, "%s\n", buf );
scanf( "%s", &buf );
fprintf( fp, "%s\n", buf );
scanf( "%s", &buf );
fprintf( fp, "%s\n", buf );
}


そして、読み込み側ですが、fclose()によって、ファイルの書き込みが実行されます。
fclose()する前に、fpからfget()しても、入力した内容は取得できないのではないでしょうか。

ファイルが変更された後の、最新情報を取得したいのであれば、
書き込み側のfpをfclose()した後に続いて、読み込み用にfopen()してください。


277ポイント を手に入れた。

Name: miyaza  ..初心者(6,087ポイント)   Date: 2007/03/21(水) 17:52   No:5982     
Title: Re:ファイルについて    
> 一度目はしっかりと読み込めたのですが、2回目3回目読み込むと、数字がめちゃくちゃになっているのですが、どういうことでしょうか?

printf("%d\n",&point[i]);
これではアドレスを渡していることになります。
printf("%s\n",point[i]);
とすればだいじょうぶです。


10ポイント を手に入れた。

Name: グー  ..入門者(3,605ポイント)   Date: 2007/03/21(水) 17:57   No:5983     
Title: Re:ファイルについて    
miyazaさんへ
>逆に聞きますがなんでscanf()よくないんでしょうか?
 私はまだまだ初心者なので分かりませんが、あまり使わないほうがいいみたいです。理由はよくわからないの です。。

むつさんへ
たしかにそのやり方のほうがいいかもしれませんね!手間が省けますからね。


93ポイント を手に入れた。

Name: グー  ..入門者(3,630ポイント)   Date: 2007/03/21(水) 18:15   No:5984     
Title: Re:ファイルについて    
miyazaさんありがとうございます。できました。

25ポイント を手に入れた。

Name: グー  ..入門者(3,682ポイント)   Date: 2007/03/21(水) 18:20   No:5985     
Title: Re:ファイルについて    
pointを文字列として読み込んだあとに数値に変換して合計を求めたいのですが、何か方法ありますかね?
なかなかうまくいかなくて困ってます。


52ポイント を手に入れた。

Name: miyaza  ..初心者(6,127ポイント)   Date: 2007/03/21(水) 18:25   No:5986     
Title: Re:ファイルについて    
先ほどグーさんが書かれたソースの下の部分コメントアウトをはずしたら問題なくできましたが。

//sscanf(point[i],"%d",&val);
//sum = sum + val;




40ポイント を手に入れた。

Name: グー  ..入門者(3,713ポイント)   Date: 2007/03/21(水) 18:35   No:5987     
Title: Re:ファイルについて    
そうですか。できましたか。なぜかわたしのはできない。もう一度試してみます!

31ポイント を手に入れた。

Name: グー  ..入門者(3,725ポイント)   Date: 2007/03/21(水) 18:37   No:5988     
Title: Re:ファイルについて    
合計がやっぱり違う・・・・

12ポイント を手に入れた。

Name: box  ..熟練のプログラマー(59,614ポイント)   Date: 2007/03/21(水) 18:54   No:5989     
Title: Re:ファイルについて    
> 合計がやっぱり違う・・・・

案に相違してうまくいかない場合は、
とにかくそのソースを提示するのが得策でありましょう。

「このソースを書いてみたのですが、合計がやっぱり違います」
という風にすれば、本来は不要な発言のキャッチボールをしなくてすみます。


95ポイント を手に入れた。

Name: バグ  ..プログラマー(33,199ポイント)   Date: 2007/03/21(水) 19:26   No:5990     
Title: Re:ファイルについて    
合計が違うのであれば、『計算部分』か『データの代入部分』のどちらかに間違いがあるのでしょう。

11ポイント を手に入れた。

Name: グー  ..入門者(4,165ポイント)   Date: 2007/03/21(水) 19:53   No:5991     
Title: Re:ファイルについて    

#include <stdio.h>

int main(void) {
FILE *fp;
char no[3][10];
char name[3][20];
char point[3][10];
char buf[256];
int i;
int val;
int sum;

fp = fopen("student.txt","r");
if(fp == NULL) {
printf("エラーです\n");
return 1;
}
printf("FILE OPEN\n");




sum = 0;
for(i = 0; i < 3; i++) {
fgets(no[i],10,fp);
fgets(name[i],20,fp);
fgets(point[i],10,fp);
scanf(point[i],"%d",&val);
sum = sum + val;

}
for(i = 0; i < 3; i++) {
printf("%s\n",no[i]);
printf("%s\n",name[i]);
printf("%s\n",point[i]);
}

printf("合計%d",sum);
fclose(fp);
return 0;
}


テキストファイルを文字列で読み込み、pointだけ数値に変換してpointの合計を出力しようとしたものです。


440ポイント を手に入れた。

Name: miyaza  ..初心者(6,159ポイント)   Date: 2007/03/21(水) 20:00   No:5992     
Title: Re:ファイルについて    
scanf(point[i],"%d",&val);
ではなく
sscanf(point[i],"%d",&val);
としてください
sが一個たりませんでしたね。


32ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(240,771ポイント)   Date: 2007/03/21(水) 20:09   No:5993     
Title: Re:ファイルについて    
似たような名前でも1文字でも名前が違えば関数の仕様がかわるので注意してください。
詳しい仕様が分かりやすい書いてあるサイトとしてこの辺がお勧めです。

sscanf
http://www9.plala.or.jp/sgwr-t/lib/sscanf.html

scanf
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-3


60ポイント を手に入れた。

Name: グー  ..入門者(4,149ポイント)   Date: 2007/03/21(水) 20:15   No:5995 解決!     
Title: Re:ファイルについて    
miyazaさん了解です!
管理人さんありがとうございます!<!--12-->


16ポイント を落としてしまった。

Name: グー  ..入門者(4,681ポイント)   Date: 2007/03/22(木) 09:34   No:6011     
Title: Re:ファイルについて    

//読み込みコード
#include <stdio.h>
#define NUM 2

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
char point[NUM][10];
int i;

fp = fopen("student.txt","w");
if(fp == NULL) {
return 1;
}

printf("FILE OPEN\n");

for(i = 0; i < NUM; i++) {
printf("%d人目",i + 1) ;
printf("NO>>>");
scanf("%s",&no);
fprintf(fp,"NO:%s\n",no);
printf("NAME>>>");
scanf("%s",&name);
fprintf(fp,"%s\n",name);
printf("POINT>>>");
scanf("%s",point);
fprintf(fp,"%s\n",point);
}

fclose(fp);
return 0;
}


//書き込みコード

#include <stdio.h>
#define NUM 2

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
char point[NUM][10];
int i;

fp = fopen("student.txt","w");
if(fp == NULL) {
return 1;
}

printf("FILE OPEN\n");

for(i = 0; i < NUM; i++) {
printf("%d人目",i + 1) ;
printf("NO>>>");
scanf("%s",&no);
fprintf(fp,"NO:%s\n",no);
printf("NAME>>>");
scanf("%s",&name);
fprintf(fp,"%s\n",name);
printf("POINT>>>");
scanf("%s",point);
fprintf(fp,"%s\n",point);
}

fclose(fp);
return 0;
}


もっとこうしたほうがのでは?と思うところご指摘下さい


532ポイント を手に入れた。

Name: グー  ..初心者(6,073ポイント)   Date: 2007/03/22(木) 09:52   No:6012     
Title: Re:ファイルについて    

#include <stdio.h>
#define NUM 2

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
char point[NUM][10];
int i;

fp = fopen("student.txt","w");
if(fp == NULL) {
return 1;
}

printf("FILE OPEN\n");

for(i = 0; i < NUM; i++) {
printf("%d人目",i + 1) ;
printf("NO>>>");
scanf("%s",&no);
fprintf(fp,"NO:%s\n",no);
printf("NAME>>>");
scanf("%s",&name);
fprintf(fp,"%s\n",name);
printf("POINT>>>");
scanf("%s",point);
fprintf(fp,"%s\n",point);

}

fclose(fp);
return 0;
}



#include <stdio.h>
#define NUM 2

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
char point[NUM][10];
int i;
int val;
int sum;

fp = fopen("student.txt","r");
if(fp == NULL) {
return 1;
}

printf("FILE OPEN\n");
sum = 0;

for(i = 0; i < NUM; i++) {
printf("%d人目\n",i + 1);
fgets(no[i],10,fp);
printf("%s\n",no);
fgets(name[i],20,fp);
printf("%s\n",name);
fgets(point[i],10,fp);
printf("%s\n",point);
sscanf(point[i],"%d",&val);
sum = sum + val;

}
printf("合計>>%d",sum);

fclose(fp);
return 0;
}

sscanf(point[i],"%d",&val);のvalの前に&がある理由って?

fgets(point[i],10,fp);
printf("%s\n",point);
sscanf(point[i],"%d",&val);
一度、point[i]に読み込んだものが格納されて、printfのpointで出力されているのは分かるのですが、sscanf
では、どのような処理がされているのでしょうか?&valで読み込んだものが、point[i]に格納され、sum = sum + valがされるのでしょうか?


2倍のポイントを手に入れた! 1,392ポイント を手に入れた。

Name: miyaza  ..初心者(6,425ポイント)   Date: 2007/03/22(木) 10:42   No:6013     
Title: Re:ファイルについて    
> sscanf(point[i],"%d",&val);のvalの前に&がある理由って?
valのアドレスを渡しているからです。

sscanf()は指定された文字列から指定された書式フォーマットにしたがって変換されたデータを指定されたアドレスに格納します。

sscanf(point[i],"%d",&val);
今回point[i]の中にはfgets(point[i],10,fp);で取り込んだ文字列が入っています。その中から整数を変数valに格納しています。
つまり文字列の中から数値を取り出しています。


2倍のポイントを手に入れた! 266ポイント を手に入れた。

Name: グー  ..初心者(6,090ポイント)   Date: 2007/03/23(金) 05:58   No:6024     
Title: Re:ファイルについて    
miyazaさんへ
ありがとうございます。


17ポイント を手に入れた。



Name: 憲吾  ..ぴよぴよ(76ポイント)   Date: 2007/03/21(水) 22:45   No:6001       
Title: int型について    
int num;
scanf("%d", &num);
printf("%d", num);

このプログラムを動かしたとき、scanfでたとえば00020と
入力すると、結果は20となります。
これを結果も00020とする方法はないのでしょうか?
char型に数字を入れる方法しかないのでしょうか?


76ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(241,333ポイント)   Date: 2007/03/21(水) 22:55   No:6003     
Title: Re:int型について    
こんにちは。
printfにはさまざまなオプションがありますよ。

たとえば、それでしたら
http://www9.plala.or.jp/sgwr-t/c/sec05.html
の「フィールド幅」をご覧ください。


68ポイント を手に入れた。

Name: 憲吾  ..ぴよぴよ(98ポイント)   Date: 2007/03/21(水) 23:36   No:6004 解決!     
Title: Re:int型について    
ありがとうございます。
すごいためになりました。


22ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(68,777ポイント)   Date: 2007/03/21(水) 23:40   No:6005     
Title: Re:int型について    
これを結果も00020とする方法はないのでしょうか
 どうしたいのかにも依ります。
 printfの出力も、プログラム内部での扱いも 00020であって欲しいなら、
scanfの段階から(憲吾さんの考えておられるとおり)文字列で処理するしかありません。


 しかし、printfの出力時だけ 00020であって欲しいなら2通りあります。

 1つ目は scanfの段階では文字列として受け取った後、数値に変換し、
printfには文字列の方を出力します。
 これが一番スタンダードでしょうか。

 もう1つはちょっと特殊ですが、scanfと printfの機能をフル活用して
    int value, length;

if(scanf("%d%n", &value, &length) > 0)
printf("value = %0*d\n", length, value);
 としても同様の結果が得られます。


311ポイント を落としてしまった。

Name: 管理人 [URL]  ..ハッカー(242,285ポイント)   Date: 2007/03/22(木) 05:26   No:6008     
Title: Re:int型について    
なるほど、色々な書き方が出来るものですね。
しかしprintfって最初に習う関数でありながらものすごい種類のオプションがありますね。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
改めて読んでみると知らなかったこともあったりしました^^;

「 `*' と `*m$' はそれぞれ、次の引き数と m 番目の引き数をフィールド幅として使うことを指定する」

ということは

printf("value = %0*d\n", length, value);

において7桁入力したときに表示する

printf("value = %07d\n", value);

と同じ意味になると言うことですね。
逆に勉強になりました^^;


214ポイント を手に入れた。



Name: み〜  ..上級者(16,835ポイント)   Date: 2007/03/16(金) 06:17   No:5588       
Title: ファイルの読み込み書き込み    
おはようございます!!書き込みが多くなったので新たにスレをたてさせていただきます!!

毎日毎日、同じような質問に親切にアドバイスをくださる皆様にはものすごく感謝しております!!


2倍のポイントを手に入れた! 62ポイント を手に入れた。


Name: み〜  ..上級者(17,112ポイント)   Date: 2007/03/16(金) 08:28   No:5590     
Title: Re:ファイルの読み込み書き込み    

#include <stdio.h>
#define NUM 5
int main(void) {
char no[NUM] = {1,2,3,4,5};
int i ;
FILE *fp;
fp = fopen("test.txt","w");
if(fp == NULL){
return 1;
}else{
printf("open\n");
}

for(i = 0; i < NUM; i++) {
fgets(&no[i],sizeof(no[i]),fp );

}

for(i = 0; i < NUM; i++) {
fprintf(fp,"%d\n", &no[i]);
}
fclose(fp);
return 0;
}


ファイルには
1245048
1245049
1245050
1245051
1245052と書き込まれてしまっている・・・。

fgets(&no[i],sizeof(no[i]),fp );の所が違うの?&を取ると警告でるし・・・・


277ポイント を手に入れた。

Name: み〜  ..上級者(17,168ポイント)   Date: 2007/03/16(金) 08:31   No:5591     
Title: Re:ファイルの読み込み書き込み    
やっぱり二次元配列にするべきなのですかね??

一次元でもできるようにしたいのですが・・・何か方法はありますか??


56ポイント を手に入れた。

Name: miyaza  ..かけだし(2,182ポイント)   Date: 2007/03/16(金) 08:39   No:5592     
Title: Re:ファイルの読み込み書き込み    
キーボードから入力して書き込みたいのですか?
それとも配列の初期値12345を書き込みたいのですか?
後者ならばfgets()を使う必要はありません。


3ポイント を手に入れた。

Name: み〜  ..上級者(17,211ポイント)   Date: 2007/03/16(金) 08:45   No:5593     
Title: Re:ファイルの読み込み書き込み    
miyazaさんおはようごうざいます!!

初期値を書き込みたいのです。。キーボード入力しないならfgets()はいらないと気づいてfgets()部分
をけしたのですが、ダメでした。。


43ポイント を手に入れた。

Name: miyaza  ..かけだし(2,184ポイント)   Date: 2007/03/16(金) 08:49   No:5594     
Title: Re:ファイルの読み込み書き込み    
12345と出力されれば良いのですか?

2ポイント を手に入れた。

Name: み〜  ..上級者(17,310ポイント)   Date: 2007/03/16(金) 08:51   No:5595     
Title: Re:ファイルの読み込み書き込み    
書き込まれたファイルを見ると、意味不明な文字とかが書かれているのです・・・。

fprintf(fp,"%d\n", &no[i]);の部分なんですけど、%dじゃなくて%sですかね。。char no[NUM]となって
いることだし・・・・。


99ポイント を手に入れた。

Name: miyaza  ..かけだし(2,204ポイント)   Date: 2007/03/16(金) 08:51   No:5596     
Title: Re:ファイルの読み込み書き込み    
fprintf()の&を取ればおそらく大丈夫です。

20ポイント を手に入れた。

Name: み〜  ..上級者(17,335ポイント)   Date: 2007/03/16(金) 08:52   No:5597     
Title: Re:ファイルの読み込み書き込み    
>>12345と出力されれば良いのですか?
そうです・・・・。


25ポイント を手に入れた。

Name: むつ  ..初心者(5,924ポイント)   Date: 2007/03/16(金) 08:53   No:5598     
Title: Re:ファイルの読み込み書き込み    
前日のソースでは fprintf(fp,"%d\n", &no[i]); において
no[i]としていましたよね。

エディタは何をお使いでしょうか。
タイプミス防止の為、「 & 」に色を付けてみてはいかがでしょうか。


63ポイント を手に入れた。

Name: み〜  ..上級者(17,459ポイント)   Date: 2007/03/16(金) 08:54   No:5599     
Title: Re:ファイルの読み込み書き込み    
>>fprintf()の&を取ればおそらく大丈夫です。

これでできましたよ!!

でも、どうしてもコンソールから入力させて一次元でもできるようになりたいですね〜。。


2倍のポイントを手に入れた! 124ポイント を手に入れた。

Name: miyaza  ..かけだし(2,228ポイント)   Date: 2007/03/16(金) 08:57   No:5600     
Title: Re:ファイルの読み込み書き込み    
何で一次元にこだわるのですか?
文字列を格納するなら二次元の方が管理しやすいと思います。


24ポイント を手に入れた。

Name: み〜  ..上級者(17,540ポイント)   Date: 2007/03/16(金) 08:58   No:5601     
Title: Re:ファイルの読み込み書き込み    
むつさんおはようございます!!

なんというか&の使い方がよく分からないのです。。
ポインタの所とかよんでいるのですが・・・。

ファイルに読み書きする際どのようなときに付けるのか付けないのか・・・。


81ポイント を手に入れた。

Name: み〜  ..上級者(17,827ポイント)   Date: 2007/03/16(金) 09:01   No:5602     
Title: Re:ファイルの読み込み書き込み    
miyazaさん。。
それなら二次元の方がいいですね。。了解です!!

でも、上のコードを今度二次元にしてみたのです。。そしたらやはり思ったようには書き込まれていなかった。。


include <stdio.h>
#define NUM 5
int main(void) {
char no[NUM][NUM] = {1,2,3,4,5};
int i ;
FILE *fp;
fp = fopen("test.txt","w");
if(fp == NULL){
return 1;
}else{
printf("open\n");
}

//for(i = 0; i < NUM; i++) {
//fgets(&no[i],sizeof(no[i]),fp );

//}

for(i = 0; i < NUM; i++) {
fprintf(fp,"%d\n", no[i]);
}
fclose(fp);
return 0;
}



287ポイント を手に入れた。

Name: miyaza  ..かけだし(2,285ポイント)   Date: 2007/03/16(金) 09:08   No:5603     
Title: Re:ファイルの読み込み書き込み    
今回は二次元配列にする必要がありません。
あつかっているのは12345だけなので二次元にしても意味がありません。

言葉がたりませんでした、複数の文字列を扱うときには二次元配列の方がいいというはなしです。


57ポイント を手に入れた。

Name: み〜  ..上級者(17,868ポイント)   Date: 2007/03/16(金) 09:10   No:5604     
Title: Re:ファイルの読み込み書き込み    
miyazaさん、そうですか。了解しました。。

もう少しいろいろ試した見ます!!


41ポイント を手に入れた。

Name: むつ  ..初心者(6,011ポイント)   Date: 2007/03/16(金) 09:11   No:5605     
Title: Re:ファイルの読み込み書き込み    
イージーミスが多いですよ。
とりあえずコーヒー飲んで落ち着こう!

/* */ // & , . " ' {} = これらの文字に色を付ければ、タイプミスは防げると思いますよ。

それと、前日のスレに自分が掲示した読み書きのサンプルを触ってみてください。
色々とヒントを詰め込んだつもりです。


87ポイント を手に入れた。

Name: み〜  ..上級者(17,897ポイント)   Date: 2007/03/16(金) 09:28   No:5606     
Title: Re:ファイルの読み込み書き込み    
むつさん!!了解です!!

ちなみに今ファイルからの読み込み成功しました!!!!


29ポイント を手に入れた。

Name: み〜  ..上級者(17,898ポイント)   Date: 2007/03/16(金) 11:13   No:5608     
Title: Re:ファイルの読み込み書き込み    
今、あらたなプログラム書いてます!!

1ポイント を手に入れた。

Name: み〜  ..上級者(18,290ポイント)   Date: 2007/03/16(金) 11:55   No:5610     
Title: Re:ファイルの読み込み書き込み    
</pre>
#include <stdio.h>
#define NUM 3

int main(void) {
char no[NUM][10];
char name[NUM][20];
int point;
int i;

FILE *fp;
fp = fopen("test.txt","w");
if(fp = NULL) {
return 1;
}else{
printf("file open\n");
}

for(i = 0 ; i < NUM; i++) {
printf("NO:");
fgets(no[i],sizeof(no[i]),stdin);
printf("NAME:");
fgets(name[i],sizeof(name[i]),stdin);
printf("点数:");
scanf("%d",&point);
}

for(i = 0; i < NUM; i++) {
fprintf(fp, "%d\n",no[i]);
fprintf(fp, "%s\n", name[i]);
fprintf(fp , "%d\n", point);
}

fclose(fp);
return 0;
}

</pre>
うまく書き込めないです。
なぜかno入力が飛ばされる


392ポイント を手に入れた。

Name: miyaza  ..かけだし(2,293ポイント)   Date: 2007/03/16(金) 13:13   No:5612     
Title: Re:ファイルの読み込み書き込み    
とりあえずfpのエラー処理

if(fp=NULL)からif(fp==NULL)に直してください。


8ポイント を手に入れた。

Name: miyaza  ..かけだし(2,383ポイント)   Date: 2007/03/16(金) 13:18   No:5613     
Title: Re:ファイルの読み込み書き込み    
書き込み部分
scanf()の下にfflush(stdin)と追加してください。
とりあえず書き込めるようになります。


2倍のポイントを手に入れた! 90ポイント を手に入れた。

Name: keichan  ..上級者(17,874ポイント)   Date: 2007/03/16(金) 13:21   No:5614     
Title: Re:ファイルの読み込み書き込み    
これかな?
printf("点数:");
scanf("%d",&point);

printf("点数:");
scanf("%d ",&point);


90ポイント を手に入れた。

Name: み〜  ..上級者(18,280ポイント)   Date: 2007/03/16(金) 13:35   No:5615     
Title: Re:ファイルの読み込み書き込み    
なぜか二回目のループの時だけnoがとばされる・・・なぜ??

10ポイント を落としてしまった。

Name: miyaza  ..かけだし(2,399ポイント)   Date: 2007/03/16(金) 13:36   No:5616     
Title: Re:ファイルの読み込み書き込み    
3人分の点数を入れるならpointも3つ確保してください。

16ポイント を手に入れた。

Name: miyaza  ..かけだし(2,418ポイント)   Date: 2007/03/16(金) 13:41   No:5617     
Title: Re:ファイルの読み込み書き込み    
> なぜか二回目のループの時だけnoがとばされる・・・なぜ??
入力バッファをクリアしていないからだと思います。たぶんですが。


19ポイント を手に入れた。

Name: み〜  ..上級者(18,509ポイント)   Date: 2007/03/16(金) 13:42   No:5618     
Title: Re:ファイルの読み込み書き込み    
ダメです・・・・。

#include <stdio.h>
#define NUM 3

int main(void) {
char no[NUM][10];
char name[NUM][20];
int point[NUM];
int i;

FILE *fp;
fp = fopen("test.txt","w");
if(fp == NULL) {
return 1;
}else{
printf("file open\n");
}

for(i = 0 ; i < NUM; i++) {
printf("NO:");
fgets(no[i],sizeof(no[i]),stdin);
printf("NAME:");
fgets(name[i],sizeof(name[i]),stdin);
printf("点数:");
scanf("%d",&point[i]);
}

for(i = 0; i < NUM; i++) {
fprintf(fp, "%d\n",no[i]);
fprintf(fp, "%s\n", name[i]);
fprintf(fp , "%d\n", point);
}

fclose(fp);
return 0;
}


noだけがとばされますね・・・。


229ポイント を手に入れた。

Name: miyaza  ..かけだし(2,434ポイント)   Date: 2007/03/16(金) 13:45   No:5619     
Title: Re:ファイルの読み込み書き込み    
入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。


16ポイント を手に入れた。

Name:  ..ぴよぴよ(710ポイント)   Date: 2007/03/16(金) 13:46   No:5620     
Title: Re:ファイルの読み込み書き込み    
保存時の時を考えて統一した方がいいのでは?

for(i = 0 ; i < NUM; i++)
{
  printf("NO:");
  fgets(no[i],sizeof(no[i]),stdin);
  printf("NAME:");
  fgets(name[i],sizeof(name[i]),stdin);
  printf("点数:");
  scanf("%d", &point[i]);
}

  ↓

for(i = 0 ; i < NUM; i++)
{
  printf("NO:");
  scanf("%s", &no[i]);
  printf("NAME:");
  scanf("%s", name[i]);
  printf("点数:");
  scanf("%d", &point[i]);
}


170ポイント を手に入れた。

Name: み〜  ..上級者(18,613ポイント)   Date: 2007/03/16(金) 13:49   No:5621     
Title: Re:ファイルの読み込み書き込み    
>>入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。


クリアとはどのようにするのですか??


2倍のポイントを手に入れた! 104ポイント を手に入れた。

Name: miyaza  ..入門者(2,501ポイント)   Date: 2007/03/16(金) 13:56   No:5622     
Title: Re:ファイルの読み込み書き込み    
scanf()の下にfflush(stdin)と追加してください。
とりあえず書き込めるようになります。

fprintf(fp,"%d",no[i]);
から
fprintf(fp,"%s",no[i]);
に変更


67ポイント を手に入れた。

Name: み〜  ..上級者(18,628ポイント)   Date: 2007/03/16(金) 14:05   No:5623     
Title: Re:ファイルの読み込み書き込み    
コンソールから入力したのにファイルができてないです。。

15ポイント を手に入れた。

Name: miyaza  ..入門者(2,538ポイント)   Date: 2007/03/16(金) 14:10   No:5624     
Title: Re:ファイルの読み込み書き込み    
なにも書き込まれていないのでは無くファイルが出来ていないということですよね?

fopen()からの処理に問題がありませんか?


37ポイント を手に入れた。

Name: み〜  ..上級者(18,854ポイント)   Date: 2007/03/16(金) 14:11   No:5625     
Title: Re:ファイルの読み込み書き込み    

#include <stdio.h>
#define NUM 3

int main(void) {
char no[NUM][10];
char name[NUM][20];
int point[NUM];
int i;

FILE *fp;
fp = fopen("test.txt","w");
if(fp == NULL) {
return 1;
}else{
printf("file open\n");
}

for(i = 0 ; i < NUM; i++) {
printf("NO:");
fgets(no[i],sizeof(no[i]),stdin);
printf("NAME:");
fgets(name[i],sizeof(name[i]),stdin);
printf("点数:");
scanf("%d",&point[i]);
fflush(stdin);
}

for(i = 0; i < NUM; i++) {
fprintf(fp, "NO:%s\n",no[i]);
fprintf(fp, "NAME:%s\n", name[i]);
fprintf(fp , "POINT:%d\n", point);
}

fclose(fp);
return 0;
}


コードです


226ポイント を手に入れた。

Name: み〜  ..上級者(18,880ポイント)   Date: 2007/03/16(金) 14:17   No:5626     
Title: Re:ファイルの読み込み書き込み    
なんでファイルができないのでしょう??
コードおかしいのかな??


26ポイント を手に入れた。

Name: miyaza  ..入門者(2,592ポイント)   Date: 2007/03/16(金) 14:17   No:5627     
Title: Re:ファイルの読み込み書き込み    
こちらで確認してみましたtest.txtは作成されていました。

しかしpointの値がおかしかったです。

fprintf(fp , "POINT:%d",point[i]);

と直してください。


54ポイント を手に入れた。

Name:  ..ぴよぴよ(774ポイント)   Date: 2007/03/16(金) 14:19   No:5628     
Title: Re:ファイルの読み込み書き込み    
ファイルに書き込まれてますよ?

点数を書き込む処理を
 fprintf(fp , "POINT:%d\n", point[i]);
に変更しましょう。


64ポイント を手に入れた。

Name: み〜  ..上級者(18,875ポイント)   Date: 2007/03/16(金) 14:23   No:5629     
Title: Re:ファイルの読み込み書き込み    
了解です!!!

5ポイント を落としてしまった。

Name: GPGA  ..プログラマー(27,137ポイント)   Date: 2007/03/16(金) 14:36   No:5630     
Title: Re:ファイルの読み込み書き込み    
み〜さんの環境がVC6なので、fflushで入力バッファをクリアすることができていますが
Cの規格では、入力ストリームに対するfflushは未定義であるため、推奨されません。

MSDNでは、fflushを使用して入力ストリームをクリアするサンプルがあり
その行のコメントは以下のようになっています。

fflush on input stream is an extension to the C standard


また、この件は以前この掲示板の話題に上がっていますので、ご参考ください。 fflushについて


159ポイント を手に入れた。

Name: み〜  ..上級者(19,232ポイント)   Date: 2007/03/16(金) 14:40   No:5631     
Title: Re:ファイルの読み込み書き込み    
GPGAさん、了解です!!


#include <stdio.h>
#define NUM 3

int main(void) {
FILE *fp;
char no[NUM][10];
char name[NUM][20];
int point[NUM];
int i;


fp = fopen("test.txt","r");
if(fp == NULL) {
return 1;
}else{
printf("file open\n");
}

for(i = 0; i < NUM; i++) {
fscanf(fp,"%*%s",&no[i]);
fscanf(fp,"%*%s",&name[i]);
fscanf(fp,"%*%d",&point[i]);
}

for(i = 0; i < NUM; i++) {
printf("%s\n",no[i]);
printf("%s\n",name[i]);
printf("%d\n", point[i]);
}

fclose(fp);

return 0;
}

読み取れないんですけど。。


357ポイント を手に入れた。

Name: み〜  ..上級者(19,308ポイント)   Date: 2007/03/16(金) 14:59   No:5632     
Title: Re:ファイルの読み込み書き込み    
fscanf(fp,"%*%s",&no[i]);
fscanf(fp,"%*%s",&name[i]);
fscanf(fp,"%*%d",&point[i]);の部分を%*を取ればできたのですが、最後のpointだけ正常に
読み取れないです・・。



2倍のポイントを手に入れた! 76ポイント を手に入れた。

Name: miyaza  ..入門者(2,639ポイント)   Date: 2007/03/16(金) 15:08   No:5633     
Title: Re:ファイルの読み込み書き込み    
fflush()のことは知りませんでした。すいません。よく調べてから書き込むべきでした。

int型で読めないのなら文字列として読み取って見るのも手かもしれません。


47ポイント を手に入れた。

Name: GPGA  ..プログラマー(27,240ポイント)   Date: 2007/03/16(金) 15:16   No:5634     
Title: Re:ファイルの読み込み書き込み    

今回は POINT: と数値の間にスペースが無いんですね。
そうすると

× fscanf(fp, "%*%d", &point[i]);
○ fscanf(fp, "%*[^0-9]%d ", &point[i]);

といったところでしょうか。
 


103ポイント を手に入れた。

Name:  ..ぴよぴよ(836ポイント)   Date: 2007/03/16(金) 15:17   No:5635     
Title: Re:ファイルの読み込み書き込み    
どのように表示をしたいのでしょうか?

NO:1
NAME:1
POINT:1
 ・
 ・
 ・

それとも
1
1
1



62ポイント を手に入れた。

Name: み〜  ..上級者(19,389ポイント)   Date: 2007/03/16(金) 15:19   No:5636     
Title: Re:ファイルの読み込み書き込み    
文字列としてもむりでした。例外がおきてしまいました。。

>>× fscanf(fp, "%*%d", &point[i]);
○ fscanf(fp, "%*[^0-9]%d ", &point[i]);

もっと簡単なやりかたないですかね??まだまだ私にはこのようなやり方は
考え出せそうもないので・・・・。レベルにあったやりかたで。


81ポイント を手に入れた。

Name: miyaza  ..入門者(2,696ポイント)   Date: 2007/03/16(金) 15:25   No:5637     
Title: Re:ファイルの読み込み書き込み    
> 文字列としてもむりでした。例外がおきてしまいました。。


変数
char point[NUM][10];

読み込み
fscanf(fp,"%s",&point[i]);

表示
printf("%s\n", point[i]);

という感じで修正しましたか?



57ポイント を手に入れた。

Name:  ..ぴよぴよ(876ポイント)   Date: 2007/03/16(金) 15:25   No:5638     
Title: Re:ファイルの読み込み書き込み    
変数pointをint型からchar型に直しましたか?
int型で文字列は読めませんよ。


40ポイント を手に入れた。

Name: バグ  ..プログラマー(32,770ポイント)   Date: 2007/03/16(金) 15:29   No:5639     
Title: Re:ファイルの読み込み書き込み    
『何でもかんでも教えてもらえばいいや』という姿勢は如何なものかと思いますよ。

自分で調べたり、考えたりした事でないと、本当の意味で身に付かないと思います。

失礼かもしれませんが、ファイル云々よりも、もっと前の段階を参考書などを読んで理解を深めてから、取り組んだ方がいいのではないでしょうか?


149ポイント を手に入れた。

Name: むつ  ..初心者(6,268ポイント)   Date: 2007/03/16(金) 15:35   No:5640     
Title: Re:ファイルの読み込み書き込み    
 今、一つのファイルで【データの蓄積】と【最新データの確認】と両方をこなしています。
ですから、fscanf()で複雑な事をしなくてはいけなくなります。

■蓄積用ファイルには、NO:、NAME:、POINT:等とつけないで保存する。

■データの最新データを確認したい場合は、fopen "r"で読み込んだ後、
printf()でNO:、NAME:、POINT:と書式付でコンソールに表示するか、
または、別の確認用ファイルに出力してください。


165ポイント を手に入れた。

Name: み〜  ..上級者(19,545ポイント)   Date: 2007/03/16(金) 16:07   No:5641     
Title: Re:ファイルの読み込み書き込み    
miyazaさん、※さん、むつさんアドバイスありがとうございます!!
読み込みが無事できました!!!

バグさん。。おっしゃる通りです。。もう一度基本的なことから勉強してみます!!
ただ、ファイルに関してはなぜか苦手意識がついてしまったみたいで自信が持てないのです。。
不安で不安で仕方ないのです。。


156ポイント を手に入れた。

Name: み〜  ..上級者(19,741ポイント)   Date: 2007/03/16(金) 21:56   No:5651     
Title: Re:ファイルの読み込み書き込み    
何回やってもコンパイルエラーが出てしまいます。。

include <stdio.h>

int main(void) {
int a[10] = {1,2,3,4,5,6,7,8,9,};
int i;
FILE *fp;
fp = fopen("test1.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

for(i = 0; i < 10; i++) {
fwrite(&a[i],sizeof(a[i]),1,fp);
}
for(i = 0; i <10; i++){
fprintf("%d",a[i],fp);
}
printf("OK");


fclose(fp);
return 0;
}

エラー内容:1行目、宣言の構文エラーと出ます。



196ポイント を手に入れた。

Name: 組木紙織  ..入門者(3,709ポイント)   Date: 2007/03/16(金) 22:02   No:5652     
Title: Re:ファイルの読み込み書き込み    
#include

落ち着いて考えてください


10ポイント を落としてしまった。

Name: み〜  ..上級者(19,813ポイント)   Date: 2007/03/16(金) 22:08   No:5653     
Title: Re:ファイルの読み込み書き込み    
組木紙織さん!!ありがとうございます!!

コンパイルはできたのですが、ファイルができないのです・・・。ず〜と考えてるのですが・・限界です。。


72ポイント を手に入れた。

Name: み〜  ..上級者(20,037ポイント)   Date: 2007/03/16(金) 22:15   No:5654     
Title: Re:ファイルの読み込み書き込み    
たった今、コンパイル、実行できましたが、読み込みができないですね〜。
読み込んでいるときにエラーになってしまいます。。


#include <stdio.h>

int main(void) {
int a[10];
int i;
FILE *fp;
fp = fopen("test1.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}


fread(&a[i],sizeof(a[i]),1,fp);


printf("%d",&a[i]);
fclose(fp);
return 0;
}

読み込みのコードですが、どっか変ですかね??


224ポイント を手に入れた。

Name: 組木紙織  ..入門者(3,945ポイント)   Date: 2007/03/16(金) 22:25   No:5655     
Title: Re:ファイルの読み込み書き込み    
考えるだけでなくコンパイラの警告もきちんと考えましょう。
私のVC++での警告です
/***************/
警告 1 warning C4996: 'fopen' が古い形式として宣言されました。
警告 2 warning C4313: 'printf' : 書式文字列内の '%d' が引数 1 ('int *__w64 ' 型) と競合
警告 3 warning C4700: 初期化されていないローカル変数 'i' が使用されます

/************/
1は無視してもほとんどかまわないので2と3の警告を消すように考えてみてください。

コンパイラは頭いいので、頼りになります。


236ポイント を手に入れた。

Name: み〜  ..上級者(20,097ポイント)   Date: 2007/03/16(金) 22:29   No:5656     
Title: Re:ファイルの読み込み書き込み    
組木紙織さんありがとうございます。。
ただ、私の場合コンパイルはコンソールでbcc32とかでやってるもんで、そこまで出てきていませんでした。。


60ポイント を手に入れた。

Name: み〜  ..上級者(20,153ポイント)   Date: 2007/03/16(金) 22:42   No:5657     
Title: Re:ファイルの読み込み書き込み    
警告3は分かったけど、警告2が分からない。。
警告3はfor文作るだけですよね??

実行しても、しっかりと読み取れていない。


56ポイント を手に入れた。

Name: 組木紙織  ..入門者(3,962ポイント)   Date: 2007/03/16(金) 22:46   No:5658     
Title: Re:ファイルの読み込み書き込み    
警告3はfor文というより、初期化をしてください!!!。ということです。
警告2はprintf()の引数が変だよと言っています。


17ポイント を手に入れた。

Name: み〜  ..上級者(20,408ポイント)   Date: 2007/03/16(金) 22:56   No:5659     
Title: Re:ファイルの読み込み書き込み    
こんな感じですけど、読み取れないですね・・・?

#include <stdio.h>

int main(void) {
int a[10];
int i;

FILE *fp;
fp = fopen("test1.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

for(i = 0; i < 10; i++){
fread(&a[i],sizeof(a[i]),1,fp);
}


printf("%d",a[i]);
fclose(fp);
return 0;
}

初期化?? int i = 0;ぐらいしか思い浮かばないです。
引数っていったら&を付けるか付けないかだと思うのですが・・・。
何が違うのだろ・・・?


255ポイント を手に入れた。

Name: 組木紙織  ..入門者(4,000ポイント)   Date: 2007/03/16(金) 23:05   No:5660     
Title: Re:ファイルの読み込み書き込み    
これforループで十回連続で読み込んで、その最後+1の読み込みを返しています。

配列を使わずに作り直してみたらどうですか?


38ポイント を手に入れた。

Name: み〜  ..上級者(20,476ポイント)   Date: 2007/03/16(金) 23:35   No:5663     
Title: Re:ファイルの読み込み書き込み    
やっぱり正しく読み取れなかったのですか??
for文を使わないでですか・・・。思いつかないですね〜。。どうすればいいか・・・
テキストなんか見ても、for使ってますし・・・。


68ポイント を手に入れた。

Name: 組木紙織  ..入門者(4,181ポイント)   Date: 2007/03/16(金) 23:43   No:5664     
Title: Re:ファイルの読み込み書き込み    
書き方が悪かった。。

始めのひとつだけの読み込み&画面への表示をしてみたらどうですか?
というつもりだったのですが。

先ほどのコードを見てみると

for(i = 0; i < 10; i++){
fread(&a[i],sizeof(a[i]),1,fp);
}
/*
ここではiの値は何ですか?
*/
     printf("%d",a[i]);






181ポイント を手に入れた。

Name: み〜  ..上級者(20,519ポイント)   Date: 2007/03/16(金) 23:49   No:5665     
Title: Re:ファイルの読み込み書き込み    
組木紙織さん。
了解です!!試してみます!!
明日、結果を書きます!!
夜遅くまでありがとうございました!!


43ポイント を手に入れた。

Name: み〜  ..上級者(20,671ポイント)   Date: 2007/03/17(土) 08:31   No:5692     
Title: Re:ファイルの読み込み書き込み    
こんな感じですけど、読み取れないですね・・・?

#include <stdio.h>

int main(void) {
int a[10];


FILE *fp;
fp = fopen("test1.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}


fread(&a[1],sizeof(a[1),1,fp);



printf("%d",a[1]);
fclose(fp);
return 0;
}

一つづつ読み込ませてのですがダメでした。
for文の所消してfread(&a[1],sizeof(a[1]),1,fp);とすればいいのですよね??

それとも書き込みがしっかりできていないのですかね?



152ポイント を手に入れた。

Name: み〜  ..上級者(21,561ポイント)   Date: 2007/03/17(土) 09:43   No:5693     
Title: Re:ファイルの読み込み書き込み    
元の書き込み用コードです。。


#include <stdio.h>

int main(void) {
int a[10] = {1,2,3,4,5,6,7,8,9};
int i;
FILE *fp;
fp = fopen("test2.txt","wb");
if(fp == NULL){
return 1;
}else{
printf("open\n");
}
for(i = 0; i < 10; i++){
fwrite(&a[i],sizeof(a[i]),1,fp);
}
fclose(fp);
return 0;
}

fwrite()の部分なのですが、a[i]とするとコンパイルエラーで、パーラメター'_ptr'
はconst void * 型として定義されているのでint型は渡せないと出ます。
配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
&をつけるのでしょうか?

テキストファイルは一応できていました。中身は、£Γというような意味不明の記号みたいなものがありました。

もしかしたら、読み込みが正常にできないというのは書き込みの段階で間違っているのでしょうか??


2倍のポイントを手に入れた! 890ポイント を手に入れた。

Name: miyaza  ..入門者(2,746ポイント)   Date: 2007/03/17(土) 10:12   No:5694     
Title: Re:ファイルの読み込み書き込み    
> 配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
配列の要素iが変化していっているので、個々の要素にアクセスするためには&が必要です。
先頭アドレスというのはa[0]のアドレスのことです。


50ポイント を手に入れた。

Name: み〜  ..上級者(21,637ポイント)   Date: 2007/03/17(土) 10:21   No:5695     
Title: Re:ファイルの読み込み書き込み    
miyazaさんおはようございます!!
&はそういうことだったのですか!!スッキリしました。。

ただ、まだバイナリファイルの読み書き苦戦中です。。
普通のファイルの読み書きはだいぶできるようになってきました。。

上のコードですけど、特に怪しいところはありませんよね??


76ポイント を手に入れた。

Name: miyaza  ..入門者(2,771ポイント)   Date: 2007/03/17(土) 10:21   No:5696     
Title: Re:ファイルの読み込み書き込み    
作成されたバイナリファイルの内容は1234567890となっていました。
これで問題ないなら書き込み部分に原因はありません。


25ポイント を手に入れた。

Name: み〜  ..上級者(21,668ポイント)   Date: 2007/03/17(土) 10:28   No:5698     
Title: Re:ファイルの読み込み書き込み    
最後の0って??なんであるのでしょう??

自分も今、偶然読み込みができたのですよ!!
そしたら、最後に0が・・・。一体なぜ??


31ポイント を手に入れた。

Name: miyaza  ..入門者(2,798ポイント)   Date: 2007/03/17(土) 10:32   No:5699     
Title: Re:ファイルの読み込み書き込み    
書き込みする値を初期化するところに問題があります。
簡単な原因ですからそこを修正して下さい。


27ポイント を手に入れた。

Name: み〜  ..上級者(21,695ポイント)   Date: 2007/03/17(土) 10:34   No:5700     
Title: Re:ファイルの読み込み書き込み    
miyazaさん!!できました!!成功です!!



27ポイント を手に入れた。

Name: み〜  ..上級者(21,864ポイント)   Date: 2007/03/17(土) 10:46   No:5701     
Title: Re:ファイルの読み込み書き込み    
先ほど、読み書きできたバイナリファイルを今度はランダムアクセスで読み取ろうと思ったのですが、
やはり失敗しちゃいますね〜。読み込むと1245028などとでてきてしまいます。

コードはコンパイルも警告もないのですが・・・。


#include <stdio.h>

int main(void) {
int a[10];

FILE *fp;
fp = fopen("test2.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fseek(fp,4,SEEK_SET);
fread(&a,sizeof(a),1,fp);


printf("%d",a);
fclose(fp);
return 0;
}



169ポイント を手に入れた。

Name: バグ  ..プログラマー(33,161ポイント)   Date: 2007/03/17(土) 10:52   No:5703     
Title: Re:ファイルの読み込み書き込み    
printf("%d",a);

これが原因ではないでしょうか?
aの先頭アドレスを表示しているようです。

printf("%d",a[n]);

のようにしないと変数の中身は見ることが出来ないです。


2倍のポイントを手に入れた! 116ポイント を手に入れた。

Name: み〜  ..上級者(21,914ポイント)   Date: 2007/03/17(土) 11:00   No:5704     
Title: Re:ファイルの読み込み書き込み    
バグさんおはようございます!!

printf("%d",a[n]);とすると、最初にint = n;と宣言してやったのですが、実行するとエラーに
なってしまいますね。。


50ポイント を手に入れた。

Name: miyaza  ..入門者(2,803ポイント)   Date: 2007/03/17(土) 11:02   No:5705     
Title: Re:ファイルの読み込み書き込み    
nに値は、入っていますか?

5ポイント を手に入れた。

Name: み〜  ..上級者(21,852ポイント)   Date: 2007/03/17(土) 11:47   No:5707     
Title: Re:ファイルの読み込み書き込み    
nに値をいれなくてもprinf("%d"a[1])とかすれば大丈夫ですよね?
int n=1;
printf("%d",a[1]);としても同じことですし。

でも、理解できないのが、fseek()で先頭から4バイト目を読み取るって指定してるじゃないですか。
a[]のなかに値を入れたらfseeku()ってほとんど意味なくなってしまうのではないですか??

一応、int n=1;としてprintf("%d",a[n]);としたら、3と出てきました。


62ポイント を落としてしまった。

Name: miyaza  ..入門者(2,840ポイント)   Date: 2007/03/17(土) 12:01   No:5708     
Title: Re:ファイルの読み込み書き込み    
fseek()をコメントアウトしてint i=1;としてprintf("%d",a[n]);としたらどうなりますか?

37ポイント を手に入れた。

Name: miyaza  ..入門者(2,975ポイント)   Date: 2007/03/17(土) 12:06   No:5709     
Title: Re:ファイルの読み込み書き込み    
> fseek()をコメントアウトしてint i=1;としてprintf("%d",a[n]);としたらどうなりますか?
fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?
間違えました。

バイナリファイルの中には様々な情報を格納していくことになるでしょう。そしてそれを必要としたとき指定した所から指定した大きさ分取り出すことができるのはとても便利なので、ランダムアクセスはとても意味のあることだと思います。


135ポイント を手に入れた。

Name: み〜  ..上級者(21,905ポイント)   Date: 2007/03/17(土) 12:12   No:5710     
Title: Re:ファイルの読み込み書き込み    
>fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?

やってみました。結果は2とでてきました。

これってどういうことでしょう?fseek()を使わなくても読み取れてしまいましたが・・・。


53ポイント を手に入れた。

Name: み〜  ..上級者(21,923ポイント)   Date: 2007/03/17(土) 12:17   No:5711     
Title: Re:ファイルの読み込み書き込み    
int i = 2; としてやったら今度は3がでてきて確かにしっかり読み込めています。。
でも、これではfseek()の意味がなくなってしまいますよな??


18ポイント を手に入れた。

Name: miyaza  ..入門者(3,061ポイント)   Date: 2007/03/17(土) 12:20   No:5712     
Title: Re:ファイルの読み込み書き込み    
fseek()はファイルポインタ位置を変えています。
つまりfseek(fp,4,SEEK_SET)としたときは、4バイト目からが開始位置となります。
fread()で実際に読みこんでいます。

だからfseek(fp,4,SEEK_SET)したときとfseek()をコメントアウトしたときでは、freadが読み込み始める位置が4倍と違います。だから2と3と結果が違うのは4バイト分のずれのせいです。


86ポイント を手に入れた。

Name: miyaza  ..入門者(3,179ポイント)   Date: 2007/03/17(土) 12:25   No:5713     
Title: Re:ファイルの読み込み書き込み    
たとえば4バイトずつナンバーを格納したバイナリファイルを作るとしましょう。
一人目の人のナンバー二人目の人のナンバー三人目の人のナンバーと連続で入っているとして、その中から3人目の人のナンバーだけ変数 int num にとり出せと言われたらどうしますか?


118ポイント を手に入れた。

Name: み〜  ..上級者(22,062ポイント)   Date: 2007/03/17(土) 12:32   No:5714     
Title: Re:ファイルの読み込み書き込み    
int型は4バイトですよね。すると、fseek(fp,4,SEEK_SET)とした時、配列でいうと何処が読み始める位置になるのですか?

[0][1][2][3][4][5][6][7][8][9]←添え字
[1][2][3][4][5][6][7][8][9][10] ←値

int i = 1
fseek(fp,4,SEEK_SET)
printf("%d",a[i]);
だと3と出てくる。。やっぱり、何処から読み込みはじめてるのか・・・。もやもやする。。


139ポイント を手に入れた。

Name: miyaza  ..入門者(3,236ポイント)   Date: 2007/03/17(土) 12:41   No:5715     
Title: Re:ファイルの読み込み書き込み    

fseek(fp,4,SEEK_SET)だと

[0][1][2][3][4][5][6][7][8][9] 添え字
[2][3][4][5][6][7][8][9][10]  値

こうなります。


57ポイント を手に入れた。

Name: み〜  ..上級者(22,102ポイント)   Date: 2007/03/17(土) 12:46   No:5716     
Title: Re:ファイルの読み込み書き込み    
理解できました!!!

fseek(fp,8,SEEK_SET)でint i =1;にした場合だと、4がでますよね。
づれているわけですね。


40ポイント を手に入れた。

Name: み〜  ..上級者(22,568ポイント)   Date: 2007/03/19(月) 09:30   No:5771     
Title: Re:ファイルの読み込み書き込み    
みなさんお久しぶりです。ファイルはだいぶできるようになったのですが、またまたつまずいています。

書き込みのコード

#include <stdio.h>

int main(void) {
int num[10] = {1,2,3,4,5,6,7,8,9,};
int i;

FILE *fp;
fp = fopen("test2.txt","wb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

for(i = 0; i < 10; i++){
fwrite(&num[i],sizeof(num[i]),1,fp);
}

fclose(fp);
return 0;
}


読み込みのコード

include <stdio.h>

int main(void) {
int num[10];
int i ;
FILE *fp;
fp =fopen("test2.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

for(i = 0; i < 10; i++) {
fread(&num[i],sizeof(num[i]),1,fp);
}

for(i = 0; i < 10; i++) {
printf("%d\n",&num[i]);
}

fclose(fp);
return 0;
}

うまく読み取れないのです。。


466ポイント を手に入れた。

Name: miyaza  ..入門者(3,285ポイント)   Date: 2007/03/19(月) 09:49   No:5773     
Title: Re:ファイルの読み込み書き込み    
読み取り表示部分
printf()でnum[i]のアドレスを渡しています。アドレスではなく値を渡してください。


49ポイント を手に入れた。

Name: み〜  ..上級者(22,648ポイント)   Date: 2007/03/19(月) 09:53   No:5774     
Title: Re:ファイルの読み込み書き込み    
miyazaさんお久しぶりです。毎回アドバイスありがとうございます。無事読み取りできました!!

少しずつではありますが、コードが書けるようになってきました。関数の引数なども調べればなんとかなってきています。だが、小さなミスが多すぎますね〜自分の場合。


80ポイント を手に入れた。

Name: み〜  ..上級者(22,650ポイント)   Date: 2007/03/19(月) 10:13   No:5776     
Title: Re:ファイルの読み込み書き込み    
今、バイナリファイルに文字列を書き込み、ランダムアクセスで特定の文字列を読み取ろうとしているのですが、苦戦中です。。なぜか、ファイルはできているのに書き込まれていないのです。。


#include <stdio.h>

int main(void) {
char ch[] = "hello";

FILE *fp;
fp = fopen("test.txt","wb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fwrite(&ch[],sizeof(char),1,fp);

fclose(fp);
return 0;
}


fwrite(&ch[],sizeof(char),1,fp);の部分で[]をはずすとコンパイルできるのですが、[]を付けると
C:\vc\RA_test2\rw_ex01.c(14) : error C2059: 構文エラー : ']'とでてしまいます。




2ポイント を手に入れた。

Name: miyaza  ..入門者(3,297ポイント)   Date: 2007/03/19(月) 10:19   No:5777     
Title: Re:ファイルの読み込み書き込み    
fwrite(ch,sizeof(ch),1,fp);
として下さい。


12ポイント を手に入れた。

Name: み〜  ..上級者(22,735ポイント)   Date: 2007/03/19(月) 10:22   No:5778     
Title: Re:ファイルの読み込み書き込み    
治してみました。確かにコンパイル実行もできました。ファイルには、hとしか書き込まれていませんでしたが、これでいいのでしょうか?一応、バイナリ形式で書き込んだつもりなのですが・・・

85ポイント を手に入れた。

Name: miyaza  ..入門者(3,313ポイント)   Date: 2007/03/19(月) 10:25   No:5779     
Title: Re:ファイルの読み込み書き込み    
こちらでは、helloと書き込めましたが。


16ポイント を手に入れた。

Name: み〜  ..上級者(22,657ポイント)   Date: 2007/03/19(月) 10:27   No:5781     
Title: Re:ファイルの読み込み書き込み    
そうですか。。もう一度試してみます!!
後、バイナリ形式で書き込んでいるので、普通は人間が見ても分からないような感じで書き込まれているのではないですか?普通にhelloと書き込まれていてもいいものなのでしょうか??


78ポイント を落としてしまった。

Name: み〜  ..上級者(22,890ポイント)   Date: 2007/03/19(月) 10:30   No:5782     
Title: Re:ファイルの読み込み書き込み    
もう一度コンパイルしたらエラーが出てしまいますね。。


#include <stdio.h>

int main(void) {
char ch[] = "hello";

FILE *fp;
fp = fopen("test.txt","wb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fwrite(ch,sizeof(char),1,fp);

fclose(fp);
return 0;
}


IBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。


233ポイント を手に入れた。

Name: miyaza  ..入門者(3,372ポイント)   Date: 2007/03/19(月) 10:31   No:5783     
Title: Re:ファイルの読み込み書き込み    
このファイルをバイナリエディタで開くと、68 65 6C 6C 6F 00 と書き込まれています。
68がh 65がe という感じです。


59ポイント を手に入れた。

Name: keichan  ..上級者(18,221ポイント)   Date: 2007/03/19(月) 10:32   No:5784     
Title: Re:ファイルの読み込み書き込み    


fwrite 関数の仕様を確認してください。

size_t fwrite(
const void *buffer, /* 書き込むデータへのポインタ */
size_t size, /* 項目のサイズ(バイト単位) */
size_t count, /* 書き込む最大項目数 */
FILE *stream
/* FILE構造体へのポインタ */
);

ですので、

fwrite(ch, sizeof(char), 1, fp);

では、
chの先頭アドレスから(ch)
1バイト単位で(sizeof(char))
最大1項目を(1)
FILEへ書き込み(fp)
となります。

ですから出力結果は'h'しか出力しない。ということが分かりますね?

では み〜さんが期待する出力をしたい場合はどうすればいいでしょうか?



347ポイント を手に入れた。

Name: み〜  ..上級者(22,927ポイント)   Date: 2007/03/19(月) 10:36   No:5785     
Title: Re:ファイルの読み込み書き込み    
keichan さんへ
・・・なんとなく分かります。いろいろ試してみます!!アドバイスありがとうございます!!


37ポイント を手に入れた。

Name: み〜  ..上級者(23,010ポイント)   Date: 2007/03/19(月) 10:40   No:5786     
Title: Re:ファイルの読み込み書き込み    
IBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
のエラーが解決できないですね・・・・。


83ポイント を手に入れた。

Name: miyaza  ..入門者(3,427ポイント)   Date: 2007/03/19(月) 10:47   No:5787     
Title: Re:ファイルの読み込み書き込み    
使っているのはVCですか?
だったらプロジェクトの設定がまずかったんだと思います。
もう一回プロジェクトから作り直してみてはどうでしょう。
main()がないと起こるエラーですが。


55ポイント を手に入れた。

Name: み〜  ..上級者(23,002ポイント)   Date: 2007/03/19(月) 10:47   No:5788     
Title: Re:ファイルの読み込み書き込み    
解決できました!!コンパイル実行もできました。ファイルにはhelloと書き込まれていました!!
バイナリファイルなのに、helloと書き込まれてていいのでしょうか?普通だったら、数字とかで書き込まれて
いるはずだと思うのですが。ちなみに、バイナリエディタというものはもっていないので普通のメモ帳を使用しています。


8ポイント を落としてしまった。

Name: miyaza  ..入門者(3,450ポイント)   Date: 2007/03/19(月) 10:49   No:5789     
Title: Re:ファイルの読み込み書き込み    
68 65 6C 6C 6F 00 このように書き込まれています。何を意味しているか分かりますか?

23ポイント を手に入れた。

Name: み〜  ..上級者(23,007ポイント)   Date: 2007/03/19(月) 10:50   No:5790     
Title: Re:ファイルの読み込み書き込み    
文字コードですか?

5ポイント を手に入れた。

Name: miyaza  ..入門者(3,538ポイント)   Date: 2007/03/19(月) 10:57   No:5791     
Title: Re:ファイルの読み込み書き込み    
> 文字コードですか?
そうです。

68がhを65がeをという感じになっています。(16進数です)
それをテキストファイルでは68をhという感じで解釈して表示しています。だからバイナリファイル形式で書き込んでもテキストファイルで開くと文字として出てきます。


88ポイント を手に入れた。

Name: み〜  ..上級者(23,020ポイント)   Date: 2007/03/19(月) 11:02   No:5792     
Title: Re:ファイルの読み込み書き込み    
なるほど!!!!

今度は、今書き込んだものをランダムアクセスで一文字だけ取り出そうとしています。


#include <stdio.h>

int main(void) {
char ch[6];

FILE *fp;
fp = fopen("test.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fseek(fp,2,SEEK_SET);
fread(&ch[6],sizeof(ch[6]),1,fp);

printf("%s\n",ch);

fclose(fp);
return 0;
}



読み取ると、フフフフフフとでてきてしまいますね。。


13ポイント を手に入れた。

Name: み〜  ..上級者(23,050ポイント)   Date: 2007/03/19(月) 11:05   No:5793     
Title: Re:ファイルの読み込み書き込み    
char形って1バイトですよね??
文字は2バイトになるのですか?


30ポイント を手に入れた。

Name: み〜  ..上級者(23,266ポイント)   Date: 2007/03/19(月) 11:06   No:5794     
Title: Re:ファイルの読み込み書き込み    
これでやったら h と出力されました。


#include <stdio.h>

int main(void) {
char ch[2];

FILE *fp;
fp = fopen("test.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

//fseek(fp,2,SEEK_SET);
fread(&ch[2],sizeof(ch[2]),1,fp);

printf("%c\n",ch[2]);

fclose(fp);
return 0;
}


216ポイント を手に入れた。

Name: み〜  ..上級者(23,285ポイント)   Date: 2007/03/19(月) 11:10   No:5795     
Title: Re:ファイルの読み込み書き込み    
できましたよ!!!!!!!!やった〜!!!!

19ポイント を手に入れた。

Name: miyaza  ..入門者(3,637ポイント)   Date: 2007/03/19(月) 11:10   No:5796     
Title: Re:ファイルの読み込み書き込み    
一文字でだけ読み取りたいのならchを配列で確保する必要はないと思います。
それに合わせて各部修正すればうまくいくと思います。

ローマ字は1バイトです。しかし日本語だったりすると2バイトになります。それ以外にもローマ字を2バイトであらわして日本語などの2バイトとのずれをなくす規格があったりします。


99ポイント を手に入れた。

Name: み〜  ..上級者(23,324ポイント)   Date: 2007/03/19(月) 11:17   No:5797     
Title: Re:ファイルの読み込み書き込み    
配列にする必要は確かにないですね。
仮に、3文字読み取る場合というのはどうするべきですかね??


#include <stdio.h>

int main(void) {
char ch[2];

FILE *fp;
fp = fopen("test.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fseek(fp,2,SEEK_SET);
fread(&ch[2],sizeof(ch[2]),1,fp);

printf("%c\n",ch[2]);

fclose(fp);
return 0;
}


このコードを実行したところ、「l」が出力されました。つまりfseek(fp,2,SEEK_SET);は先頭2バイト目から
ch[2]の中の値を読み取れというものですよね?

じゃあ、一文字だけでなく3文字指定した位置から読み取るとすると、・・・・どうやれば。。。


39ポイント を手に入れた。

Name: miyaza  ..入門者(3,697ポイント)   Date: 2007/03/19(月) 11:21   No:5799     
Title: Re:ファイルの読み込み書き込み    
まず3文字読み込むために配列は3つ必要ですね。
それからfseek()で読み込む位置まで移動してfread()で3文字分配列に格納してprintf()で表示します。


60ポイント を手に入れた。

Name: み〜  ..上級者(23,348ポイント)   Date: 2007/03/19(月) 11:21   No:5800     
Title: Re:ファイルの読み込み書き込み    
複数文字よみとるなら、配列にしてfor()でループ使うのがいいですかね??

24ポイント を手に入れた。

Name: miyaza  ..入門者(3,646ポイント)   Date: 2007/03/19(月) 11:26   No:5801     
Title: Re:ファイルの読み込み書き込み    
> このコードを実行したところ、「l」が出力されました。つまりfseek(fp,2,SEEK_SET);は先頭2バイト目から
ch[2]の中の値を読み取れというものですよね?

先頭2バイト目からch[2]の中の値を読み取れではなく、先頭2バイト目にファイルポインタをfseek()で移動してそれから1バイト分読み取ってそれをch[2]の中に格納しています。

あとchar ch[2]と宣言しているのでch[2]という配列はありません。実際に確保されるのはch[0]とch[1]です。


51ポイント を落としてしまった。

Name: Yuki  ..上級者(18,252ポイント)   Date: 2007/03/19(月) 11:28   No:5802     
Title: Re:ファイルの読み込み書き込み    
VC6をお使いでしたら、ファイルを開く際に「用途」を「バイナリ」にすれば
バイナリエディタとして見れますよ。

フリーソフトでよければ「Stirling」というソフトがおススメです。
http://www.vector.co.jp/soft/win95/util/se079072.html



2倍のポイントを手に入れた! 192ポイント を手に入れた。

Name: み〜  ..上級者(23,561ポイント)   Date: 2007/03/19(月) 11:29   No:5803     
Title: Re:ファイルの読み込み書き込み    
できました!!!3文字読み込み成功です!!!!「llo」とでてきました。
 
h e l l o
2バイト目に移動ということはeのところに移動してそこから読み込みを始めたということになるの??
このへんがよく分からなくなる・・・・。


#include <stdio.h>

int main(void) {
int i;
char ch[3];


FILE *fp;
fp = fopen("test.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fseek(fp,2,SEEK_SET);

for( i = 0; i < 3; i++){
fread(&ch[i],sizeof(ch[i]),1,fp);
}

for(i = 0; i < 3; i++){
printf("%c\n",ch[i]);
}

fclose(fp);
return 0;
}




213ポイント を手に入れた。

Name: miyaza  ..入門者(3,646ポイント)   Date: 2007/03/19(月) 11:29   No:5804     
Title: Re:ファイルの読み込み書き込み    
> 複数文字よみとるなら、配列にしてfor()でループ使うのがいいですかね??
とりあえず書いてみましょう。


Name: miyaza  ..入門者(3,687ポイント)   Date: 2007/03/19(月) 11:34   No:5806     
Title: Re:ファイルの読み込み書き込み    
2バイト目からというかファイルの先頭から2バイト進んだところからの読み込みです。
hが先頭で0なのでそこから1バイト先がe2バイト先がlとなっています。


41ポイント を手に入れた。

Name: み〜  ..上級者(23,553ポイント)   Date: 2007/03/19(月) 11:40   No:5807     
Title: Re:ファイルの読み込み書き込み    
なるほど!!

8ポイント を落としてしまった。

Name: むつ  ..初心者(6,312ポイント)   Date: 2007/03/19(月) 13:59   No:5816     
Title: Re:ファイルの読み込み書き込み    
現在のファイルポインタの位置を知りたいのであれば、ftell()を使います。
その前に、変数posを追加してください。※int型ではなくlong型です。
long pos;

fseek()の辺りに以下の行を追加してみてください。
これで、現在のファイルポインタの位置が変数posに格納され、なおかつ画面に表示されます。
ついでに、fseekのエラーチェックも追加しておきました。(fseekの戻り値 ok:0, error:-1 )

printf( "now pos > %ld\n", pos = ftell( fp ) );
if( fseek(fp,2,SEEK_SET) )
printf( "seekできません\n" );
printf( "now pos > %ld\n", pos = ftell( fp ) );


44ポイント を手に入れた。

Name: み〜  ..上級者(24,253ポイント)   Date: 2007/03/19(月) 14:03   No:5817     
Title: Re:ファイルの読み込み書き込み    
正しく読み込めていない・・・
テキストファイルには
1111

yamada

102222

suzuki

20

となっているのに、実際に読み込んでコンソールに出力させると、
NO:1111
NAME:yamada
yaer:102222
NO:suzuki
NAME:20
yare:-8589589というようにずれてしまったのだ。。


//書き込み用コード

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

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
struct seiseki student[2];
int i;
char buf[20];
FILE *fp;

fp = fopen("student.txt","w");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

for(i = 0; i < 2; i++) {
printf("%d人目\n", i + 1);
printf("NO:");
fgets(student[i].no,sizeof(student[i].no),stdin);
printf("NAME:");
fgets(student[i].name,sizeof(student[i].name),stdin);
printf("年齢:");
fgets(buf,sizeof(buf),stdin);
student[i].year = atoi(buf);
}

for(i = 0; i < 2; i++) {
fprintf(fp,"%s\n",student[i].no);
fprintf(fp,"%s\n",student[i].name);
fprintf(fp,"%d\n",student[i].year);
}

printf("書き込み終了\n");

fclose(fp);
return 0;
}



//読み込み用コード
#include <stdio.h>
#include <string.h>

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
struct seiseki student[2];
int i;

FILE *fp;
fp = fopen("student.txt","r");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

for(i = 0; i < 2; i++) {
fscanf(fp, "%s",&student[i].no);
fscanf(fp, "%s",&student[i].name);
fscanf(fp, "%d",&student[i].year);
}

for(i = 0; i < 2; i++) {
printf("%d人\n",i + 1);
printf("NO:%s\n",student[i].no);
printf("NAME:%s\n",student[i].name);
printf("year:%d\n",student[i].year);
}

fclose(fp);

return 0;
}

どこでまちがえているのだろ??


700ポイント を手に入れた。

Name: miyaza  ..入門者(3,666ポイント)   Date: 2007/03/19(月) 14:09   No:5818     
Title: Re:ファイルの読み込み書き込み    
テキストファイルの方に二人目のNOが無いからです。

21ポイント を落としてしまった。

Name: み〜  ..上級者(24,286ポイント)   Date: 2007/03/19(月) 14:13   No:5819     
Title: Re:ファイルの読み込み書き込み    
一体どういうことでしょう??
コンソールからは確かに書き込んでいるのですが・・・


33ポイント を手に入れた。

Name: miyaza  ..入門者(3,732ポイント)   Date: 2007/03/19(月) 14:21   No:5820     
Title: Re:ファイルの読み込み書き込み    
102222
ではなく

10
2222
としたかったのですか?

私のほうでは、正常に書き込まれて正常に読み込むこともできましたが。


66ポイント を手に入れた。

Name: み〜  ..上級者(24,327ポイント)   Date: 2007/03/19(月) 14:26   No:5821     
Title: Re:ファイルの読み込み書き込み    
できました!!!!!!

今度はこれをバイナリ形式で保存してみてランダムアクセスで特定の文字を出力させてみたいと思う
のですが、ちょっと難しいですかね??


41ポイント を手に入れた。

Name: keichan  ..上級者(18,335ポイント)   Date: 2007/03/19(月) 14:37   No:5822     
Title: Re:ファイルの読み込み書き込み    
>今度はこれをバイナリ形式で保存してみてランダムアクセスで特定の文字を出力させてみたいと思う
のですが、ちょっと難しいですかね??
いいえ、今までのやり取りの中で必要な知識は全て出ています。
try and error でやってみてください。


114ポイント を手に入れた。

Name: み〜  ..上級者(24,341ポイント)   Date: 2007/03/19(月) 14:42   No:5823     
Title: Re:ファイルの読み込み書き込み    
keichanさん了解です!!!
今、苦戦中!!!


14ポイント を手に入れた。

Name: み〜  ..上級者(24,657ポイント)   Date: 2007/03/19(月) 14:47   No:5824     
Title: Re:ファイルの読み込み書き込み    
コードはできてコンパイルもできていますが、正確に読み取れていないです。。

</pre>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
struct seiseki student[2];
int i;
char buf[20];
FILE *fp;

fp = fopen("student.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fseek(fp,0,SEEK_SET);
fread(&student[1].name,sizeof(student[1].name),1,fp);

printf("%s",student[1].name);

fclose(fp);
return 0;
}
</pre>

open
1111

10
フフフフフフ■↑とコンソールにでてきてしまう・・・

yamada




316ポイント を手に入れた。

Name: miyaza  ..入門者(3,742ポイント)   Date: 2007/03/19(月) 14:50   No:5825     
Title: Re:ファイルの読み込み書き込み    
書き込みソースを教えて下さい。

10ポイント を手に入れた。

Name: み〜  ..上級者(24,975ポイント)   Date: 2007/03/19(月) 14:51   No:5826     
Title: Re:ファイルの読み込み書き込み    

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

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
struct seiseki student[2];
int i;
char buf[20];
FILE *fp;

fp = fopen("student.txt","wb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

for(i = 0; i < 2; i++) {
printf("%d人目\n", i + 1);
printf("NO:");
fgets(student[i].no,sizeof(student[i].no),stdin);
printf("NAME:");
fgets(student[i].name,sizeof(student[i].name),stdin);
printf("年齢:");
fgets(buf,sizeof(buf),stdin);
student[i].year = atoi(buf);
}

for(i = 0; i < 2; i++) {
fprintf(fp,"%s\n",student[i].no);
fprintf(fp,"%s\n",student[i].name);
fprintf(fp,"%d\n",student[i].year);
}

printf("書き込み終了\n");

fclose(fp);
return 0;
}

これです。


318ポイント を手に入れた。

Name: むつ  ..初心者(6,460ポイント)   Date: 2007/03/19(月) 14:55   No:5828     
Title: Re:ファイルの読み込み書き込み    

Date: 2007/03/19(月) 14:03 の書き込み用コードにある
student[i].year = atoi(buf);
の直後に
student[ i ].no[ strlen( student[ i ].no ) - 1 ] = '\0';
student[ i ].name[ strlen( student[ i ].name ) - 1 ] = '\0';
を追加してください。
これで、余計な改行が消えると思います。


148ポイント を手に入れた。

Name: み〜  ..上級者(24,986ポイント)   Date: 2007/03/19(月) 15:04   No:5830     
Title: Re:ファイルの読み込み書き込み    
やっぱりむりですね〜

11ポイント を手に入れた。

Name: miyaza  ..入門者(3,851ポイント)   Date: 2007/03/19(月) 15:11   No:5832     
Title: Re:ファイルの読み込み書き込み    
読み込み時にstudent[1].nameの中に取り込んでますがなぜですか?
これだと、20バイト分student[1].nameのなかに詰め込まれて出力されています。もう少しやり方があると思うのでがんばって下さい。しかし今回は読み出すデータのサイズが不特定なので大変かもしれませんが。


109ポイント を手に入れた。

Name: み〜  ..上級者(24,995ポイント)   Date: 2007/03/19(月) 15:15   No:5833     
Title: Re:ファイルの読み込み書き込み    
了解です!!

9ポイント を手に入れた。

Name: み〜  ..プログラマー(25,009ポイント)   Date: 2007/03/19(月) 15:25   No:5835     
Title: Re:ファイルの読み込み書き込み    
ヒントがほしいです。。

14ポイント を手に入れた。

Name: み〜  ..プログラマー(25,026ポイント)   Date: 2007/03/19(月) 15:41   No:5837     
Title: Re:ファイルの読み込み書き込み    
うまくいかないです・・・・・・。

17ポイント を手に入れた。

Name: miyaza  ..入門者(3,833ポイント)   Date: 2007/03/19(月) 15:51   No:5838     
Title: Re:ファイルの読み込み書き込み    
データの構造を考え書き込み部分から見直していくべきです。

18ポイント を落としてしまった。

Name: み〜  ..プログラマー(25,040ポイント)   Date: 2007/03/19(月) 15:54   No:5839     
Title: Re:ファイルの読み込み書き込み    
書き込み部分からですか!!!!

14ポイント を手に入れた。

Name: miyaza  ..入門者(4,127ポイント)   Date: 2007/03/19(月) 16:09   No:5840     
Title: Re:ファイルの読み込み書き込み    
まあただ読み取って表示するだけなら下みたいなやつでもいいのかもしれませんが。


#include <stdio.h>

struct seiseki {
char no[10];
char name[20];
char year[10];
};

int main(void) {
struct seiseki student[2];
FILE *fp;
int i;

fp = fopen("student.txt","rb");
if(!fp) return 1;
else printf("open\n");

for(i=0;i<2;i++){
fscanf(fp,"%s",student[0].no);
fscanf(fp,"%s",student[0].name);
fscanf(fp,"%s",student[0].year);
printf("%s\n",student[0].no);
printf("%s\n",student[0].name);
printf("%s\n",student[0].year);
printf("\n");
}

fclose(fp);
return 0;
}


かなりいいかげんですが・・・

どうしたらデータを管理しやすくなるか考えてみるのも大事だとおもいます。


294ポイント を手に入れた。

Name: miyaza  ..入門者(4,150ポイント)   Date: 2007/03/19(月) 16:11   No:5841     
Title: Re:ファイルの読み込み書き込み    
間違えましたstudent[0]の部分student[i]です。

23ポイント を手に入れた。

Name: み〜  ..プログラマー(25,025ポイント)   Date: 2007/03/19(月) 17:06   No:5842     
Title: Re:ファイルの読み込み書き込み    
どうしてもランダムでやりたいのです・・・。

15ポイント を落としてしまった。

Name: miyaza  ..入門者(4,172ポイント)   Date: 2007/03/19(月) 17:10   No:5843     
Title: Re:ファイルの読み込み書き込み    
では、何バイトを境にデータが入っているのか分からなければなりませんね。

22ポイント を手に入れた。

Name: み〜  ..プログラマー(25,036ポイント)   Date: 2007/03/19(月) 17:27   No:5844     
Title: Re:ファイルの読み込み書き込み    
わけ分からなくなってきました。

11ポイント を手に入れた。

Name: jみ〜  ..ぴよぴよ(61ポイント)   Date: 2007/03/19(月) 17:29   No:5845     
Title: Re:ファイルの読み込み書き込み    

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

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
struct seiseki student[2];
//int i;
//char buf[20];
FILE *fp;

fp = fopen("student.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}

fseek(fp,0*(sizeof(student[0])),SEEK_SET);
fread(&student[0].name,sizeof(student[0].name),1,fp);

printf("%s",student[0].name);

fclose(fp);
return 0;
}

これでもだめでした。。


61ポイント を手に入れた。

Name: miyaza  ..入門者(4,185ポイント)   Date: 2007/03/19(月) 17:38   No:5846     
Title: Re:ファイルの読み込み書き込み    
> fseek(fp,0*(sizeof(student[0])),SEEK_SET);
0に何をかけても0にしかならないとおもいますが。


13ポイント を手に入れた。

Name: keichan  ..上級者(18,486ポイント)   Date: 2007/03/19(月) 17:38   No:5847     
Title: Re:ファイルの読み込み書き込み    
ファイルの読み書き云々より、言語としての基礎が不足しているのがヒシヒシと感じてきます。
良い書籍をお持ちでないのであれば
http://homepage3.nifty.com/mmgames/c_guide/index.html
の第1部の全ての練習問題を解き、解説を読んで理解を深めてみてください。

箸の持ち方を知らない人に箸で豆を掴めといっても無理な話なので
じっくりと基礎を固めて下さい。


151ポイント を手に入れた。

Name: むつ  ..初心者(6,650ポイント)   Date: 2007/03/19(月) 19:35   No:5849     
Title: Re:ファイルの読み込み書き込み    
 これまで経験したように、データファイルの中身がいつも変わるようだと、
その都度、プログラム全体を修正しなくてはいけなくなりますよね。
ですから、真っ先にデータファイルのルールを決めましょう。

 ・NOは数値のみか。何桁にするか。
 ・NAMEは記号や日本語を除くのか。何桁にするか。
 ・他にどんなデータをどんなルールで追加するのか。
 ・そして、一人分のデータを一行または、木構造で表すようにしませんか?


 極端な事を言えば、【プログラム】は手段で【データ】は財産かなと。
【データ】にルールを設けると、他の言語でも再利用できますよ。


190ポイント を手に入れた。

Name: み〜  ..プログラマー(25,067ポイント)   Date: 2007/03/19(月) 19:57   No:5850     
Title: Re:ファイルの読み込み書き込み    
コンパイルエラーはないけど、やっぱり読み取れない・・・・

31ポイント を手に入れた。

Name: み〜  ..プログラマー(25,074ポイント)   Date: 2007/03/19(月) 20:09   No:5851     
Title: Re:ファイルの読み込み書き込み    
どうしても読み取りたい。。。

7ポイント を手に入れた。

Name: miyaza  ..入門者(4,868ポイント)   Date: 2007/03/19(月) 20:09   No:5852     
Title: Re:ファイルの読み込み書き込み    
参考になるとは思えませんが、ソースを書いてみました。
読み込み部分では、一人目の人のNAMEだけを取得して表示しています。
何をどう書き込んでデータの中はどうなっているのか分からないと読み込みもできないと思います。

書き込みソース

#include <stdio.h>

#define NUM 2
typedef struct sdata{
int no;
char name[24];
int year;
}sdata;

int main(){
FILE *fp;
sdata ss[NUM];
int i;
char buf[8];

fp=fopen("test.dat","wb");
if(!fp){
printf("ファイルオープンエラー");
return 1;
}

for(i=0;i<NUM;i++){
printf("%d人目の入力\n",i+1);
printf("NO:>>");
fgets(buf,sizeof(buf),stdin);
rewind(stdin);
sscanf(buf,"%d",&ss[i].no);
printf("NAME:>>");
fgets(buf,sizeof(ss[i].name),stdin);
rewind(stdin);
sscanf(buf,"%s",ss[i].name);
printf("year:>>");
fgets(buf,sizeof(buf),stdin);
rewind(stdin);
sscanf(buf,"%d",&ss[i].year);
}
fwrite(ss,sizeof(ss),1,fp);

fclose(fp);
return 0;
}


読み込みソース

#include <stdio.h>

#define NUM 2
typedef struct sdata{
int no;
char name[24];
int year;
}sdata;

int main(){
FILE *fp;
sdata ss[NUM];

fp=fopen("test.dat","rb");
if(!fp){
printf("ファイルオープンエラー");
return 1;
}
fseek(fp,4,SEEK_SET);
fread(ss[0].name,sizeof(ss[0].name),1,fp);
printf("%s\n",ss[0].name);
return 0;
}





683ポイント を手に入れた。

Name: み〜  ..プログラマー(25,102ポイント)   Date: 2007/03/19(月) 20:18   No:5854     
Title: Re:ファイルの読み込み書き込み    
miyazaさんありがとうございます!!参考にして考えてみます!!

28ポイント を手に入れた。

Name: むつ  ..初心者(6,688ポイント)   Date: 2007/03/19(月) 20:21   No:5855     
Title: Re:ファイルの読み込み書き込み    

printf("%s",student[0].name);
上を下に変えて、今のポインタの位置と取ってきたデータを
ftell()で確認しながらソースを修正して下さい。
printf( "NOW FP-->%ld %s\n", ftell( fp ), student[0].name );



38ポイント を手に入れた。

Name: み〜  ..プログラマー(25,103ポイント)   Date: 2007/03/19(月) 20:47   No:5858     
Title: Re:ファイルの読み込み書き込み    
miyazaさんへ。
私の書いたコードと似ていますが、私とは何処が違うかわかりません。。集中がきれてしまった・・・。
混乱しすぎています。。


1ポイント を手に入れた。

Name: miyaza  ..入門者(4,882ポイント)   Date: 2007/03/19(月) 20:49   No:5859     
Title: Re:ファイルの読み込み書き込み    
実行できましたかね?

14ポイント を手に入れた。

Name: み〜  ..プログラマー(25,117ポイント)   Date: 2007/03/19(月) 20:50   No:5861     
Title: Re:ファイルの読み込み書き込み    
むつさんアドバイスありがとうございます。。

14ポイント を手に入れた。

Name: み〜  ..プログラマー(25,121ポイント)   Date: 2007/03/20(火) 05:56   No:5886     
Title: Re:ファイルの読み込み書き込み    
今日は、もう一度書き込みファイルから作り直して頑張ってみたいと思います!!!

4ポイント を手に入れた。

Name: み〜  ..プログラマー(25,251ポイント)   Date: 2007/03/20(火) 08:35   No:5892     
Title: Re:ファイルの読み込み書き込み    
おはようございます!!
miyazaさんの上のコードの中にあるrewind()は、ファイルの読み込み位置を先頭に戻すためのものですよね?
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??
今まで私はぜんぜん使っていなかったですしね。。
後、sscanfもmiyazaさんは使っていますね。sscanf,fscanf,scanfの違いってなんでしょう??


130ポイント を手に入れた。

Name: み〜  ..プログラマー(25,324ポイント)   Date: 2007/03/20(火) 09:20   No:5893     
Title: Re:ファイルの読み込み書き込み    

//書き込み
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
FILE *fp;
struct seiseki student[NUM];
int i;
char buf[10];

fp = fopen("student.txt","wb");
if(fp == NULL){
return 1;
}else{
printf("file open\n");
}

for(i = 0; i < NUM; i++) {
printf("%d人目\n",i + 1);
printf("NO >>");
fgets(student[i].no,sizeof(student[i].no),stdin);
printf("NAME >>");
fgets(student[i].name,sizeof(student[i]).name,stdin);
printf("year >>");
fgets(buf,sizeof(buf),stdin);
student[i].year = atoi(buf);
}
fwrite(student,sizeof(student),1,fp);

fclose(fp);
return 0;
}



//読み込み
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
FILE *fp;
struct seiseki student[NUM];
int i;
char buf[10];

fp = fopen("student.txt","rb");
if(fp == NULL){
return 1;
}else{
printf("file open\n");
}

fseek(fp,4,SEEK_SET);
fread(student[0].name,sizeof(student[0].name),1,fp);
printf("%s\n",student[0].name);

fclose(fp);
return 0;
}


実行したら Aと一文字だけでてきた。。
ちょおと違う・・・・。


73ポイント を手に入れた。

Name: miyaza  ..入門者(4,949ポイント)   Date: 2007/03/20(火) 09:51   No:5896     
Title: Re:ファイルの読み込み書き込み    

NO 10バイト
NAME 20バイト
YEAR 4バイト

一人あたりのデータの構造は上のようになっています。だから名前だけを読み込みたかったらfseek()で何バイト目から読み込めばいいでしょうか。


67ポイント を手に入れた。

Name: み〜  ..プログラマー(25,524ポイント)   Date: 2007/03/20(火) 09:57   No:5897     
Title: Re:ファイルの読み込み書き込み    
一応できました!!!!
でも、偶然できたって感じです。。

どこに何をchar型で書いたのかint型で書いたのかという事は大事ですね。そうしないと
目的の文字とか読み取れないし。

後、書き込みに関してはfwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?

自分の場あい、ファイルに書き込むときはfwriteをfor文でループさせて書いていただけ
なので。

とにかく、まだまだアヤフヤナ部分が多いでうす。

私が今まで書いてきたコードと、miyazaさんが書いてくれたコードの違いをしっかりと理解しないと・・。


200ポイント を手に入れた。

Name: miyaza  ..初心者(5,040ポイント)   Date: 2007/03/20(火) 10:53   No:5898     
Title: Re:ファイルの読み込み書き込み    
> miyazaさんの上のコードの中にあるrewind()は、ファイルの読み込み位置を先頭に戻すためのものですよね?
これを使うことによってどのような利点があるのでしょう?またどういう場合につかうのでしょう??

fgest()で入力していますが入力できる量を24バイトとしています。しかしそれを超えた量を入力しようとすると次の入力処理が正常に動作しません。それを防ぐためにrewind()を使って入力バッファをクリアしています。


91ポイント を手に入れた。

Name: み〜  ..プログラマー(25,636ポイント)   Date: 2007/03/20(火) 11:11   No:5899     
Title: Re:ファイルの読み込み書き込み    
miyazaさんおはようございます。

なんとかできましたが、まだまだダメですね。。

char buf[8]と宣言していますが、これをなんのために宣言したのかちょっと分からないですね。。
fwrite(ss,sizeof(ss),1,fp);の部分って結構大事ですよね?


2倍のポイントを手に入れた! 112ポイント を手に入れた。

Name: miyaza  ..初心者(5,098ポイント)   Date: 2007/03/20(火) 11:17   No:5900     
Title: Re:ファイルの読み込み書き込み    
> char buf[8]と宣言していますが、これをなんのために宣言したのかちょっと分からないですね。。
fgetsで読み込むのは文字列なので、いったんbufにいれてそれからsscanf()で整数を取り出して構造体に格納しています。

> fwrite(ss,sizeof(ss),1,fp)
はい。大事です。これが無ければ書き込めません。


58ポイント を手に入れた。

Name: み〜  ..プログラマー(25,663ポイント)   Date: 2007/03/20(火) 11:27   No:5901     
Title: Re:ファイルの読み込み書き込み    
> fwrite(ss,sizeof(ss),1,fp)
>はい。大事です。これが無ければ書き込めません。

確かにその通りですが引数部分のことだったのですが・・・。


27ポイント を手に入れた。

Name: miyaza  ..初心者(5,247ポイント)   Date: 2007/03/20(火) 11:36   No:5902     
Title: Re:ファイルの読み込み書き込み    
まず構造体
sdata ss[NUM];
と構造体を配列で宣言しています。

fwrite(ss,sizeof(ss),1,fp)

第一引数 ss これは構造体の配列の先頭アドレスを示しています。
第二引数 sizeof(ss) これは構造体配列のサイズです。したがって今回は(4+24+4)*2だから64バイトです。
第三引数 1 一回書き込みます。
第四引数 fp 書き込み先のポインタです。


149ポイント を手に入れた。

Name: miyaza  ..初心者(5,358ポイント)   Date: 2007/03/20(火) 11:40   No:5903     
Title: Re:ファイルの読み込み書き込み    
だから書き変えるとしたら

for(i=0;i<NUM;i++){
fwrite(&ss[i],sizeof(ss[i]),1,fp);
}

こんな感じでしょうか。

しかしこのやり方よりも
fwrite(ss,sizeof(ss),1,fp)
とした方がスマートだと思います。


111ポイント を手に入れた。

Name: み〜  ..プログラマー(25,740ポイント)   Date: 2007/03/20(火) 12:46   No:5904     
Title: Re:ファイルの読み込み書き込み    
miyazaさん毎回アドバイス&解説ありがとうございます!!

一つ目の構造体の人の名前は取り出せましたが、二つ目の構造体の人の
名前がうまく取り出せないですね。
fread(student[1].name,sizeof(student[1].name),1,fp);
printf("%s\n",student[1].name);としたのですけど。これではダメかな? ^^;


77ポイント を手に入れた。

Name: miyaza  ..初心者(5,373ポイント)   Date: 2007/03/20(火) 12:49   No:5905     
Title: Re:ファイルの読み込み書き込み    
fseek()の部分はどうしましたか?

15ポイント を手に入れた。

Name: み〜  ..プログラマー(25,769ポイント)   Date: 2007/03/20(火) 13:05   No:5906     
Title: Re:ファイルの読み込み書き込み    
fseek(fp,10,SEEK_SET);
最初のヤツを読み込んだときのままです。。


29ポイント を手に入れた。

Name: miyaza  ..初心者(5,699ポイント)   Date: 2007/03/20(火) 13:10   No:5907     
Title: Re:ファイルの読み込み書き込み    
それではファイルポインタの位置が一人目を読み込んだときと変わりません。
データは下のように入っています。

NO NAME YEAR NO NAME YEAR

と続けて二人分入っています。

だから二人目の名前にアクセスするにはfseek()をどう書き換えるか、考えて下さい。

10バイト20バイト4バイト10バイト20バイト4バイト




2倍のポイントを手に入れた! 326ポイント を手に入れた。

Name: み〜  ..プログラマー(25,774ポイント)   Date: 2007/03/20(火) 13:13   No:5908     
Title: Re:ファイルの読み込み書き込み    
了解!!

5ポイント を手に入れた。

Name: み〜  ..プログラマー(25,796ポイント)   Date: 2007/03/20(火) 13:17   No:5909     
Title: Re:ファイルの読み込み書き込み    
できました!!読み込み成功す!!ひとつの構造体のサイスをsizeof()で求めました。

22ポイント を手に入れた。

Name: み〜  ..プログラマー(26,466ポイント)   Date: 2007/03/20(火) 13:25   No:5910     
Title: Re:ファイルの読み込み書き込み    

//書き込みコード
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
FILE *fp;
struct seiseki student[NUM];
int i;
char buf[10];

fp = fopen("student.txt","wb");
if(fp == NULL){
return 1;
}else{
printf("file open\n");
}

for(i = 0; i < NUM; i++) {
printf("%d人目\n",i + 1);
printf("NO >>");
fgets(student[i].no,sizeof(student[i].no),stdin);
printf("NAME >>");
fgets(student[i].name,sizeof(student[i]).name,stdin);
printf("year >>");
fgets(buf,sizeof(buf),stdin);
student[i].year = atoi(buf);
}
fwrite(student,sizeof(student),1,fp);

fclose(fp);
return 0;
}


//読み込みコード
#include <stdio.h>
#include <stdlib.h>
#define NUM 2

struct seiseki {
char no[10];
char name[20];
int year;
};

int main(void) {
FILE *fp;
struct seiseki student[NUM];
//int i;
//char buf[10];

fp = fopen("student.txt","rb");
if(fp == NULL){
return 1;
}else{
printf("file open\n");
}

fseek(fp,10,SEEK_SET);
fread(student[1].name,sizeof(student[1].name),1,fp);
printf("%s\n",student[1].name);
printf("%d",sizeof(student[0]));
fclose(fp);
return 0;
}


fseek()の10のところを変えてやれば、確かに二つ目の構造体の名前部分を読み取れますが、
名前だけではなく、NOもfseekの中の数字を変えてやれば読み取れてしまいます。
せっかく、fread()のなかでstudent[].nameなどとしてるのになぜ??





670ポイント を手に入れた。

Name: miyaza  ..初心者(5,725ポイント)   Date: 2007/03/20(火) 13:31   No:5911     
Title: Re:ファイルの読み込み書き込み    
student.nameは、ただの入れ物です。
読み取ろうと思えば何でも読み取れます。


26ポイント を手に入れた。

Name: み〜  ..プログラマー(26,567ポイント)   Date: 2007/03/20(火) 13:32   No:5912     
Title: Re:ファイルの読み込み書き込み    
fseek(fp,1,SEEK_SET)とするとNO部分が読み取れてしまいます。
fread()でnameにしているのに・・・・・。確かに、fseek()で名前のところに持っていけば名前
もしっかり読み込めるのですが・・・・。nameのところに全部読み込んだものを入れてる感じになっちゃて
ますね^.^;


101ポイント を手に入れた。

Name: み〜  ..プログラマー(26,645ポイント)   Date: 2007/03/20(火) 13:34   No:5913     
Title: Re:ファイルの読み込み書き込み    
>>student.nameは、ただの入れ物です。
読み取ろうと思えば何でも読み取れます。

そうですか。。それなら別に、student.nameとしなくても、name部分はなんでもいいのですか??


78ポイント を手に入れた。

Name: miyaza  ..初心者(5,876ポイント)   Date: 2007/03/20(火) 13:40   No:5914     
Title: Re:ファイルの読み込み書き込み    
データの読み込みならこんなこともできます。

fread(student,sizeof(student),1,fp);

こうすることで構造体に綺麗にデータが入ります。

printf("%s\n"student[0].no);

と表示できます。

freadで読み込みこんでstudent[0].nameと指定したからといって読み込んだバイナリの情報がstudent[0].nameのデータかどうか判断して読み込むなんてことはfread()に不可能です。
ただ指定されたところから指定されたところにデータを指定された分だけ詰め込むだけです。


151ポイント を手に入れた。

Name: miyaza  ..初心者(5,910ポイント)   Date: 2007/03/20(火) 13:42   No:5915     
Title: Re:ファイルの読み込み書き込み    
> そうですか。。それなら別に、student.nameとしなくても、name部分はなんでもいいのですか??
そうです。

char buf[20];

fread(buf,sizeof(buf),1,fp);

とすることも可能です。


34ポイント を手に入れた。

Name: み〜  ..プログラマー(26,657ポイント)   Date: 2007/03/20(火) 13:58   No:5916     
Title: Re:ファイルの読み込み書き込み    
なんとなく分かってきた気がします。。

12ポイント を手に入れた。



Name: 名無し  ..ぴよぴよ(477ポイント)   Date: 2007/03/18(日) 12:34   No:5748       
Title: 画像の透明度を変えたいのですが    
LoadGraphなどで読み込んだ画像を半透明(背景が透けて見える)に表示するには
どうすればいいのでしょうか?
回答よろしくお願いしますm(_ _)m


24ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(236,458ポイント)   Date: 2007/03/19(月) 00:49   No:5765     
Title: Re:画像の透明度を変えたいのですが    
まったく同じ質問が同じ日にありました。
「半透明描画したいのですが…」のトピをご覧ください。

また、ブレンドモードにはいろいろあって、以下前トピの内容と同じものになりますが、

アルファブレンドやADDブレンド、輝度を下げた上書き描画などそれぞれ効果が違うので、いろいろ試してみてください。

なお、DXライブラリの輝度は元画像以上にはなりません。

「ゲーム完成しました☆」のトピで配布しているような、画面一面を白いフラッシュで覆うような処理は画面一面をアルファブレンドで白い四角形を書くことで実現できました。

よければ参考にしてください。

ブレンドの仕方がわからなければまた聞いてください。


271ポイント を手に入れた。

Name: 名無し  ..ぴよぴよ(554ポイント)   Date: 2007/03/19(月) 13:33   No:5812 解決!     
Title: Re:画像の透明度を変えたいのですが    
ほかの質問に目を通さないで質問してしまって申し訳ございませんorz
返答ありがとうございました!全部ためしてみます。
またわからないことがあったら教えてください。


77ポイント を手に入れた。

Name: むつ  ..初心者(6,268ポイント)   Date: 2007/03/19(月) 13:56   No:5814     
Title: Re:画像の透明度を変えたいのですが    
余裕があれば、「bitblt」「DIB」を検索してみてください。
dxlibには無い機能が欲しい時や、画像処理速度が気になる場合に役立つと思います。


Name: 名無し  ..ぴよぴよ(576ポイント)   Date: 2007/03/20(火) 09:21   No:5894     
Title: Re:画像の透明度を変えたいのですが    
情報ありがとうございます!
「bitblt」「DIB」も調べてみます。


22ポイント を手に入れた。



Name: りむ  ..中級者(12,357ポイント)   Date: 2007/03/16(金) 02:57   No:5586       
Title: PCゲームの仕様について    
おひさしぶりです。りむです。
自作ゲームですが、だいぶ形になってきました。操作も種類が増えてきました。

そんな今、ちょっと気になることが出てきました。
キーボードでゲームをする場合、
「↑・↓・←・→・Z・X・C」を使うゲームならいくつか遊んだことがあるのですが、
これらのキーにさらに別のキーを使っているPCゲームをやったことがありません。

そして現在、もうひとつ…出来れば2〜3個ぐらい使うキーを増やしたいのです。
その場合、どのキーを使うほうが自然でしょうか?
ちなみに現在のキー設定は、
↑:ジャンプ
←・→:左右移動(ダッシュ)
↓:しゃがみ
Z:防御
C:攻撃
X:技・魔法
です。あと、出来れば増やしたいキーの機能は、
「メニュー呼び出し」
「ターゲット切り替え(左回り・右回り)」
です。意見をお願いします。


また、アクションRPGゲームの仕様として、主人公のHPとMPは常に表示したいですよね。
ですがその表示する場所に困っています。
下手な位置に描くとマップが一部見えなくなって移動しづらくなったり、数値が見にくくなったりしてしまって…。
さらにオートで付随する味方も最大2人つける予定だったりします…。
マリオの様な2Dアクションフィールドなのですが、
HP・MPゲージ等はどの位置に描画するのが良いと思いますか?
こちらも意見お願いします。


311ポイント を手に入れた。


Name: バグ  ..プログラマー(32,621ポイント)   Date: 2007/03/16(金) 07:59   No:5589     
Title: Re:PCゲームの仕様について    
個人的な意見ですが…

ターゲットの切り替えは、移動しながらも操作できた方が良いでしょうから、Z、X、Cの近くに配置した方が操作がしやすいと思います。

メニュー呼び出しに関しては、移動入力とも、アクション入力とも、カチ合わないようにする為に、真ん中辺りという事で、スペースに割り当てては如何でしょうか?


135ポイント を手に入れた。

Name: むつ  ..初心者(6,103ポイント)   Date: 2007/03/16(金) 10:56   No:5607     
Title: Re:PCゲームの仕様について    
味方のHP、MPは画面左端、敵は右端に縦に表示させてはどうでしょうか。

(;_;)
HM
PP
||
 |
(´v`)
HM
PP
||
||
( _ _)
HM
PP   1P
 |   ○」
 |   「\」
      「 Σ(`ω´ )))=
−−−−−−−−−−−−−−−−


92ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(231,359ポイント)   Date: 2007/03/17(土) 01:55   No:5668     
Title: Re:PCゲームの仕様について    
個人的な意見ですが、Ecsは何かのキャンセル的な役割を、スペースキーはコントローラーのSELECT的な役割をさせることが私は多いです。

今回別とぴで紹介する私のゲームはASDを使用します。
本当にはっきりいって使いにくいです。
コントローラーで遊んでもらうことを前提に作ってあるのでキーボードの事はこれ以上あまり考えられません><
キーボードでは限界がありますよね(T_T
ということでZXCの次は私に限ってはASDを使用します。


213ポイント を手に入れた。

Name: りむ  ..中級者(12,478ポイント)   Date: 2007/03/20(火) 07:30   No:5887     
Title: Re:PCゲームの仕様について    
やはりみなさんいろいろ思うところがあるようで…。
キーのほうは、まとめると、
スペース・ESC・ASD・Shift・Ctrl
のようですね。コレを参考にしてみます。

あとライフゲージの位置ですが、画面左側に縦に、だとライフの数値を書いた場合によく見えないため、左下の位置に1人分だけまず描いてみました。
けっこういい感じなので、コレでいってみようと思いますー


121ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(239,872ポイント)   Date: 2007/03/20(火) 08:09   No:5890     
Title: Re:PCゲームの仕様について    
若干スタートキーの近くのキーは使わないほうがいい感じもしますが、
実際キーボードで操作するのはどこも結構難しいので悩みますよね。
AtlやCtrlを使用したゲームを作ったことありますが、
CtrlとAltの間に、押すと全画面処理に不具合をきたすスタートキーがあるのでよく押してしまいました。
その辺注意してくださいね。


119ポイント を手に入れた。



Name: kuroca  ..ぴよぴよ(281ポイント)   Date: 2007/03/12(月) 01:48   No:5330       
Title: DrawString    
初めまして、kurocaと申します。
よろしくお願いします。

入門編の6節のソースをコピペして実行してみたのですが、
描画される前にウィンドウが終了してしまいます。
デバッガで追ってみたのですが、どうもDrawString関数で
落ちてしまっているようです。

環境の問題かもしれませんが、何が起こっているか御存知の方がおりましたら
対処方法を教えていただけませんでしょうか。
実行環境は下記の通りです。

OS :WindowsXP Professional Ver.2002 SP2
CPU:Pentium4 3.00GHz
RAM:DDR1 1.0GB
GC :Radeon X1300 Series (VRAM 256MB)

コンパイルはBorlandC++ Compiler 5.5とBCC Developerを使用しています。
またDirectXのバージョンは9.0cです。
よろしくお願いします。


281ポイント を手に入れた。


Name: kuroca  ..ぴよぴよ(512ポイント)   Date: 2007/03/13(火) 01:07   No:5373     
Title: Re:DrawString    
入門編の6節のソースは以下の通りです。

====================================================================================================

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了


int White;
White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得

DrawString( 0, 0, "hello! DX Library!" , White); //文字列表示
DrawString(100,100, "こんにちは! DXライブラリ!" , White);//文字列表示


WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

====================================================================================================

最初のDrawString関数で、"Process Terminated"と表示されてしまいます。
ちなみにデバッガはTurboDebuggerを使用しています。


231ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(66,386ポイント)   Date: 2007/03/13(火) 05:55   No:5375     
Title: Re:DrawString    
 DXライブラリ内部の問題のようですのでこちらでは解答を得られにくいでしょう。

 開発元の掲示板で訊いてみて下さい。



#プロジェクトファイルか実行ファイルと同じディレクトリに log.txtというファイルはないですか?
 もしあればそのファイルを開いてみて下さい。
 何か問題の原因となるような異常が書かれているかもしれません。


136ポイント を手に入れた。

Name: バグ  ..プログラマー(32,299ポイント)   Date: 2007/03/13(火) 07:53   No:5376     
Title: Re:DrawString    
大丈夫だとは思うのですが…BCC用のDxLibを使っているかどうかも確認しておいた方がいいかもしれません。

37ポイント を手に入れた。

Name: kuroca  ..ぴよぴよ(752ポイント)   Date: 2007/03/14(水) 00:59   No:5430     
Title: Re:DrawString    
レスありがとうございます。

>Justyさま

アドバイスありがとうございます。
開発元の掲示板でも質問してみます。
また、御指摘の通り実行ファイルと同じディレクトリにAppLog.txtというファイルが生成されていました。
中身を確認した所、"GetGlyphOutline 関数が失敗しました"という記述がありました。
どうもこの処理が原因の様です。


>バグさま

はい、BCC用のDxLibを使用しています。
中身には手を加えていません。
プロジェクトと同じ階層の別フォルダに置いています。


240ポイント を手に入れた。

Name: kuroca  ..かけだし(1,240ポイント)   Date: 2007/03/20(火) 02:57   No:5884 解決!     
Title: Re:DrawString    
DXライブラリの管理人様に御回答をいただき解決しましたので、ご報告まで書き込みます。

原因は私のOSが英語版であったことと、コードの中でフォントの指定をしていなかったことです。
OSの初期設定フォントが日本語を解さないフォントであった為、フォント指定をしないで実行した
DrawStringが日本語を処理できずに終了してしまったようです。


対策としてはChangeFontやDrawStringなどの引数にフォントを指定してやる事。


それでもprintfDxでは画面が落ちてしまうようですが。
これはOSの設定フォントを変えた方が早いのかもしれません。

とりあえず解決しました。
皆様、ありがとうございました。


261ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(239,753ポイント)   Date: 2007/03/20(火) 08:07   No:5889     
Title: Re:DrawString    
あらら、ご回答できていなくてすみません、、、といってもOSが英語であることが原因だとは推測できませんでしたが^^;
逆にこちらが勉強になりました。
わざわざ報告していただきありがとうございます。


2倍のポイントを手に入れた! 164ポイント を手に入れた。



Name: ふぐお  ..入門者(3,598ポイント)   Date: 2007/03/19(月) 23:48   No:5877       
Title: 30日でできる! OS自作入門    
こんばんは、
言語とは関係ない話ですが、「30日でできる! OS自作入門」を読んだ人いますか?


31ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(238,700ポイント)   Date: 2007/03/20(火) 00:02   No:5878     
Title: Re:30日でできる! OS自作入門    
私は読んだこと無いのですが,以前この掲示板でも読んだという方がいらっしゃいました。
とてもおもしろい本だとおっしゃっていました。
http://www.amazon.co.jp/30%E6%97%A5%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B-OS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%B7%9D%E5%90%88-%E7%A7%80%E5%AE%9F/dp/4839919844
評価を見てもなかなかおもしろそうな本ですね。


114ポイント を手に入れた。

Name: ぽん太  ..中級者(12,510ポイント)   Date: 2007/03/20(火) 00:34   No:5879     
Title: Re:30日でできる! OS自作入門    
それついこないだ買いました^^
でも読んでません・・・・。


20ポイント を手に入れた。

Name: ぽん太  ..中級者(12,369ポイント)   Date: 2007/03/20(火) 00:37   No:5880     
Title: Re:30日でできる! OS自作入門    
個人的には最高の名著だと思います。
printfを使うより作りたい人向けです。
というか普段疑問に思っていたものが目からウロコの最高の代物です。
これは買って絶対に損はありません。断言します!!
ちなみに姉妹書か知りませんがCPUの創りかたというおちゃめな本も買ってしまいました。
この本の中で紹介されています。


141ポイント を落としてしまった。

Name: 管理人 [URL]  ..ハッカー(238,676ポイント)   Date: 2007/03/20(火) 01:14   No:5881     
Title: Re:30日でできる! OS自作入門    
それってアマゾンでセットで買ってくださいみたいに紹介されている本ではw

24ポイント を落としてしまった。

Name: ぽん太  ..中級者(12,319ポイント)   Date: 2007/03/20(火) 01:25   No:5883     
Title: Re:30日でできる! OS自作入門    
そうですw
CPUは学校で買って
OSは普通の本屋で買いましたw
どちらもまだ読んでいませんw
買うだけでいつも読まないんですw


50ポイント を落としてしまった。



Name: ダッシュ  ..中級者(11,388ポイント)   Date: 2007/03/19(月) 21:01   No:5862       
Title: 久しぶりにCの質問です。    
今日から春休みに入ったのですが、この期間を利用してダイエットでもして友達をあっと言わせようとしているダッシュです。なんとなく作ってみたくなったので、BMI測定器を作ってみたのですが・・・ちょっとおかしい。

取り合えず次の2つのソースを見てください。

一つ目

#include<stdio.h>
void main(){

float a,b,c,d,e;
printf("体重を入力してください。→");
scanf("%f",&a);
b=a/165/165*10000;
c=22-b;
d=22*165*165/10000;
e=d-a;
printf("あなたのBMIは%fです。\n",b);
printf("適正BMIまで後%f。\n",c);
printf("あなたの適正体重は%fkg。適正体重まで後%fkgです。\n\n",d,e);

printf("参考:日本人の適正BMI は22\n");



二つ目

#include<stdio.h>
void main(){

float a,b,c,d,e,f;
printf("体重を入力してください。→");
scanf("%f",&a);
printf("身長を入力してください。→");
scanf("%f",&f);
b=a/f/f*10000;
c=22-b;
d=22*f*f/10000;
e=d-a;
printf("あなたのBMIは%fです。\n",b);
printf("適正BMIまで後%f。\n",c);
printf("あなたの適正体重は%fkg。適正体重まで後%fkgです。\n\n",d,e);

printf("参考:日本人の適正BMI は22\n");
}

一つ目は「自分の体重が最初から入っている」もので、二つ目は「身長と体重が未知数」となっています。
しかし、やってることは同じはずなのに、適正体重と適正体重まで〜kgが少しずれてしまいます。

自分で分かってるところというか、あくまで想像なのですが、変数fの小数点以下に適当な数字が入ってしまうのではないだろうか?ということです。

原因ならびに対処方法を宜しくお願いします。

補足:たぶんご存知と思いますが、BMI=体重÷身長(m)÷身長(m)です


740ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(238,193ポイント)   Date: 2007/03/19(月) 21:06   No:5864     
Title: Re:久しぶりにCの質問です。    
まだ最初しか見ていないのですが,
b=a/165/165*10000;
この行,float型とint型の混合による計算がされています。
何か警告がでていませんか?
値が失われている可能性があります・・
のような警告がでてるのじゃないかと思います。
int型というのは,少数を含まない値の事です。
float型というのは少数を含む値のことです。
int型と混合して計算をすると少数が失われてしまいますので
計算結果が違ってきます。
float型の変数と一緒に計算するときは,
165

165.0f
のように書きましょう。


232ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(238,356ポイント)   Date: 2007/03/19(月) 21:09   No:5865     
Title: Re:久しぶりにCの質問です。    
ここの一番下を見てください。

http://www9.plala.or.jp/sgwr-t/c/sec13.html

何も付けずに
165.0
と書けばdouble型の意味になります。

また,実数型変数はfloat型をつかう意味があまりなく,double型をつかう方がいいので,
floatよりdoubleをつかった方がいいように思います。
doubleの方が精度も高く,処理も速いです。


163ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,723ポイント)   Date: 2007/03/19(月) 21:16   No:5869     
Title: Re:久しぶりにCの質問です。    
> b=a/165/165*10000;
> この行,float型とint型の混合による計算がされています。
> 何か警告がでていませんか?

警告は出ませんし、正しく計算します。
異なる型どうしの四則演算を行なうと、低い方の型を高い方に格上げし、
演算結果の型は高い方になります。


58ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,781ポイント)   Date: 2007/03/19(月) 21:18   No:5870     
Title: Re:久しぶりにCの質問です。    
> 一つ目
>d=22*165*165/10000;

右辺の計算をint型で行ない、結果の小数点以下を切り捨ててからdに代入しています。
そのために誤差が出ているのではないでしょうか。


58ポイント を手に入れた。

Name: Hermit  ..かけだし(1,951ポイント)   Date: 2007/03/19(月) 21:32   No:5871     
Title: Re:久しぶりにCの質問です。    
同じ事を書いていたので、編集しました。

削除は・・・・出来ないのか・・・


49ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(238,586ポイント)   Date: 2007/03/19(月) 21:34   No:5872     
Title: Re:久しぶりにCの質問です。    
そのようですね・・,ずっと低い方の型をわざわざあげて計算していました。
基本的なとこが全然わかってないようです。
すみません・・。


64ポイント を手に入れた。

Name: ダッシュ  ..中級者(11,478ポイント)   Date: 2007/03/19(月) 22:27   No:5873     
Title: Re:久しぶりにCの質問です。    
ああ、なるほど。intとfloatの違いですか。

intとfloatの違いでそうなることまでは分かったのですが、具体的にどのように直すのかが分かりません。intとfloatでは計算の仕方そのものが違うと言うことなのでしょうか?floatしか宣言してないのになぜintが出てくるのかが疑問です。


90ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,855ポイント)   Date: 2007/03/19(月) 22:35   No:5874     
Title: Re:久しぶりにCの質問です。    
> 具体的にどのように直すのかが分かりません。

> d=22*165*165/10000;

この式の右辺にある4つのint型(ここにint型があります。
何も、宣言した変数だけではありません)のうち、1つ以上に
小数点を付けてください。22. とか 22.0 のように。
4つ全部に小数点を付けるのが、形が美しいと思います。


74ポイント を手に入れた。

Name: ダッシュ  ..中級者(11,531ポイント)   Date: 2007/03/19(月) 22:54   No:5875 解決!     
Title: Re:久しぶりにCの質問です。    
やってみました。成功です。

>>宣言した変数だけではありません

やっと意味が分かりました。


助けていただいていつも本当に助かります。ありがとう御座いました。


53ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(68,649ポイント)   Date: 2007/03/19(月) 23:23   No:5876     
Title: Re:久しぶりにCの質問です。    
 全然本題ではないですが、

何も付けずに 165.0 と書けばdouble型の意味になります。
 これ意外と気付かずに引っかかるんですよね。
 私も fを付け忘れた為に数十倍速度が遅くなったりして何度痛い目を見たか。
 プロファイルしてはじめて気付いて、全ソース修正したなんてことも。
 くっっ、思い出すだけで涙が・・・。


181ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(238,730ポイント)   Date: 2007/03/20(火) 01:16   No:5882     
Title: Re:久しぶりにCの質問です。    
プロになるとプログラムのチェックにものすごい苦労しそうですね^^;

あ、Justyさん、前に言ってたボムマンですが、一応配布できるような形になりました。
他トピたててありますんで、よければみてください^^


54ポイント を手に入れた。



Name: へろへろ  ..ぴよぴよ(284ポイント)   Date: 2007/03/18(日) 22:45   No:5762       
Title: 音楽再生について    
質問です。
DXライブラリを使って開発をしているのですが、
再生位置の取得や再生位置の指定をどうしたらいいかわからずにいます。
DxLib.hファイル(Ver 2.21a)の中を見てみると
extern int SetStreamSoundCurrentPosition( int Byte, int SoundHandle ) ;
// サウンドハンドルの再生位置をバイト単位で変更する(再生が止まっている時のみ有効)
extern int GetStreamSoundCurrentPosition( int SoundHandle ) ;
// サウンドハンドルの再生位置をバイト単位で取得する
extern int SetStreamSoundCurrentTime( int Time, int SoundHandle ) ;
// サウンドハンドルの再生位置をミリ秒単位で設定する(圧縮形式の場合は正しく設定されない場合がある)
extern int GetStreamSoundCurrentTime( int SoundHandle ) ;
// サウンドハンドルの再生位置をミリ秒単位で取得する(圧縮形式の場合は正しい値が返ってこない場合がある)
などがあったのですがそのまま使ってよいのかよくわかりません
できれば説明お願いします。


269ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(236,546ポイント)   Date: 2007/03/19(月) 00:54   No:5766     
Title: Re:音楽再生について    
リファレンスページに載っていない関数ですね。

私はその関数を使ったことがないのですが、返り値を色々表示させてみたらいいのではないでしょうか?
正確な関数の仕様は製作者様にお聞きになったほうがはっきりすると思います。


88ポイント を手に入れた。

Name: へろへろ  ..ぴよぴよ(408ポイント)   Date: 2007/03/19(月) 20:50   No:5860 解決!     
Title: Re:音楽再生について    
DXライブラリ置場の掲示板のあるスレッドに
PlaySoundMem 関数にはリファレンスには載っていませんが、「先頭から再生するかどうか」を指定する第三の引数があり、これを FALSE にすることで停止した所から再生することが出来ます。
という回答がありました。
これで代用できそうなので使ってみます。
わざわざすいませんでした。


124ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(238,410ポイント)   Date: 2007/03/19(月) 21:13   No:5867     
Title: Re:音楽再生について    
解決報告ありがとうございます。
力及ばず申し訳ないですm(_ _)m


2倍のポイントを手に入れた! 54ポイント を手に入れた。



Name: みき  ..ぴよぴよ(158ポイント)   Date: 2007/03/18(日) 10:45   No:5744       
Title: 構造体 typedef    
typedefがいまいちよく理解できません。typedefを使うとstructを一々付けなくても済むとかいてあるのですが、よけい分かりにくくなってる気がします。

struct seiseki seito{
int no;
char nmae[20];
};
int main(void){
struct seiseki seito;
}
これが基本的な構造体ですよね。それでtypedefを使って宣言すると、

typedef struct seiseki{
int no;
char name[10];
}seiseki;

int main(void){
seiseki seito;
}

要するに、main()の中でstructを省略できるってこと??



158ポイント を手に入れた。


Name: バグ  ..プログラマー(33,243ポイント)   Date: 2007/03/18(日) 10:52   No:5745     
Title: Re:構造体 typedef    
そういう事です。

ちなみに、構造体の名前とは違う名前を付ける事も可能です。分かりにくくなるので、あまりやらない方が良いでしょうけど…(;^_^A

この機能、構造体を使う場所が少ない場合には有り難みが薄いでしょうが、多くなってくると便利に感じると思いますよ。


82ポイント を手に入れた。

Name: みき  ..ぴよぴよ(170ポイント)   Date: 2007/03/18(日) 11:47   No:5746     
Title: Re:構造体 typedef    
バグさんへ
ありがとうございます。


12ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(236,187ポイント)   Date: 2007/03/19(月) 00:45   No:5764     
Title: Re:構造体 typedef    
structを書かなくてよくなるってことですね。
ちなみに


typedef struct seiseki{ 

  int no;
  char name[10];
}seiseki;

int main(void){
  seiseki seito;

}


こうではなく、普通

typedef struct{ 

  int no;
  char name[10];
}seiseki_t;

int main(void){
  seiseki_t seito;

}


こう書きます。型の名前を変数名と混合しないように気をつけましょう。


247ポイント を手に入れた。

Name: バグ  ..プログラマー(33,140ポイント)   Date: 2007/03/19(月) 07:51   No:5769     
Title: Re:構造体 typedef    

typedef struct seiseki{
  int no;
  char name[10];
}seiseki;


あら、これはこれで正しいんではなかったですか?

最初のseisekiが構造体名で、最後のseisekiが置き換えられる名前っていう意味だと思ってました(;^_^A

私の中では#defineの構造体版だと解釈してたもので…?


103ポイント を落としてしまった。

Name: box  ..熟練のプログラマー(57,819ポイント)   Date: 2007/03/19(月) 09:43   No:5772     
Title: Re:構造体 typedef    

> あら、これはこれで正しいんではなかったですか?

はい、正しいです。むしろ、こちらの書き方の方がよいと思います。
自己参照型構造体を定義する場合、こちらの書き方でないとまずいからです。

> 私の中では#defineの構造体版だと解釈してたもので…?

#define と typedef とは、別の概念です。
#define : 単なる字句の置き換え
typedef : ある型の別名を作るイメージ


57ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(68,435ポイント)   Date: 2007/03/19(月) 11:29   No:5805     
Title: Re:構造体 typedef    
>私の中では#defineの構造体版だと解釈してたもので
 boxさんが書かれているとおり、役割が全く異なりますし。

 #defineはコンパイル処理の前半で行われ、文字通り「文字の置き換え」です。
 構文に関係なくマッチすれば置き換えるので、利点もありますが、逆に俗に言う副作用が生まれたりします。

 typedefは反対にコンパイル処理の後半で行われ、型に対して名前を定義します。
 型であれば何でも名前を付けられるので、「charへのポインターを返す関数へのポインターを返す関数へのポインターN個からなる配列」とかでも定義できます。
 昔C言語で行列計算をしていた頃は「16個からなる float/doubleの配列」を MATRIX型として定義して扱っていました。


 このあたりのニュアンスの違いが分かってくると、C言語の奥の深さが見えてくるかと思います。



>はい、正しいです。むしろ、こちらの書き方の方がよいと思います。
>自己参照型構造体を定義する場合、こちらの書き方でないとまずいからです。
 私も boxさんに1票。
 前方参照できた方が何かと便利なんで。


266ポイント を手に入れた。

Name: そら  ..ぴよぴよ(31ポイント)   Date: 2007/03/19(月) 12:42   No:5809     
Title: Re:構造体 typedef    
管理人さんが言いたかったのは、

XXX_t と後ろに _t をつけて、構造体であるということを明確にするのが一般的だよ

ということだと思います。

多分・・・


31ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(237,961ポイント)   Date: 2007/03/19(月) 14:58   No:5829     
Title: Re:構造体 typedef    
そらさん,ありがとうございます^^;
私が言いたかったのはそういうことだったのですが,最初からすっかり指摘された点を忘れていました^^;
すみません・・。
いつも自分の好きな使い方だけしてたんじゃだめですね〜><;


58ポイント を手に入れた。

Name: なぎ  ..中級者(14,003ポイント)   Date: 2007/03/19(月) 15:19   No:5834     
Title: Re:構造体 typedef    
typdef 一般の話になれば、抽象的な型定義のためには必須というところでしょうか。

例えば、ファイル操作でお世話になる、fopen() の返値は、FILE * 型ですが、そもそも、FILE 型自体が、ファイル操作に関連したデータをあつめた構造体です。
ただ、具体的にどんなデータが必要かは、実行環境により、OSにより様々です。
それでも、
FILE *fopen(const char *filename, const char *mode);
という一般形で関数を定義するためには、これを、FILE * 型という、抽象的な型を導入する必要があったわけです。
具体的には、実行環境に適切な形で、typedef されています。

しかも、FILE * は、「処理系で適切な形」であって、必ずしも、構造体である必要はありません。
ですから、構造体かもしれないし、単純型かも知れないし、といった可能性を統一的に(しかも安全に)覆い隠して、抽象的な FILE 型を提供するのには、 typedef が必要だったということになります。

また、size_t 型も、sizeof 演算子の返値として定義されています。
これも、処理系に応じて、適切なサイズの(多分)int 型に typedef されています。
ちょっと考えると、size_t など持ち込まなくても、int で良いような気がしますが、多分、int ではまかないきれないサイズの配列や構造体も意識されたのでしょう。





249ポイント を手に入れた。

Name: 組木紙織  ..初心者(5,739ポイント)   Date: 2007/03/19(月) 18:07   No:5848     
Title: 自己参照型構造体    
今までの話の流れとは少し違いますが気になったので書き込みさせてください。

>Name: バグ Date: 2007/03/19(月) 07:51
> typedef struct seiseki{
>   int no;
>  char name[10];
>}seiseki;

のコードに対して、
>Name: box Date: 2007/03/19(月) 09:43

>はい、正しいです。むしろ、こちらの書き方の方がよいと思います。
>自己参照型構造体を定義する場合、こちらの書き方でないとまずいからです。


とありますが、どうして自己参照型の構造体では上記のような書き方をしないといけない
のか?
が分かりません。

typedef struct seiseki{
  int no;
   char name[10];
struct seiseki * p_next;
}seiseki_t;


なぜこのような書き方はだめなのでしょうか?









258ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(68,468ポイント)   Date: 2007/03/19(月) 20:17   No:5853     
Title: Re:自己参照型構造体    
>size_t など持ち込まなくても、int で良いような気がしますが、
>多分、int ではまかないきれないサイズの配列や構造体も意識されたのでしょう。
 ですね。
 私が前に見たことある処理系では

int   4バイト
long   8バイト
void *  8バイト
size_t  8バイト

 てなのがありました。
 メンバ関数へのポインタのサイズなんて恐ろしくて調べていません(w


33ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,665ポイント)   Date: 2007/03/19(月) 21:05   No:5863     
Title: Re:自己参照型構造体    

> >自己参照型構造体を定義する場合、こちらの書き方でないとまずいからです。

ここで言っていた「こちらの書き方」とは、「構造体タグ名を書く書き方」のことでした。
バグさんのくだんの投稿における構造体定義は、自己参照型ではありません。

自己参照型でない構造体の場合、構造体タグ名を省略できます。書いてもかまいません。
自己参照型の構造体の場合、構造体タグ名が必要です。省略できません。
というわけで、自己参照型かどうかにかかわらず、いつでも構造体タグ名を書いておけば
間違いがない、ということであります。


148ポイント を手に入れた。

Name: 組木紙織  ..初心者(5,742ポイント)   Date: 2007/03/19(月) 21:12   No:5866     
Title: Re:自己参照型構造体    
書き込みありがとうございます。

構造体のタグ名の部分を見落としていて、
seiseki とseiseki_tの部分しか見ていませんでした。
ありがとうございます。


3ポイント を手に入れた。



Name: りょうすけ  ..ぴよぴよ(99ポイント)   Date: 2007/03/13(火) 15:41   No:5411       
Title: 二進数に変換    
下のソースの二進数に関数を一般的なのもに書き換えたいのですが、書き方が解りません。
9文字以内を無視する仕様になっていますが何桁でも入力できるように直したいです。
0〜256の範囲の整数で'0'〜'9'以外の文字が入力されたらエラーになる仕様ですが
if(dec >= 0 && dec <=255)と書いたのに255以上も処理されてしまいます。
どなたか分かる方教えていただけると助かります。よろしくお願いします。



#include <stdio.h>


void main(){
int data[1] = {0};
int i= 0;
int ch;
int cnt;
unsigned char dec;
char *print_bin(unsigned int);


printf("数値入力:");

while( (ch = getchar()) != '\n' ){ // 1件分の入力処理
if( i < 9 ){ // 9桁までを有効
if( ch >= '0' && ch <= '9' ){ // 数字文字
data[cnt] = data[cnt] * 10 + ch - '0';
}
else{
printf("Error!!:数字文字以外の入力\n");
return;
}
i++;
}
}
if( i == 0 ){ // 改行のみの入力
printf("Error!!:改行のみの入力\n");
return;
}

dec = data[0];
if(dec >= 0 && dec <=255){ //0-255の文字

printf("dec=%d hex=%x bin=%s\n", dec,dec,print_bin( dec ));

dec = dec >> 1;
printf("右に1ビットシフトdec=%d hex=%x bin=%s\n",dec,dec,print_bin( dec ));

dec = dec << 1;
printf("左に1ビットシフトdec=%d hex=%x bin=%s\n",dec,dec,print_bin( dec ));

dec = ~dec;
printf("全ビット反転dec=%#d hex=%#x bin=%s\n",dec,dec,print_bin( dec ));

}
else{
printf("Error!!:0-255以外の入力\n");
}
}

char *print_bin( unsigned int x ){
static char out[10];
unsigned int n, i, j;
n = 1<<7;
j = 0;
for( i=0; i<8; i++ ){
if( x&(n>>i) )
out[j]='1';
else
out[j]='0';
j++;
if( i%4==3 ){
out[j]=',';
j++;
}
}
out[j-1] = '\0';
return out;
}



99ポイント を手に入れた。


Name: keichan  ..上級者(17,334ポイント)   Date: 2007/03/13(火) 15:57   No:5413     
Title: Re:二進数に変換    
unsigned char型は 0〜255 までの数値しか扱えません。

変数decの型を int にすれば if(dec >= 0 && dec <=255) の処理は正常に動作するでしょう。

他にやってはいけない箇所が数点見られますが、それはトライ&エラーで考察してみてください。


2倍のポイントを手に入れた! 160ポイント を手に入れた。

Name: Blue  ..ぴよぴよ(62ポイント)   Date: 2007/03/13(火) 16:06   No:5414     
Title: Re:二進数に変換    
http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=view&no=1560
はどうなったのでしょうか?
できなくても先に進んでいくのでしょうか?
それとも、回答をもらえればそれでいいってことでしょうか?(自己中杉)


73ポイント を落としてしまった。

Name: りょうすけ  ..ぴよぴよ(181ポイント)   Date: 2007/03/13(火) 16:34   No:5415     
Title: Re:二進数に変換    
Blue様回答ありがとうございます。

http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?mode=view&no=1560 方もやっています。

両方とも課題として出ているので同時進行でやっています。



2倍のポイントを手に入れた! 82ポイント を手に入れた。

Name: 大阪慕情  ..ぴよぴよ(202ポイント)   Date: 2007/03/17(土) 11:08   No:5706     
Title: つまらないもんですが・・・・・・・・・    


#include <stdio.h>
#include <stdlib.h>
#define NUM 30
#define DC 2
#define ZERO 0
int main(void){
int ans=ZERO;
char ap[NUM],bp[DC]="01",*cp;
memset(ap,Ox00,NUM);
cp=&ap[NUM-1];
printf("INPUT=");scanf("%d",ans);
if(ans<=ZERO) return(ZERO);
while(ans!=1){
*cp=bp[ans%DC];
ans/=DC;
cp--;
}
printf("%s\n",*cp);
return(ZERO);
}


200ポイント を手に入れた。

Name: りょうすけ  ..ぴよぴよ(217ポイント)   Date: 2007/03/17(土) 13:15   No:5719     
Title: Re:二進数に変換    
大阪慕情さま、回答ありがとうございます。
scanfは使ってはいけない使用なので、getcharを使うとどうなるのでしょか。


36ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(235,226ポイント)   Date: 2007/03/17(土) 13:22   No:5720     
Title: Re:二進数に変換    
getchar関数を使えばいいとわかっているのならその関数についてまず調べてみてください。
このように調べればたくさん出てきます。

http://www.google.co.jp/search?hl=ja&q=getchar&lr=

while( (ch = getchar() ) != EOF ){

として取り込むのが一般的ですが、
最初はどうなっているのかわかりにくいので1行ずつ書いてみるといいでしょう。

getcharでとってきた1文字をchに代入し、それがエンドオブファイルじゃないかぎりループと言う意味です。


168ポイント を落としてしまった。

Name: りょうすけ  ..ぴよぴよ(773ポイント)   Date: 2007/03/17(土) 15:02   No:5725     
Title: Re:二進数に変換    
管理人様、返信ありがとうございます。
作り直したのですが、000と入力しても0に認識して表示されてしまいます。
どのように直せば直るでしょうか?

#include <stdio.h>

static char out[10];
void main(){
int data=0;
int i= 0;
int ch;
int cnt;
unsigned short dec;
void *print_bin(unsigned int);


printf("数値入力:");

while( (ch = getchar()) != '\n' ){ // 1件分の入力処理
if( i <=3 ){// 9桁までを有効
if( ch >= '0' && ch <= '9' ){ // 数字文字
data = data * 10 + ch - '0';
}
else{
printf("Error!!:数字文字以外の入力\n");
return;
}
i++;
}
else{
printf("Error!!:0-255以外の入力\n");
return;
}
}
if( i == 0 ){ // 改行のみの入力
printf("Error!!:改行のみの入力\n");
return;
}

dec = data;
if(dec >= 0 && dec <=255){ //0-255の文字
print_bin(dec);
printf("dec=%d hex=%x bin=%s\n", dec,dec,out);
print_bin(dec>>1);
printf("右に1ビットシフトdec=%d hex=%x bin=%s\n",dec>>1,dec>>1,out);
print_bin(dec<<1);
printf("左に1ビットシフトdec=%d hex=%x bin=%s\n",dec<<1,dec<<1,out);
print_bin(~dec);
printf("全ビット反転dec=%#d hex=%#x bin=%s\n",~dec,~dec,out);
}
else{
printf("Error!!:0-255以外の入力\n");
}
}

void *print_bin( unsigned int x){
int a[9] = {1,2,4,8,0,16,32,64,128};
int i;
out[9] = '\0';

for(i=8;i>=0;i--){
if(i==4){
out[i] = ' ';
continue;
}
if((x & a[i]) > 0){
out[i] = '1';
}else{
out[i] = '0';
}

}
}


556ポイント を手に入れた。

Name: りょうすけ  ..ぴよぴよ(797ポイント)   Date: 2007/03/18(日) 12:20   No:5747 解決!     
Title: Re:二進数に変換    
解決しました。皆さんありがとうございました。

24ポイント を手に入れた。

Name: プロのSEです。  ..ぴよぴよ(200ポイント)   Date: 2007/03/19(月) 20:44   No:5857     
Title: 無題    
意見ですが、ポインタや配列について、大阪慕情さんは、精一杯尽くした筈です。
質問者さんは、getchar()で質問するところを見ると、疑問符がついてしまいます。
プログラミングは、データを如何に読み取ってアルゴリズムを組み立てるかでその資質が、問われます。
すぐに書き込みをする前に、ある程度基本を勉強しましょう。
基本が、大切です。


200ポイント を手に入れた。



Name: parapara  ..かけだし(1,826ポイント)   Date: 2007/03/17(土) 10:25   No:5697       
Title: チェーンの解釈について    
独学で勉強してる者ですが、又分からない事が出てきており、困っております。

下記の状態なんですが,ご助言お願いします一方向チェーンなんですが。

#include<stdio.h> //一方向チェーン
#include<stdlib.h>
#include<string.h>
typedef struct person{
char name[20];
int age;
struct person *next;
}Person;
int main(void){
Person dmy={"",0,NULL};
Person *start=&dmy;
Person *wkdtp;
Person *ip;
char name[20],age_ss[6];
while(1){
printf("名前=");gets(name);
if(strcmp(name,"")==0)break;
printf("年齢=");gets(age_ss);
wkdtp=(Person *)malloc(sizeof(Person));
if(wkdtp==NULL){
printf("メモリ確保できません\n");
exit(EXIT_FAILURE);
}
strcpy(wkdtp->name,name);
wkdtp->age=atoi(age_ss);
for(ip=start;ip->next!=NULL;ip=ip->next){
if(wkdtp->age < ip->next->age){
wkdtp->next=ip->next;
ip->next=wkdtp;//*********ここ***********//
break;
}
}
if(ip->next==NULL){
ip->next=wkdtp;
wkdtp->next=NULL;
}
}
for(ip=start->next;ip!=NULL;ip=ip->next){
printf("%10s %3d\n",ip->name,ip->age);
}
return(EXIT_SUCCESS);
}

ip->next=wkdtp;だと前と次の間に新たにチェーンを埋め込もうとしてるのは分かるんですが、
でもこれだと、ip->nextだけじゃなく、ip->nextが表しているポインタも変わってしまうのではないかと思うのですが、
つまりwkdtpという先頭アドレスをもつ構造体(入ってきたのと次の二つ)が2個できてしまう。うまく説明できなくてすいません。


456ポイント を手に入れた。


Name: box  ..熟練のプログラマー(56,562ポイント)   Date: 2007/03/17(土) 21:49   No:5738     
Title: Re:チェーンの解釈について    

こんな絵でご理解いただけるでしょうか。

【リンクの付け替え前】

ip ip->next
+--------+ +--------+
| | -----------------------> | |
+--------+ +--------+

wkdtp
+--------+
| |
+--------+



【リンクの付け替え操作(その1)】
wkdtp->next=ip->next; の実行

ip ip->next
+--------+ +--------+
| | -----------------------> | |
+--------+ +--> +--------+
|
wkdtp |
+--------+ |
| | --+
+--------+



【リンクの付け替え操作(その2)】
ip->next=wkdtp; の実行

ip
+--------+ +--------+
| | --+ +--> | |
+--------+ | | +--------+
| |
| wkdtp |
| +--------+ |
+--> | | --+
+--------+


344ポイント を手に入れた。

Name: parapara  ..かけだし(2,279ポイント)   Date: 2007/03/18(日) 08:43   No:5742     
Title: Re:チェーンの解釈について    
返信ありがとうございます。

(その1)で一番右の奴がip->nextじゃないですか、
それもwkdtpには変わらないんでしょうか?
つまり下の図のように。それともアドレスはmallocにより固定的に
決まるから、変更不可能で変更しようとしても、何も起きないということでしょうか?
凄いお馬鹿な質問だったらごめんなさい。

【リンクの付け替え操作(その2)】
ip->next=wkdtp; の実行

ip wkdtp
+--------+ +--------+
| | --+ +--> | |
+--------+ | | +--------+
| |
| wkdtp |
| +--------+ |
+--> | | --+
+--------+


257ポイント を手に入れた。

Name: box  ..熟練のプログラマー(56,814ポイント)   Date: 2007/03/18(日) 08:57   No:5743     
Title: Re:チェーンの解釈について    
> (その1)で一番右の奴がip->nextじゃないですか、
> それもwkdtpには変わらないんでしょうか?

変わらないです。
wkdtpという、今回リスト構造に加えたい領域に対しては、
1)wkdtpから出て行くリンク
2)wkdtpに入ってくるリンク
の2本を適切につなぐ必要があります。

1)今回は、もともとの ip と ip->next との間に wkdtp をつなぎたいので、
wkdtp の次(つまり wkdtp->next)は、(もともとの)ip->next となります。
これが、
wkdtp->next = ip->next;
という文と対応します。

2)今回は、もともとの ip と ip->next との間に wkdtp をつなぎたいので、
ip の次(つまり、新しい ip->next)は、wkdtp となります。
これが、
ip->next = wkdtp;
という文と対応します。


なお、今回の図のような内容を貼り付ける際は、
図の前後を<pre>と</pre>タグ(カッコは半角)ではさんで、
レイアウトが崩れないようにしてください。
これらのタグではさまなかった場合、ブラウザは複数の空白を1つの空白と
みなしてしまい、レイアウトが崩れます。


252ポイント を手に入れた。

Name: parapara  ..かけだし(2,325ポイント)   Date: 2007/03/18(日) 16:56   No:5753     
Title: Re:チェーンの解釈について    
変わらない理由が知りたいんですが、駄目でしょうか?

2倍のポイントを手に入れた! 46ポイント を手に入れた。

Name: box  ..熟練のプログラマー(57,090ポイント)   Date: 2007/03/18(日) 18:29   No:5755     
Title: Re:チェーンの解釈について    
> 変わらない理由が知りたいんですが、駄目でしょうか?

リンクの付け替え操作は2段階に分かれています。
1段階目:今回リスト構造に挿入したい wkdtp から出て行くリンクを設定する
2段階目:wkdtp に入ってくるリンクを設定する

ここまではいいですか?


76ポイント を手に入れた。

Name: parapara  ..入門者(2,669ポイント)   Date: 2007/03/18(日) 19:05   No:5756     
Title: Re:チェーンの解釈について    
はい、それは分かるんですが、余分な動作ip->nextで

示される構造体のポインタが変わらない理由がしりたいんですが。
訂正したんですが、念のためもう一度書きます。しつこくてすいません。
Re:チェーンの解釈について
返信ありがとうございます。
(その1)で一番右の奴がip->nextじゃないですか、
それもwkdtpには変わらないんでしょうか?
つまり下の図のように。それともアドレスはmallocにより固定的に
決まるから、変更不可能で変更しようとしても、何も起きないということでしょうか?

【リンクの付け替え操作(その2)】
ip->next=wkdtp; の実行

ip wkdtp
+--------+ +--------+
| | --+ +--> | |
+--------+ | | +--------+
| |
| wkdtp |
| +--------+ |
+--> | | --+
+--------+




344ポイント を手に入れた。

Name: Hermit  ..かけだし(1,863ポイント)   Date: 2007/03/18(日) 21:16   No:5758     
Title: Re:チェーンの解釈について    
box さんの図を、ちょっと変更させてもらって、書いてみる。

【リンクの付け替え前】

ip ipNext
+-----------------+ +---------+
|ip->next = ipNext| --------------------------> | |
+-----------------+ +---------+

wkdtp
+--------------------+
|wkdtp->next = 未設定|
+--------------------+



【リンクの付け替え操作(その1)】
wkdtp->next=ipNext; の実行

ip ipNext
+-----------------+ +---------+
|ip->next = ipNext| --------------------------> | |
+-----------------+ +--> +---------+
|
wkdtp |
+--------------------+ |
|wkdtp->next = ipNext|---+
+--------------------+



【リンクの付け替え操作(その2)】
ip->next=wkdtp; の実行

ip ipNext
+----------------+ +--------+
|ip->next = wkdtp|--+ +--> | |
+----------------+ | | +--------+
| |
| wkdtp |
| +--------------------+ |
+-->|wkdtp->next = ipNext|--+
+--------------------+


659ポイント を手に入れた。

Name: box  ..熟練のプログラマー(57,762ポイント)   Date: 2007/03/18(日) 21:21   No:5759     
Title: Re:チェーンの解釈について    

> はい、それは分かるんですが、余分な動作ip->nextで
> 示される構造体のポインタが変わらない理由がしりたいんですが。

余分な動作は、何もありません。リンクを張り替えるために必要かつ不可欠な動作です。
先ほど書いた1段階目から、もう一度説明します。

1段階目:今回リスト構造に挿入したい wkdtp から出て行くリンクを設定する

ip ip->next
+--------+ +--------+
| | -----------------------> | |
+--------+ +--> +--------+
|
wkdtp |
+--------+ |
| | --+
+--------+

1段階目が終わった時点では、上図のようになります。
つまり、「そのときの」ip->nextが、wkdtpの「次」に来るようにしなければなりません。
そこで、ip->nextの値を、wkdtp->nextに代入します。
式で書くと、
wkdtp->next = ip->next;
です。
1段階目は、これで終わりです。ここまでは、いいでしょうか?


399ポイント を手に入れた。

Name: Hermit  ..かけだし(1,902ポイント)   Date: 2007/03/18(日) 21:21   No:5760     
Title: Re:チェーンの解釈について    
変になってる・・・削除が効かない

管理人さん・・・削除して(;_;)


39ポイント を手に入れた。

Name: parapara  ..入門者(2,687ポイント)   Date: 2007/03/19(月) 07:52   No:5770     
Title: Re:チェーンの解釈について    
はい、ここまでは大丈夫です。ここの時点で一番右の奴がip->nextなのに、
次の操作でwkdtpに変わらないのが疑問なんです。
すいません、迷惑をおかけして。


18ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,115ポイント)   Date: 2007/03/19(月) 09:59   No:5775     
Title: Re:チェーンの解釈について    

> はい、ここまでは大丈夫です。ここの時点で一番右の奴がip->nextなのに、
> 次の操作でwkdtpに変わらないのが疑問なんです。

リンクの張り替えの2段階目です。
2段階目:今回リスト構造に挿入したい wkdtp に入ってくるリンクを設定する

1段階目が終わった時点では、そのときの ip->next に向かっているリンクが2本あります。
ip から出ているリンクと wkdtp から出ているリンクです。
リンク張り替えの2段階目では、2本のリンクのうち、ip から出ているリンクだけを
張り替える必要があります。もう1本の、wkdtp から出ているリンクは、
1段階目で処理済のため2段階目で意識してはいけません。

張り替えた結果、1段階目終了時点の ip->next に成り代わって、wkdtp が
「新しく」「ipの次」になります。
「新しく」ということは、代入することを意味します。
「ipの次」は、文字通り ip->next のことです。
よって、2段階目の操作は、
ip->next = wkdtp;
となります。



296ポイント を手に入れた。

Name: box  ..熟練のプログラマー(58,637ポイント)   Date: 2007/03/19(月) 10:26   No:5780     
Title: Re:チェーンの解釈について    

少し補足します。

A B
+-----+ +-----+
| | | |
+-----+ +-----+

上図のように、リンクを張っていない状態から

A B
+-----+ +-----+
| | -----> | |
+-----+ +-----+

このようにリンクを張るということは、
Aの次をBにする、ということです。

ここで、いったんリンクのことを離れてみます。
「nを10にする」をC言語で表現すると、
n = 10;
となります。これはご理解いただけるでしょう。

リンクの話に戻ります。
「Aの次をBにする」をC言語で表現するということは、
「Aの次」にBを代入することです。
つまり、
A->next = B;
です。



2倍のポイントを手に入れた! 522ポイント を手に入れた。

Name: parapara  ..入門者(2,769ポイント)   Date: 2007/03/19(月) 15:38   No:5836 解決!     
Title: Re:チェーンの解釈について    
工夫を凝らした解答(その時点でのリンクの詳細)のお陰で、
なんとか分かりました。私の素朴な疑問にお付き合いさせてしまって、
ご迷惑をおかけして、すみませんでした。
またの機会がありましたら、よろしくお願いします。
長い時間ありがとうございました。


82ポイント を手に入れた。



Name: いさご  ..ぴよぴよ(267ポイント)   Date: 2007/03/18(日) 23:39   No:5763       
Title: 行数カウントについて質問です。    
こんばんは。いさごです。
getcharとEOFを使って、入力した文字数と行数カウントのプログラムの宿題が出ました。

#include<stdio.h>
int main (int argc, char **argv){

int nc=0;

while (getchar() != EOF){
nc = nc + 1;
}
printf("%d文字です\n");

return(0);
}

ここまでは出来たのですが、どういう風に行数をカウントすればいいのかよくわかりません。
\nを数えればいいとヒントに書いてあるのですが・・・。
どなたか教えてください。お願いします。


158ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(237,757ポイント)   Date: 2007/03/19(月) 01:13   No:5767     
Title: Re:行数カウントについて質問です。    
まず、こういうときは最初から着々と疑問点を解決していくところからはじめましょう。

int argc, char **argv

と書いていらっしゃいますが、今回は引数が関係ないので省略しましょう。
余計なものが書いてあると混乱する元になりますので。

#include <stdio.h>

int main(){
char ch;

//ここに処理を書いていく

return 0;
}



こういうスタンダードな形にしてやって、プログラムを作り始めましょう。

ではgetchar関数の仕様についてはいいでしょうか?
入力された文字列の最初の1つをとってきて返す関数です。
つまり関数を呼んで帰ってきた1文字が入力された1文字ですからその1文字を格納して出力してやればそれになります。

#include <stdio.h>

int main(){
char ch;
ch=getchar();

printf("入力された文字は「%c」です\n",ch);

return 0;
}



このプログラムをコンパイルして結果を確認してください。
1文字入力したり3文字入力したりしてください。

次にこれを実行してください。
#include <stdio.h>

int main(){
char ch1,ch2;
ch1=getchar();
ch2=getchar();

printf("入力された文字は「%c」と「%c」です\n",ch1,ch2);

return 0;
}


これも1文字入力したり3文字入力したりしてください。

getcharの仕組みがわかってきましたね。
そうです、入力を1文字ずつ取ってくる関数なわけです。

では、「0」が入力されたら処理を終了させるプログラムを書いてみます。


#include <stdio.h>
int main(){
char ch;

while(1){
ch=getchar();
if(ch=='0')
break;
}

return 0;
}


whileの条件の中にこれと同じ意味のことを書いてみます。


#include <stdio.h>
int main(){
char ch;

while((ch=getchar()) != '0'){

}

return 0;
}


おかきになったプログラムはこれがEOFつまりエンドオブファイルじゃない限りループとなったものです。
エンドオブファイルはリナックスならCtrl + D,ウィンドウズならCtrl+Zで入力できます。



#include <stdio.h>
int main(){
int i=0;
char ch;

while((ch=getchar()) != '0'){
if(ch=='1')
i++;
}

printf("1は%d回入力された。\n",i);

return 0;
}


それを拡張して、1が何回入力されたかを計測するプログラムがこれです。
0を入力すると終了します。

ここまで来れば後は簡単ですね。


1,211ポイント を手に入れた。

Name: いさご  ..ぴよぴよ(292ポイント)   Date: 2007/03/19(月) 01:42   No:5768 解決!     
Title: Re:行数カウントについて質問です。    
丁寧にありがとうございました!
学校では説明無しにこれを使いなさいと言われることが多いので、
仕組みが理解できてとても助かりました。
ありがとうございます。


25ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(237,903ポイント)   Date: 2007/03/19(月) 14:53   No:5827     
Title: Re:行数カウントについて質問です。    
理解していただけてよかったです。
プログラムの宿題って
「ん〜わからんもんはわからん!」
と投げてしまいがちですけど,プログラムってどんなに複雑に見える物でも
「最初から着々と」やっていけば結構できるものなんです。
最初から長いコードを書いたり,書いた物を渡されたりすると混乱してしまいますが
わからない関数やその部分があれば一つずつそれを理解していくことで解決できると思います。
これからも頑張ってください☆


146ポイント を手に入れた。



Name: バグ  ..プログラマー(32,872ポイント)   Date: 2007/03/16(金) 18:24   No:5644       
Title: 構造体のコピー    
最近になって気付いたのですが…

同じ構造体ならば、a = bみたいに記述すればコピーできるんですねぇ…。試してないですが、クラスもいけるかもしれません。

ひょっとして、これってVCだけの仕様なんでしょうか?他の環境だと使えないのでしょうか?

なんにせよ、ずっとmemcpy関数を使ってたので、ちょっとだけ得した気分です(笑)


102ポイント を手に入れた。


Name: GPGA  ..プログラマー(27,401ポイント)   Date: 2007/03/16(金) 18:33   No:5645     
Title: Re:構造体のコピー    
Cの標準化がなされる前(K&R時代)までは、「=」で構造体のコピーはできませんでしたが
今のCでは、標準で使えると思ってまったく問題ないと思います。

標準化がなされる前は関数の引数とかも特別で


int main(argc, argv)
int argc;
char *argv[];
{
reutrn 0;
}
 
という記述方法がありました。
今のCではこの記述は使えませんけどね。

と、その時代を生きていないのに、勝手に語ってみました。


161ポイント を手に入れた。

Name: Justy  ..比類無きプログラマー(67,998ポイント)   Date: 2007/03/16(金) 18:52   No:5646     
Title: Re:構造体のコピー    
>試してないですが、クラスもいけるかもしれません。
 基本的には(禁止指定されていなければ)クラスでも代入できますよ。

 ただ、クラスの中身によっては妙なトラップに引っかかるので、注意が必要です。

    class AAA

{
public:
AAA() : m_pValues(new int)
{ }
~AAA()
{ delete m_pValues;}

private:
int *m_pValues;
};


int main(void)
{
{
AAA a1;
AAA a2 = a1;
}
return 0;
}


 これ実行すると a2への代入の後の }あたりで・・・。



>memcpy関数を使ってたので
 逆に C++だと memcpyを使う機会はぐっと減りますね。
 PODタイプじゃないとクラスには使えませんから。


125ポイント を手に入れた。

Name: バグ  ..プログラマー(32,907ポイント)   Date: 2007/03/16(金) 19:00   No:5647     
Title: Re:構造体のコピー    
そういえば、少し前に仕事で、MS-Cで組まれたソフトの改造をしたのですが、そんな記述がされてました。

なんじゃこりゃ?

と思いましたが、納期が短かったので、そういう物なんだと無理矢理に納得して作業を進めましたが、そう書かなくてはいけなかったんですね。

謎が解けたのでスッキリしましたよ。ありがとうございました(^-^)


35ポイント を手に入れた。

Name: なぎ  ..中級者(13,754ポイント)   Date: 2007/03/19(月) 13:35   No:5813     
Title: Re:構造体のコピー    
でおくれましたが……

クラスの代入には、コピーコンストラクタというものが呼び出されます。

上のソースだと、

AAA::AAA(AAA&); // 同じクラスへの参照を引数にするコンストラクタ

という形のコンストラクタが呼び出されます。
これは、標準では、各メンバーをそのままコピーするような動作をします。
また、(クラスの代入を可能にするために)暗黙のうちに生成されてしまいます。

上記のような例だと、実際には、プライベートメンバーの差すものをもう一つ作って、そちらをポイントしたり、あるいは、同じ箇所をポイントしているという印をつけたりする必要がありますが、この場合、明示的に
AAA::AAA(AAA &);
を定義すればOKです。

また、そこまでしなくても、「間違って暗黙のうちに代入されてしまったら困る」場合には、
private:
AAA(AAA &);

で、代入はすべてエラーになります。

同じような「暗黙の代入」は、「他の型を単一の引数とするコンストラクタ」が定義されている時に発生します。

例えば、上記のソースで、
AAA::AAA(int); という形のコンストラクタがあると、
AAA a2;
a2 = 1;
などというのができてしまいます。

これを防止するためには、explicit をつけて、
explicit AAA::AAA(int) とすれば、

AAA a2(1); はOK
AAA a2 = 1; はエラー
になります。




515ポイント を手に入れた。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +