C言語何でも質問掲示板


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

規約と使い方

 
   無題   
     ・[11042] lip 
   VC++でのXMLの読み込み ....   
     ・[10948] YuO 
     ・[10961] たにさん 
     ・[10963] YuO 
     ・[11029] たにさん 
     ・[11030] たにさん 
   ファイルデータの読み ....   
     ・[10957] box 
     ・[10960] ビスタ 
     ・[10962] やそ 
     ・[10978] ビスタ 
     ・[10979] box 
     ・[10987] フリオ 
     ・[10989] フリオ 
     ・[10990] ビスタ 
     ・[11027] やそ 
   2進クイックソート、 ....   
     ・[10675] Hermit 
     ・[10680] zaku  
     ・[11026] 孫六 
   ヘッダファイル   
     ・[11007] box 
     ・[11012] 大工 
     ・[11013] tkmakwins15 
     ・[11015] 大工 
   csv読み込みのnullデー ....   
     ・[11009] box 
   教えてください・・・   
     ・[11005] 管理人 
   初心者なのですが・・ ....   
     ・[10973] 管理人 
     ・[11002] もずく 
   配列について   
     ・[10974] 管理人 
     ・[10980] 神魔 
     ・[10984] 管理人 
     ・[10995] 神魔 
     ・[10996] tkmakwins15 
     ・[10999] 神魔 
   DXLibの導入がうまくい ....   
     ・[10991] tkmakwins15 
     ・[10993] ほにゃー 
   無題   
     ・[10967] cygwin 
     ・[10968] たかぎ 
     ・[10969] cygwin 
     ・[10970] Justy 
     ・[10972] cygwin 
   CPU使用率を下げるには ....   
     ・[10931] 管理人 
     ・[10937] tkmakwins15 
     ・[10938] よっつん 
     ・[10939] Justy 
     ・[10940] 管理人 
     ・[10941] Justy 
     ・[10943] よっつん 
     ・[10944] Justy 
     ・[10945] よっつん 
     ・[10946] よっつん 
     ・[10947] Justy 
     ・[10951] tkmakwins15 
     ・[10971] よっつん 
   当たり判定   
     ・[10671] 管理人 
     ・[10674] ラウ 
     ・[10679] 管理人 
     ・[10952] ラウ 
     ・[10953] しりうす〜 
     ・[10955] 管理人 
     ・[10959] ラウ 
   フィルタ?の作り方  ....   
     ・[10956] Hermit 
     ・[10958] がんも 
   再びですが教えてくだ ....   
     ・[10929] 管理人 
     ・[10933] やそ 
     ・[10949] がんも 
   入門編の0からつまづ ....   
     ・[10935] たかぎ 
     ・[10936] 管理人 
   ネット上でプログラム ....   
     ・[10932] たかぎ 
   ファイルの入出力につ ....   
     ・[10895] tkmakwins15 
     ・[10926] がんも 
   アルゴリズム   
     ・[10872] 管理人 
     ・[10881] 紅 
     ・[10882] box 
     ・[10884] 紅 
     ・[10886] 管理人 
     ・[10887] box 
     ・[10899] 紅 
     ・[10925] やそ 
   初心者の質問   
     ・[10903] box 
     ・[10904] box 
     ・[10906] じゃっく 
     ・[10908] box 
     ・[10920] じゃっく 
     ・[10924] box 
   ストップウォッチ作成   
     ・[10916] 管理人 
     ・[10917] バグ 
     ・[10918] バグ 
     ・[10919] Hermit 
     ・[10921] tkmakwins15 
     ・[10923] ナナイ 
     ・[109151220498365] Jack 
   前回の続き   
     ・[10889] box 
     ・[10891] 大工 
     ・[10894] box 
     ・[10922] 大工 
   教えてください!   
     ・[10907] box 
     ・[10910] たまー 
     ・[10911] たかぎ 
     ・[10912] たまー 
     ・[10913] 管理人 
     ・[10914] たまー 
   画像の描画でエラーが ....   
     ・[10885] 管理人 
     ・[10888] 桃 
     ・[10890] 管理人 
     ・[10892] 桃 
     ・[10896] 管理人 
     ・[10900] Justy 
     ・[10901] 管理人 
     ・[10909] 桃 
   ファイル場所を変えた ....   
     ・[10758] 管理人 
     ・[10765] GPGA 
     ・[10897] 待竜 
     ・[10898] 待竜 
   分割コンパイルについ ....   
     ・[10880] 廉 
   ジャンプの高さ   
     ・[10883] 管理人 
   ポインタ   
     ・[10844] box 
     ・[10847] たかぎ 
     ・[10848] 大工 
     ・[10849] box 
     ・[10850] 大工 
     ・[10851] box 
     ・[10852] box 
     ・[10860] 大工 
     ・[10862] box 
     ・[10864] 大工 
     ・[10865] box 
     ・[10866] 大工 
     ・[10867] box 
     ・[10868] 大工 
     ・[10869] box 
     ・[10870] 大工 
     ・[10874] YuO 
   LINUXでC言語   
     ・[10822] YuO 
     ・[10834] cus 
     ・[10835] cus 
     ・[10838] 管理人 
     ・[10839] tkmakwins15 
     ・[10840] 通りすがり 
     ・[10842] cus 
     ・[10845] たかぎ 
     ・[10846] tkmakwins15 
     ・[10853] たかぎ 
     ・[10861] 管理人 
     ・[10873] 通りすがり 
   〜雑談or質問〜   
     ・[10720] Hermit 
     ・[10738] Sleepy 
     ・[10750] Yuki 
     ・[10752] 雷 
     ・[10754] 大工 
     ・[10759] 通りすがり 
     ・[10766] Hermit 
     ・[10768] Yuki 
     ・[10772] Sleepy 
     ・[10777] 雷 
     ・[10778] 管理人 
     ・[10786] Sleepy 
     ・[10788] 雷 
     ・[10832] Yuki 
     ・[10833] Yuki 
     ・[10863] Sleepy 
   文字が出ない。   
     ・[10855] バグ 
     ・[10856] box 
     ・[10857] じゃが 
     ・[10858] tkmakwins15 
     ・[10859] たかぎ 
   エラー終了するにはど ....   
     ・[10826] 管理人 
     ・[10831] ウババア 
     ・[10837] tkmakwins15 
     ・[10841] 管理人 
   コンパイラのバグ?が ....   
     ・[10792] Sleepy 
     ・[10793] Justy 
     ・[10797] 組木紙織 
     ・[10798] Justy 
     ・[10799] 組木紙織 
     ・[10800] Justy 
     ・[10801] 組木紙織 
     ・[10803] hoge 
     ・[10815] TT414 
     ・[10816] GPGA 
     ・[10836] 組木紙織 
   初めまして☆   
     ・[10830] KAZU 
     ・[108291198948793] たまご 
   簡単な野球のプログラ ....   
     ・[10762] 管理人 
     ・[10779] 管理人 
     ・[10780] 管理人 
     ・[10802] プーコ 
     ・[10804] プーコ 
     ・[10805] プーコ 
     ・[10806] プーコ 
     ・[10807] プーコ 
     ・[10809] プーコ 
     ・[10811] 管理人 
     ・[10812] プーコ 
     ・[10813] 管理人 
     ・[10818] 管理人 
     ・[10819] 管理人 
     ・[10823] 管理人 
     ・[10827] プーコ 
     ・[10828] 管理人 
   初めまして!   
     ・[10757] 管理人 
     ・[10825] HEAVEN 
   インターフェースクラ ....   
     ・[10717] たかぎ 
     ・[10820] KURO 
   べき乗剰余計算アルゴ ....   
     ・[10791] Sleepy 
     ・[10794] haku 
     ・[10795] Sleepy 
     ・[10796] haku 
     ・[10810] box 
     ・[10817] haku 
   配布するときのしかた   
     ・[10784] 管理人 
     ・[10785] レクサス 
     ・[10787] YuO 
   ロックマン   
     ・[10763] 管理人 
     ・[10767] 夏天 
     ・[10769] 管理人 
     ・[10770] バグ 
     ・[10771] 管理人 
     ・[10781] 夏天 
     ・[10783] 管理人 
   コンパイラの設定?   
     ・[10775] 管理人 
     ・[10776] ビスタ 
   return -1 ???   
     ・[10741] 管理人 
     ・[10755] 幻 
     ・[10760] 管理人 
     ・[10764] tkmakwins15 
     ・[10773] 幻 
   乱数のファイル出力、 ....   
     ・[10724] ビスタ 
     ・[10725] 管理人 
     ・[10726] 管理人 
     ・[10727] tkmakwins15 
     ・[10728] ビスタ 
     ・[10729] 管理人 
     ・[10730] tkmakwins15 
     ・[10731] ビスタ 
     ・[10735] 管理人 
     ・[10736] 管理人 
     ・[10744] 管理人 
     ・[10745] 管理人 
     ・[10746] 管理人 
     ・[10747] 管理人 
     ・[10748] 管理人 
     ・[10749] 管理人 

Name: lip  ..ぴよぴよ(93ポイント)   Date: 2007/10/07(日) 11:18   No:10876       
Title: 無題    
linuxもc言語も知識が乏しいものです。

質問なんですが、linuxでプロセス間でデータを
共有し、そのデータで場合分けを試みています。
(shm_open等使用しています。)

が・・うまくいきません。

例えば、共有メモリFLAG=3とします。
A,Bは同じプログラムでFLAGを-1をするプログラムです。
A、Bプロセスを1回ずつ実行すると、FLAG=1となります。
しかし、途中でAプロセスを強制終了した際には、メモリは
解放されず、FLAG=2とならず、結果FLAG=1となってします。

強制終了した際のメモリの解放することはできるのでしょうか?
私が書きたいプログラムは、複数プロセス間でフラグをたて、m個のプロセスしか実行しない
というプログラムです。セマフォなど使っても
うまくいきませんでした。
何かいい方法があれば、教えていただきたいです。

よろしくお願いします。




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


Name: lip  ..ぴよぴよ(102ポイント)   Date: 2007/10/15(月) 19:38   No:11042 解決!     
Title: Re:無題    
もう少し自分で調べてみます。


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



Name: たにさん  ..ぴよぴよ(538ポイント)   Date: 2007/10/10(水) 23:31   No:10942       
Title: VC++でのXMLの読み込み    
はじめまして!今、学校の課題でVisual C++.NET 2003でプログラムを書いています。

VC++にはXMLに関するクラスやメソッドが沢山用意されているらしいですが、
それについて質問があります(基本的なことでゴメンナサイ…;;

<doc>
  <会社 名前=○○株式会社>
    <社長>Aさん</社長>
    <部長>Bさん</部長>
    <課長>Cさん</課長>
  </会社>
  <会社 名前=有限式会社××>
    <社長>Dさん</社長>
    <部長>Eさん</部長>
    <課長>Fさん</課長>
  </会社>
</doc>

このようなXMLがあったとして、このXMLをファイルから読み込んで、
「会社」「社長」「部長」「課長」という名前の配列にそれぞれ格納したいです。

たとえば、「社長」には、AさんとDさんが入るようにしたいです。

参考書片手に調べてみたんですが、
配列を作り終えた段階で行き詰ってしまいました…。

具体的には、上から一列ずつ読んで行って、
最初に出てきたのが「<社長>Aさん</社長>」だったら、それを「社長」の配列に格納し、
次が「<部長>Bさん</部長>」だったら、「部長」配列に…という具合にしたいです。
たまに、部長が二人いたりする会社もあることを考えたいです。

つたない文章で申し訳ありませんが、
お分かりになる方がいたら、どうぞ宜しくお願いしますm(_ _)m


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


Name: YuO  ..中級者(13,471ポイント)   Date: 2007/10/11(木) 04:44   No:10948     
Title: Re:VC++でのXMLの読み込み    
IXMLDOMDocument::getElementByTagName (MSXMLの場合)
DOMDocument::getElementByTagName (Xerces-C++の場合)
System::Xml::XmlDcoument::GetElementByTagName (MC++/System.Xmlの場合)

あたりを使えば,要素名が"社長"だとか,"部長"だとかでとってこれます。


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

Name: たにさん  ..ぴよぴよ(685ポイント)   Date: 2007/10/12(金) 10:49   No:10961     
Title: Re:VC++でのXMLの読み込み    
ありがとうございます!
調べてみたところ、GetElementByTagName("社長")などのようにして
要素を取ってくるメソッドのようですね。
それを使って、if文などで条件指定は出来るのでしょうか?

if(もし要素名が"○○"だったら)
{
配列"○○"に格納
}

のようにしたいのですが…続けての質問で申し訳ありません。


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

Name: YuO  ..中級者(14,073ポイント)   Date: 2007/10/12(金) 11:51   No:10963     
Title: Re:VC++でのXMLの読み込み    
まずは修正から。
>> IXMLDOMDocument::getElementByTagName (MSXMLの場合)
>> DOMDocument::getElementByTagName (Xerces-C++の場合)
>> System::Xml::XmlDcoument::GetElementByTagName (MC++/System.Xmlの場合)

IXMLDOMDocument::getElementsByTagName (MSXMLの場合)
DOMDocument::getElementsByTagName (Xerces-C++の場合)
System::Xml::XmlDcoument::GetElementsByTagName (MC++/System.Xmlの場合)
と,(当然ながら)全部複数形です。

> それを使って、if文などで条件指定は出来るのでしょうか?
したければできますが,する必要はないでしょう。

お試し @ VC++2005 with /clr:pure option
#using "system.xml.dll"


using namespace System;
using namespace System::Xml;

void Write (XmlDocument^ doc, String^ target)
{
XmlNodeList^ list = doc->GetElementsByTagName(target);

Console::WriteLine(target);
for each (XmlElement^ element in list)
{
Console::WriteLine(L"\t{0}", element->InnerText);
}
}

int main ()
{
XmlDocument^ doc = gcnew XmlDocument();
doc->Load(L"test.xml");

Write(doc, L"社長");
Write(doc, L"部長");

return 0;
}

出力
社長

Aさん
Dさん
部長
Bさん
Eさん


一個ずつ処理したければ,要素をたどる方法になると思いますが……。
# それならDOMではなくSAXの方が効率が良さそうです。


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

Name: たにさん  ..ぴよぴよ(903ポイント)   Date: 2007/10/15(月) 14:09   No:11029     
Title: Re:VC++でのXMLの読み込み    
遅れて申し訳ありません。
お返事頂いてから、色々と試してみていたのですが、

for each (XmlElement^ element in list)
{
Console::WriteLine(L"\t{0}", element->InnerText);
}

のあたりが上手く動きません…(Debug::WriteLine()でやってます)

^ はポインタ…なのでしょうか?これを自分の環境のポインタ * に変えたりしても動きません…(汗
あと、elementの宣言はどこで行えば良いのでしょうか?

何度も質問して本当に申し訳ないです↓↓


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

Name: たにさん  ..かけだし(1,600ポイント)   Date: 2007/10/15(月) 15:06   No:11030     
Title: 書いてみたソース    
自分なりに、YuOさんやVisual Studio 2003.NETのヘルプを元に作ってみた
XMLの読み込み部分を一応書いてみます。

private: bool LoadXmlFile(String *path)
{
XmlDocument *doc = new XmlDocument();
doc->Load(path);

XmlElement *root = doc->DocumentElement;
XmlNodeList *alist = doc->GetElementsByTagName("agent");
IEnumerator *ienum = alist->GetEnumerator();

while(ienum->MoveNext()) {
XmlNode *agenta = __try_cast<XmlNode*>(ienum->Current);
Debug::WriteLine(agenta);
}

return true;
}

//XML読み込みボタン
private: System::Void menuItem5_Click(System::Object * sender, System::EventArgs * e)
{
Debug::WriteLine("XMLオープン");
OpenFileDialog *dlg = new OpenFileDialog();
dlg->Filter = "XML形式(*.xml)|*.xml|すべてのファイル(*.*)|*.*";
if(dlg->ShowDialog() != DialogResult::OK)
{
return;
}
LoadXmlFile(dlg->FileName);
}

下のXML読み込みボタンを押すと、上のLoadXmlFile()の処理を読み込むように作ってみました。

コンパイルは通り、ファイル読み込みのダイアログを呼び出すまでは正常に進むのですが、
ファイル名を指定して「開く」を押すと下のように表示されてエラーが出ます…。

-------------------------------------------------------------------------------------
System.Xml.XmlException' のハンドルされていない例外が system.xml.dll で発生しました。
追加情報 : システム エラーです。
-------------------------------------------------------------------------------------

以前挙げた「社長」や「部長」などではなく、このプログラムでは「agent」などの要素名です。
長くなってしまい申し訳ありませんが、宜しくお願いしますm(_ _)m


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



Name: ビスタ  ..かけだし(2,398ポイント)   Date: 2007/10/11(木) 18:39   No:10954       
Title: ファイルデータの読み込み    
学校の課題です。

・2つの、乱数正方行列データファイルを配列に読み込み、その配列を行列として和と積を求め、
 ファイル出力するプログラムを作成せよ。なお、行列データファイルの作成はプログラムを用
 いること。サイズは固定値を使わないこと。


C言語
OS:学校の演習室はLinuxですが家で確認するのでWindows vista
コンパイラ:Visual C++2005 Express Edition



以下のような2つのファイルに乱数正方行列データに見えるようなものを格納するプログラムを
作りました。行列計算の確認用に、乱数は0〜10の範囲にしてあります。



/*乱数行列ファイルrep2-1.txt,rep2-2.txt作成プログラム*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//初期化用


main(){
int rnd,i,j,n;

FILE *data;
FILE *data2;
data=fopen("rep2-1.txt","w");
data2=fopen("rep2-2.txt","w");

if(data==NULL){
printf("error!\n");
return;//異常終了
}

if(data2==NULL){
printf("error!\n");
return;
}

printf("Please one nutural number--->>");
scanf("%d\n",&n);

srand((unsigned)time(NULL));//rand初期化

for(j=0;j<n;j++){
for(i=0;i<n;i++){
rnd=rand()%10+1;
fprintf(data,"a[%d]=%d ",i,rnd);
}

fprintf(data,"\n");
}

for(j=0;j<n;j++){
for(i=0;i<n;i++){
rnd=rand()%10+1;
fprintf(data2,"a[%d]=%d ",i,rnd);
}

fprintf(data2,"\n");
}




fclose(data);
fclose(data2);
return 0;
}



で、もうひとつのプログラムでファイルのデータを読み込みたいのですが…

●fgetcとfgetsどちらを使うべきでしょうか?(他に使えるものがあればお願いします)

fgetsだと最大値が必要なのでそこでもつまづいてます。ファイルのデータが可変なので最大値の
取り方が分かりません。

●読み込んだデータの配列への組み込み方がわかりません。またそのデータを「利用して」計算
 するためにどうすればいいのかが分かりません。


ちょっとわからないことが多すぎますね……。どれかひとつでも解決すれば解けそうな気も
するのですが…。よろしくお願いします


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


Name: box  ..比類無きプログラマー(88,671ポイント)   Date: 2007/10/11(木) 20:32   No:10957     
Title: Re:ファイルデータの読み込み    

> fprintf(data,"a[%d]=%d ",i,rnd);

データを作る際、"a[何とか]=" の部分は必要でしょうか?

また、データを読み込むときのことを意識して、正方行列本体のデータの前に
行・列の数を出力しておくのは要求仕様に反しているでしょうか?

例えば、3行3列の場合、

3
8 5 1
2 0 7
5 4 2

のようなファイルを作って、読み込むときは最初に行・列の数を読みます。
最初の行を読んだときに、行列本体は3行3列であることが
わかるようになっています。



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

Name: ビスタ  ..入門者(2,569ポイント)   Date: 2007/10/11(木) 23:55   No:10960     
Title: Re:ファイルデータの読み込み    
boxさん、返答ありがとうございます。

> データを作る際、"a[何とか]=" の部分は必要でしょうか?
あ、それは前問のソースを書き換えただけなので残ってただけです;;

> また、データを読み込むときのことを意識して、正方行列本体のデータの前に
> 行・列の数を出力しておくのは要求仕様に反しているでしょうか?
それは大丈夫です。

> 最初の行を読んだときに、行列本体は3行3列であることが
> わかるようになっています。
そうですね。やってみます。



ここまででファイルのデータ読み込みの件は解決したと思います。
配列についてはまだ分からないことがあるので引き続きお願いします…。
ただ、自力で解けたら「解決」にマークしておきます。よろしくお願いします。


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

Name: やそ  ..かけだし(1,811ポイント)   Date: 2007/10/12(金) 11:27   No:10962     
Title: Re:ファイルデータの読み込み    
rnd=rand()%10+1;
だと1から10の乱数となりますね。

fgetcで変数cに読み込み、a[i][j]に格納する処理を考える。
'1'のときは'10'の可能性も有るのでoneというフラグを利用する。

----------------
各変数、配列の定義
ファイルポインターの定義
ファイルオープン

whileループ
ループ継続条件は
fgetcにて1文字読み込んだ結果がファイル終端(EOF)でない時

'\n'の時
 行末処理として
 行カウンターに1を足す 
 列カウンターを0にリセット

' '(スペース)の時
oneフラグが1なら
a[i][j]に1を格納する。
oneフラグを0クリア。
列カウンターに1を足す。

'1'の時
oneフラグに1を立てる。

'0'の時
oneフラグが1の時
a[i][j]に10を格納する。
oneフラグを0にリセット。
oneフラグが0の時(else)
a[i][j]に0を格納する。

上記のどれでもない時
a[i][j]にcを格納する。

whileループ終端

と言うフローでどうでしょうか?
このフローは最大値が10限定です。
10以上の数値(99など)の場合は通用しません。



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

Name: ビスタ  ..入門者(2,720ポイント)   Date: 2007/10/13(土) 11:11   No:10978     
Title: Re:ファイルデータの読み込み    
>>やそさん
レスありがとうございます。

>1から10の乱数となりますね。
あ、そうですね;;

要するにoneというフラグが1か0かで条件分岐させるんですよね?
適当に変数を指定して、そこに1か0を入れて分岐させるというこ
とですか?

あと2次元配列に値を代入するときに配列の宣言はどう記述したら
いいのでしょうか?やそさんのやり方だと配列のサイズの最大値が
必要ですよね?

それとも、「最大値が10以下」というのは配列のサイズのことですか?


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

Name: box  ..比類無きプログラマー(88,810ポイント)   Date: 2007/10/13(土) 11:43   No:10979     
Title: Re:ファイルデータの読み込み    
> あと2次元配列に値を代入するときに配列の宣言はどう記述したら

そのプログラムでは、最大何行何列までの正方行列に対応する
必要がありますか?

例えば、10行10列までに対応するのであれば、
a[10][10]
のように定義します。

このとき、11行11列以上の正方行列には対応できませんので、
入力ファイルの内容が11行11列以上であれば、
「計算できない」と出力してプログラムを即時に終了させるなどの
手だてが必要です。


行・列の数に制限がない場合は、malloc関数を使って
実行時に領域を確保し、あたかも配列と同じであるかのように
扱うことができます。
今回そこまで必要かどうかはわからないですけれど。


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

Name: フリオ  ..中級者(13,660ポイント)   Date: 2007/10/14(日) 08:10   No:10987     
Title: Re:ファイルデータの読み込み    
 
 指定した大きさの行列を作成してファイルに書き出し、
それを読み込んで表示します。参考になれば。


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

#define LIMIT 100

typedef enum {ZERO, RAND} FLAG;

int Alloc(int ***matrix, int n)
{
int i, j;

if(!(*matrix = malloc(sizeof(int *) * n))) return 0;
for(i = 0; i < n; i ++){
if(!((*matrix)[i] = malloc(sizeof(int) * n))){
while(!i) free((*matrix)[-- i]);
free(*matrix);
return 0;
}
}
return 1;
}

void Init(int **matrix, int n, FLAG flag)
{
int i, j;

if(flag){
for(i = 0; i < n; i ++){
for(j = 0; j < n; j ++) matrix[i][j] = rand() % LIMIT;
}
}
else{
for(i = 0; i < n; i ++){
for(j = 0; j < n; j ++) matrix[i][j] = 0;
}
}
}

int Write(int **matrix, int n, char *fname)
{
FILE *fp = fopen(fname, "w");
int i, j;

if(!fp) return 0;
fprintf(fp, "%d\n", n);
for(i = 0; i < n; i ++){
for(j = 0; j < n; j ++) fprintf(fp, "%d ", matrix[i][j]);
fputc('\n', fp);
}
fclose(fp);
return 1;
}

int Read(int ***matrix, int *n, char *fname)
{
FILE *fp = fopen(fname, "r");
int c, i, j;

if(!fp) return 0;
*n = 0;
while((c = fgetc(fp)) != '\n') *n = *n * 10 + (c - '0');
if(!Alloc(matrix, *n)){
fclose(fp);
return 0;
}
Init(*matrix, *n, ZERO);
for(i = 0; i < *n; i ++){
for(j = 0; j < *n; j ++){
while((c = fgetc(fp)) != ' ') (*matrix)[i][j] = (*matrix)[i][j] * 10 + (c - '0');
}
fgetc(fp);
}
fclose(fp);
return 1;
}

void Print(int **matrix, int n)
{
int i, j;

for(i = 0; i < n; i ++){
for(j = 0; j < n; j ++) printf("%2d ", matrix[i][j]);
putchar('\n');
}
}

void Delete(int **matrix, int n)
{
int i;

for(i = 0; i < n; i ++) free(matrix[i]);
free(matrix);
}

int main(void)
{
int **matrix0, **matrix1;
int n0, n1;

printf("n : ");
scanf("%d", &n0);
if(!Alloc(&matrix0, n0)) return 1;
Init(matrix0, n0, RAND);
puts("matrix0");
Print(matrix0, n0);
if(!Write(matrix0, n0, "test000.txt")){
Delete(matrix0, n0);
return 1;
}
Delete(matrix0, n0);
if(!Read(&matrix1, &n1, "test000.txt")) return 1;
puts("matrix1");
Print(matrix1, n1);
Delete(matrix1, n1);
return 0;
}


1,089ポイント を落としてしまった。

Name: フリオ  ..中級者(13,670ポイント)   Date: 2007/10/14(日) 10:48   No:10989     
Title: Re:ファイルデータの読み込み    
 
 "Init"関数で、"srand((unsigned)time(NULL))"を忘れてました。
 


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

Name: ビスタ  ..入門者(2,867ポイント)   Date: 2007/10/14(日) 14:36   No:10990     
Title: Re:ファイルデータの読み込み    
>boxさん
レスありがとうございます。今回、課題としては本来、行列のサイズは指定してもいいはず
なのですが評価が下がるので二次元配列にするときに配列を動的に確保したいんですよね…。
やはりmallocあたりを使わないといけないようです。

>フリオさん
詳細ソースありがとうございます。参考にさせていただきます!
calloc,mallocは知ってましたがAllocなんてのもあるんですね…メモリの動的確保って
C言語のサイトでも載ってるのが少なくて定義というか…稼動範囲?みたいなのが
よく分からないとか扱いが難しくて、どうも理解が追いつかないです;;


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

Name: やそ  ..かけだし(2,180ポイント)   Date: 2007/10/15(月) 11:19   No:11027     
Title: Re:ファイルデータの読み込み    
ビスタさんお疲れ様です。
boxさん、配列宣言の補足、ありがとうございます。
フリオさん、詳細なソース提示お疲れ様です&ありがとうございます。

が、正直、ビスタさんの質問されている内容から察するにフリオさんの提示したソースは
レベルが高いんじゃないかなあと思います。(私にもね・・・(笑))

また、「学校の課題」だそうですので、簡単に答えそのものを提示してしまうと課題の意味がないように思えたのであえて日本語でロジックを組んでみました。
ロジックは理解がしやすいようにあえて配列の要素数を10に抑えて作った訳です。(なんか言い訳っぽいですね)
まあ、mallocを知っているなら動的に配列確保も出来そうですね。

ビスタさん、フリオさんのソースのロジックが理解(解析)出来れば学校の課題レベルなんてお茶の子っすよ。
がんばってくださいね。


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



Name: 孫六  ..ぴよぴよ(484ポイント)   Date: 2007/09/27(木) 16:19   No:10672       
Title: 2進クイックソート、MSD・LSD基数整列法について    
学校の課題で、for文とif文、特殊な変数を使わずに、以下のプログラム作れと言われました。

まず2進クイックソート(便宜上の名称です)という2進数に変換してからクイックソートをするプログラムを作れと言われました。
2進数に変換するまでの過程は一応出来ました(10進数を2で割る→余り(0か1)を配列を使って一桁ずつ代入→出力)。
しかし、複数の数値を比較して、入れ替えるという過程がどうしても出来ません。


またMSD・LSD基数整列法は手も足も出ません。
なにかとクイックソートと関連性があるようなのですが、理解できません・・・
こちらは10進数で良いようです

MSD基数整列法は例えば456、9873、32という数値があった場合、
1000で割って余りを比較する→値を降順に入れ替える→余りが同じなら、同じ数値のやつだけ100で割って余りを比較するという流れでいいのですか?
また良いならプログラムを提示して頂けると非常に助かります。

LSD基数整列法に関しては全く分かりません・・・
一番下の桁から基数交換法で値を交換していけばいいのでしょうか・・・
自分でも何を言っているのか分かりませんが・・・

使っているOSはLinaxです


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


Name: Hermit  ..中級者(14,220ポイント)   Date: 2007/09/27(木) 20:00   No:10675     
Title: Re:2進クイックソート、MSD・LSD基数整列法について    
http://www.geocities.jp/m_hiroi/light/pyalgo07.html
は参考になるでしょうか?
google で簡単に出てきますけど。


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

Name: zaku  ..ぴよぴよ(132ポイント)   Date: 2007/09/28(金) 06:48   No:10680     
Title: Re:2進クイックソート、MSD・LSD基数整列法について    
#include <stdio.h>
#define NM 3/*配列データ長*/
#define ZERO 0/*制御用初期値*/
int main(void){/*プログラム本文*/
int ap[NM]={456,9873,32};/*基本データ*/
int ia,ib,wk;/*配列制御用変数とスタックポインタ*/
for(ia=ZERO;ia<NM;ia++){/*1000で割る処理*/
printf("%d ",ap[ia]);/*ソート前の配列表現*/
ap[ia]%=1000;/*実際の割り算処理*/
putchar('\n');/*改行処理*/
}
for(ia=ZERO;ia<NM-1;ia++){/*並べ替え第一ループ*/
for(ib=ia+1;ib<NM;ib++){/*並べ替え第二ループ(実際の比較処理用のループ)*/
if(ap[ib]<ap[ia]){/*単純比較*/
wk=ap[ia];/*退避*/
ap[ia]=ap[ib];/*挿入*/
ap[ib]=wk;/*退避挿入*/
}
if(ap[ib]==ap[ia]){/*数値が、同じなら*/
ap[ib]%=100;/*更に100で割る*/
ap[ia]%=100;/*更に100で割る*/
if(ap[ib]<ap[ia]){/*更に単純比較*/
wk=ap[ia];/*退避*/
ap[ia]=ap[ib];/*挿入*/
ap[ib]=wk;/*退避挿入*/
}
}
}
}
for(ia=ZERO;ia<NM;ia++) printf("%d ",ap[ia]);/*処理後の数値表現*/
putchar('\n');/*改行処理*/
retunr(ZERO);/*プログラム終了*/
}


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

Name: 孫六  ..かけだし(1,190ポイント)   Date: 2007/10/15(月) 11:11   No:11026     
Title: Re:2進クイックソート、MSD・LSD基数整列法について    
遅れて申し訳ありませんでした

>Hermitさん
レスありがとうございます
そちらのサイトは前から読んでいたのですが、それをプログラムに書き出すとなると、ちょっと。。。。
理論的にはすごく参考になっています

>zakuさん
レスどころかプログラムまで…ほんとにありがとうございます
ただごめんなさい。先生からは理論的に違うと指摘されました。
と言うのは9873を1000で割ってint型の変数に入れると「9」で比較出来るのですが、
9873を100で割ると「98」で比較してしまうので、MSD基数整列法ではないと言われました^^;

MSD基数整列法をプログラムで実現するには、どうやら二次元配列を用いて、

a[j][0] a[j][1] a[j][2] a[j][3]
a[0][n]  9   8    7   3
a[1][n]  0   4    5   6
a[2][n]  0   0    3   2

この状態でa[j][0]の列を比較して交換、a[j][1]の列を比較して交換、a[j][2]の列を比較して交換。。。
とした方が具合がいいようです

またMSD基数整列法なので、全てのソートが終わった時点で終了させなければならないみたいです…
これをforとifだけでと言われると、ちょっと追い付けないです…

LSDは逆にa[j][3]の列から比較していって、a[j][0]まで問答無用で比較していけばいいみたいです。

せっかく作って頂いたのに僕の知識と説明が至らず、本当に申し訳ありませんでした。


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



Name: 大工  ..上級者(23,094ポイント)   Date: 2007/10/14(日) 19:28   No:10998       
Title: ヘッダファイル    
自作ヘッダファイルを作って、その中に関数のプロトタイプ宣言を入れなくてもfunc2.cで定義したvoid function(void); がfunc.cで利用することが出来ました。

危険なことをしてそうなのは分かるのですがリンクの時点でコンパイラが都合を付けてくれているのでしょうか?

それともヘッダファイルには関数のプロトタイプ宣言はいらない??


ご協力おねがいします。

func.c

#include <stdio.h>

int main(void){

function();

return 0;
}


func2.c
#include <stdio.h>

void function(void) {

printf("これはテスト\n");
}




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


Name: box  ..比類無きプログラマー(89,037ポイント)   Date: 2007/10/14(日) 21:35   No:11007     
Title: Re:ヘッダファイル    
> 自作ヘッダファイルを作って、その中に関数のプロトタイプ宣言を入れなくても

その、「プロトタイプ宣言を書いていない自作ヘッダーファイル」を
見せていただくことは可能ですか?


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

Name: 大工  ..上級者(23,314ポイント)   Date: 2007/10/14(日) 22:42   No:11012     
Title: Re:ヘッダファイル    
すみません、それは作ってないです・・・

それは、stdio.h以外はなにもインクルードせずにという意味です。。。。

あと、上記がgccでコンパイルした結果なんですがBorlandだと"プロトタイプ宣言がない"とエラーで返ってきました。。。


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

Name: tkmakwins15 [URL]  ..プログラマー(30,025ポイント)   Date: 2007/10/14(日) 22:52   No:11013     
Title: Re:ヘッダファイル    
C言語の場合、プロトタイプ宣言は絶対ではないはずです。GCCは、ANSI Cに準拠しているので、これをエラーとはしないのだと思います。
しかし、BCCの場合は、C++のコンパイラなので、C++の規則である「プロトタイプの省略不可」が適用されたのだと思います。
ただし、Cでプロトタイプの省略を行うのは、やめておいたほうがいいと思います。


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

Name: 大工  ..上級者(23,418ポイント)   Date: 2007/10/14(日) 23:23   No:11015     
Title: Re:ヘッダファイル    
はい、わかりました。

ですが、このようなプログラムを書いてgccで通ったらこれで"正解"

そして、その間違いに気付かずに会社に就職

なんか怖いですね^^;

こんなことは無いと思いますが・・・・


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



Name: take  ..ぴよぴよ(102ポイント)   Date: 2007/10/14(日) 19:04   No:10997       
Title: csv読み込みのnullデータ    
csvファイルをそのまま構造体に読み込みたいのですが、
Nullデータがある時にズレます。

どうすればいいのでしょうか。。。。

よろしくお願いします!!

//--------------------------------------
//---------関数-------------------------
//--------------------------------------
int get_data(char* buff,
char* aaa, char* bbb, char* ccc, char* ddd, char* eee, char* fff, char* ggg, char* hhh,
char* iii, char* jjj, char* kkk, char* lll, char* mmm, char* nnn, char* ooo, char* ppp)
{
char* token;

//1
token=strtok(buff,",\n");
if ( NULL == token ){return 1;}
else{strcpy(aaa,token);}
//2
token=strtok(NULL,",\n");
if ( NULL == token ){return 1;}
else{strcpy(bbb,token);}
//3
token=strtok(NULL,",\n");
if ( NULL == token ){return 1;}
else{strcpy(ccc,token);}
//4


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


Name: box  ..比類無きプログラマー(89,114ポイント)   Date: 2007/10/14(日) 22:10   No:11009     
Title: Re:csv読み込みのnullデータ    
以下のとおり補足していただくことは可能でしょうか?

1)構造体の定義を含めた、今回の問題に関するすべてのソースコードの開示
2)Nullデータを含む、と書かれているCSVファイルの例示


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



Name: K子  ..ぴよぴよ(455ポイント)   Date: 2007/10/14(日) 21:05   No:11004       
Title: 教えてください・・・    
こんばんは☆
ただいまこのサイトを見せていただきながら、ゲームを作らせて貰ってます。

ちょっと分かんない所があるんですけど、誰か教えてくれませんか?

ちなみに私の家にあるパソコンは
  コンパイラ Visual C ++
OS    windows xp
です。

今、行けない場所を作るって所をやっているんですけど、

int hantei[20] = { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 } ;

int can_or_cannot(int x,int y,int muki){//進む方向が通れるか通れないかを判定
if(muki==1)//左向きなら
if(hantei[x/32-1]==1)//通れないなら
return 1;//エラー
if(muki==3)//右向きなら
if(hantei[x/32+1]==1)//通れないなら
return 1;//エラー
return 0;//正常
}
っていうプログラムあるじゃないですか、
そこで hantei[x/32-1]==1 の意味がちょっと分かんないんですけど・・・
なんか素人質問でごめんなさい (XoX)↓↓
誰か教えてくれませんか??


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


Name: 管理人 [URL]  ..伝説のハッカー(433,006ポイント)   Date: 2007/10/14(日) 21:21   No:11005     
Title: Re:教えてください・・・    

例えば今キャラが、(32)の座標にいるとしましょう。
ひとますが、(32pixel)で出来ているとします。すると
□■□
この真ん中のところにいますね?
この時、キャラの座標は
ch.x == 32
という事です。これは今どこの配列要素に属しているかというと、

hantei[ch.x/32] つまり hantei[1] に属しています。
[1]より左は[0]です。
左に向かって歩く時、自分のいる地点より左の配列要素に何が入っているかは
hantei[ch.x/32-1] つまり hantei[0] を調べればいいことになります。
つまり自分今いるとこより左を意味しているのです。

[0]に0がはいっていれば、進める、1が入っていれば進めないとすればいいのです。

ただこれにはエラー処理というか、付け加えなければならない部分があって、
自分の座標が0の時、配列要素番号[-1]をさしてしまう事になります。
同様に、プラスの方向も、用意した配列番号以上をささないようにしてください。




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



Name: もずく  ..ぴよぴよ(64ポイント)   Date: 2007/10/12(金) 14:34   No:10964       
Title: 初心者なのですが・・・    
現在、コンパイラ:Visual C++2005 Express Editionを用いて、プログラムを作らせていただいております。
これが楽しくて楽しくていまや、趣味の一部となっております。

さて、今はC言語〜プログラミングの館〜を見せていただきながら、簡単なRPGを作ろうとしてるのですが、敵に遭遇したときに、戦闘シーンに画面が切り替わるようなプログラムの作り方がどうしても分かりません。
例えば、scanf()を用いて、ファイルではなく新たなプログラムを読み込んで表示、というのも可能なのでしょうか?

私なりにやってみたのですが、なかなか上手くいきません・・・↓
こんな簡単なこと質問して申し訳ないのですが、もしよろしかったら教えていただけないでしょうか。
よろしくお願いいたしますm(v_v)m 


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


Name: 管理人 [URL]  ..伝説のハッカー(432,157ポイント)   Date: 2007/10/13(土) 02:07   No:10973     
Title: Re:初心者なのですが・・・    
つまり戦闘に入る時のエフェクトや演出がうまくいかないのでしょうか?

私もそこはよく考え込むところです。
単に画面が切り替わるだけじゃ味気ないので、色々工夫したいものです。
どこまで求めるかで難易度がかなり変わると思います。

最近こんな戦闘に入るエフェクトを作ってみました。
http://dixq.net/zip/RPG.zip

ソースも一緒に公開している、簡単な演出のものもあります。
http://dixq.net/zip/rpg14.zip

解凍したら実行ファイルをダブルクリックしてください。

上のものはポリゴンを使っています。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R3N22

案しだいでどんな演出でもできるでしょう。
ゲーム紹介で説明している私がはじめて作ったRPGでは、戦闘にはいる瞬間、
Drawboxをらせん状に内側に高速に増加させて表示させることで、吸い込まれるような演出をしました。

色んなゲームを見てパクってみるのもいいと思います。
私は
http://www.youtube.com/watch?v=thT4OJwRKHk
こちらの1:29あたりの演出を参考にしました。
あと、プログラムを読み込むという意味がよくわかりません。


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

Name: もずく  ..ぴよぴよ(127ポイント)   Date: 2007/10/14(日) 20:12   No:11002     
Title: Re:初心者なのですが・・・    
ありがとうございました。大変参考になりました。
また何か分からないところがありましたら質問させていただきます。
私もいつか管理人さんみたいにすんごいゲーム作ってみたいです☆


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



Name: 神魔  ..入門者(2,883ポイント)   Date: 2007/10/12(金) 19:11   No:10965       
Title: 配列について    
どうも、お久しぶりです。
以前、DXライブラリが学校でうまく起動せず、一回は諦めましたが家では正常に動作したのでまたDXライブラリにお世話になっております。
課題研究では人工無脳というものを自分なりに作ってみようと思い、現在製作しております。
そのなかで、配列に格納された文字列の中からキーワードを探し、もしもキーワードと一致するものがあれば特定の文字列を出力する、というプログラムを作っております。
しかし半角文字ではうまくいくのですが、全角文字ではうまくいきません。
ポインタを使わなければいけないのかなぁ、なんて思いやってみたのですが結果は同じでした。
いくら考えても解決策が思いつかなかったので質問させていただきます。




#include "DxLib.h"
#include <string.h>
#pragma warning(disable : 4267)
#pragma warning(disable : 4996)
void hitori(void);
void aikotoba(void);
char *K;
char name[31],hatugen[40];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理


SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定



if(CheckHitKey(KEY_INPUT_LSHIFT)==1){
printfDx("%s>",name);
KeyInputString(380,0,33,hatugen,FALSE);
printfDx("%s\n",hatugen);
aikotoba();
}





WaitKey(); // 何かキー入力があるまで待つ
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

void aikotoba(void){
SetDrawScreen( DX_SCREEN_BACK ) ;

K=hatugen;

while(*K != '\0'){
if(*K=='?'){
printfDx("柳葉魚>それは内緒のさくらんぼです。\n");
goto hell;
}
K++;
}

hell: ;


};




上のプログラムは現在作っているものの一部です。
このプログラムでは左のシフトキーを押し、発言権を得てから半角の"?"を入力すると"柳葉魚>それは内緒のさくらんぼです。"と出力するプログラムです。
一回配列に文字列を格納し、それをポインタ変数に渡して調べます。
これは正常に動くのですが、if(*K=='?')の''内のキーワードにあたる部分を全角文字にするとうまくいきません。
どうすれば全角文字でも反応してくれるようになるのでしょうか?
どなたか教えてください。


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


Name: 管理人 [URL]  ..伝説のハッカー(431,820ポイント)   Date: 2007/10/13(土) 02:47   No:10974     
Title: Re:配列について    
このプログラムはコンソール出力ではダメなのでしょうか?
後、SetDrawScreen( DX_SCREEN_BACK ) ;は一度だけ呼べばOKです。
それと繰り返し描画を行っていないので、裏画面に設定する必要がありません。
このプログラムは動くと仰っていますが、一瞬で処理が終わるため、シフトキーを押している暇が無いのと、nameに何も入っていないのと、描画反映関数が無いので描画されないので思った処理が出来ていないのではないでしょうか。

'?'を'?'に、つまり全角にするとうまくいかないのは、シングルコーテーションで半角文字を囲むとそれが文字コードを表すからです。

printf("%d ", 'a');
printf("%d ", 'b');
printf("%d ", '1');
printf("%d ", '2');

これらを出力してみるとその意味がわかります。全角文字は2バイトで扱われていますから、配列2つ分両方一致しないとその文字が一致するかどうか判定出来ません。

char c[] = "?";

として、c[0]とc[1]が両方検索対象に一致するか調べる必要があります。
printfDxしか使わないならコンソール画面でも同じことが出来ますし、もしDXライブラリを生かした処理がしたいなら裏画面設定をし、ループ処理させて入力の監視、描画をしてみるといいと思います。

DXライブラリの使い方についてはゲームプログラミングの館にて紹介していますし、本家リファレンスページなどにも詳しく載っていますのでよければ参考にしてください。


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

Name: 神魔  ..入門者(3,147ポイント)   Date: 2007/10/13(土) 21:35   No:10980     
Title: Re:配列について    
管理人様、ありがとうございます!!!
そうか全角って2バイトでしたね。
学校では半角の数値か文字でしかやってなかったので気付きませんでした…。
でもこれで前に進めそうです、本当にありがとうございました!!!


>それと繰り返し描画を行っていないので、裏画面に設定する必要がありません。
>このプログラムは動くと仰っていますが、一瞬で処理が終わるため、シフトキーを押している暇が無いのと、nameに>何も入っていないのと、描画反映関数が無いので描画されないので思った処理が出来ていないのではないでしょ>うか。

えっとですね、載せたプログラムは一部でして…。
全部載せようかとも思ったのですがプログラムが整理されていなくて見にくいと思い、必要と思われる部分だけ載せさせていただきました。
なのでちゃんと名前を聞いてきてくれるしキャラクターはマウスに向かって動いてくるし独り言もしゃべるし、と動きます。
そこの所書くの忘れてました、すいません。


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

Name: 管理人  ..伝説のハッカー(432,644ポイント)   Date: 2007/10/13(土) 23:01   No:10984     
Title: Re:配列について    
なるほど、一部でしたか、失礼しました。
私もなんちゃって人工知能ソフトウェアロボットを作ったことがあります。
OpenGLで画面にロボットを描いて、わずかながら会話や言葉で遊ぶゲーム(ノット21やジャンケン、○×ゲームなど)が出来るものでした。
作っていると会話させることがどんなに難しいことか感じさせられたことがあります。
何かつまったらまたいつでも聞いてください。
それでは研究がんばってくださいm(_ _)m


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

Name: 神魔  ..入門者(4,168ポイント)   Date: 2007/10/14(日) 18:28   No:10995     
Title: Re:配列について    
すいません、また行き詰ってしまいました…。
全角文字は2バイト使用している、だから検出できなかったところまではわかったのですが、今度は新しいエラーが出るようになってしまいました。

error C2446: '==' : 'const char *' 型から 'int' 型への変換ができません。
error C2040: '==' : 'int' は 'const char [3]' と間接操作のレベルが異なります。

あと、使用している配列が出てきている部分だけ載せさせていただきます。

#include "DxLib.h"
#include <string.h>
#pragma warning(disable : 4267)
#pragma warning(disable : 4996)
void hitori(void);
void aikotoba(void);
char name[31],hatugen[29];
int A[29];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理


SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定

if(CheckHitKey(KEY_INPUT_LSHIFT)==1){
printfDx("%s>",name);
KeyInputString(380,0,29,hatugen,FALSE);
printfDx("%s\n",hatugen);
aikotoba();
}



WaitKey(); // 何かキー入力があるまで待つ
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

void aikotoba(void){
SetDrawScreen( DX_SCREEN_BACK ) ;
int i;
for(i=0;i<29;i++){
A[i]=hatugen[i];
}

for(i=0;i<29;i++){
if(A[i]=='?'){
printfDx("柳葉魚>それは内緒のさくらんぼです。\n");
goto hell;
}
if(A[i]=="?"){
printfDx("柳葉魚>それは企業秘密です。\n");
goto hell;
}


}


hell: ;
for(i=0;i<29;i++){
hatugen[i]=0;
A[i]=0;
}

};

なんでも最後の
if(A[i]=="?"){
のところに間違いがあるそうなんですが、'const char *'とか'const char [3]'とか言われても自分にはちんぷんかんぷんで…。
ネットで調べてみたんですけどどれも難しい事例ばかりでわかりませんでした。
どうすればいいのでしょうか?
ちなみに配列Aは気にしないでください。
char型でダメならint型だ!!とか浅はかな考えで作っただけですので…。


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

Name: tkmakwins15 [URL]  ..プログラマー(29,637ポイント)   Date: 2007/10/14(日) 18:38   No:10996     
Title: Re:配列について    
文字列比較はこんな感じです。

char str[]={"YES"};
printf("%d\n",strcmp(str,"YES"));

printfによって出力される値は0になります。strcmpは、文字列が同一の時に0を返します。違う場合は確か辞書式にどうにかした整数値を返すはずです。


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

Name: 神魔  ..入門者(4,212ポイント)   Date: 2007/10/14(日) 19:36   No:10999     
Title: Re:配列について    
えっと、strcmpって””内の文字列と全て一致していないと0を返さないのですか?
自分が今作ろうと思っているものは、例えば配列str内に、
「ねぇ今恋人とかおるん?」
という文字列が入っていたときに
「それは内緒のさくらんぼです。」
と返すような、キーワードが配列のどの部分に入っていても反応するものを作ろうと思っております。
strcmpという関数の構造や仕組みがよくわからないのでいけないのですが、例を見ると配列内の文字列と完全一致していないと0を返さないようなので今作ろうとしているプログラムには使えないかもなんです。

tkmakwins15さん、勘違いだったらスイマセン


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



Name: ほにゃー  ..ぴよぴよ(297ポイント)   Date: 2007/10/14(日) 10:07   No:10988       
Title: DXLibの導入がうまくいきません    
プログラム初心者のほにゃーというものです。

C言語〜ゲームプログラミングの館〜を見て、
DXライブラリを使用したプログラミングを作ろうと思ったのですが、
入門編の0でつまづいてしまいました。

DXライブラリをダウンロード、解凍し、DXLib.slnというのをVisualC++ 2005 Express Editionで開き、
F5を押して実行しようとしたのです。
しかし、「LINK : fatal error LNK1181: 入力ファイル 'user32.lib' を開けません。」
というエラーがでて実行することができないのです。

最初は普通に開くことができたのですが、http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2005express.html
ここの通りに設定をしたら、急に上記のエラーが発生し、開けなくなってしまいました。

原因はなんなのでしょうか?
ご指導お願いします。


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


Name: tkmakwins15 [URL]  ..プログラマー(29,555ポイント)   Date: 2007/10/14(日) 15:02   No:10991     
Title: Re:DXLibの導入がうまくいきません    
たぶんSDKのインストールに失敗しているか、していないかのどちらかだと思います。

後、Dxライブラリ置き場掲示板とみたいですが、マルチポストはあまりやらないほうがいいと思います。


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

Name: ほにゃー  ..ぴよぴよ(431ポイント)   Date: 2007/10/14(日) 15:55   No:10993 解決!     
Title: Re:DXLibの導入がうまくいきません    
回答ありがとうございました。
あのあと、いろいろといじっていたら唐突に直ってしまいました。
原因はわかりませんでしたが、とにかくありがとうございます。

マルチポストはどうしても問題を解決したくて、思わずしてしまいました。
反省しています。


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



Name: cygwin  ..ぴよぴよ(8ポイント)   Date: 2007/10/12(金) 21:09   No:10966       
Title: 無題    
こんにちわ。
最近、家のパソコンでC言語をやろうと思い
cygwinをいうものをインストールしました。
そして適当にtest.cというファイルを作ってコンパイルしました。
プログラムは次のとおりです。

#include<stdio.h>
int main(void)
{
printf("テスト\n");
return 0;
}

そしたら次のようなエラーメッセージが出てきました。


3 [main] ? 396 init_cheap: Couldn't reserve 3600336 bytes of space for cyg
win's heap, Win32 error 487
C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (396): *** AllocationBase 0x0, Ba
seAddress 0x61820000, RegionSize 0x360000, State 0x10000

4 [main] ? 2640 init_cheap: Couldn't reserve 3600336 bytes of space for cy
gwin's heap, Win32 error 487
C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (2640): *** AllocationBase 0x0, B
aseAddress 0x61820000, RegionSize 0x360000, State 0x10000

4 [main] ? 1996 init_cheap: Couldn't reserve 3600336 bytes of space for cy
gwin's heap, Win32 error 487
C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (1996): *** AllocationBase 0x0, B
aseAddress 0x61820000, RegionSize 0x360000, State 0x10000

3 [main] ? 2464 init_cheap: Couldn't reserve 3600336 bytes of space for cy
gwin's heap, Win32 error 487
C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (2464): *** AllocationBase 0x0, B
aseAddress 0x61820000, RegionSize 0x360000, State 0x10000

4 [main] ? 2980 init_cheap: Couldn't reserve 3600336 bytes of space for cy
gwin's heap, Win32 error 487
C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (2980): *** AllocationBase 0x0, B
aseAddress 0x61820000, RegionSize 0x360000, State 0x10000

4 [main] ? 2632 init_cheap: Couldn't reserve 3600336 bytes of space for cy
gwin's heap, Win32 error 487
C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (2632): *** AllocationBase 0x0, B
aseAddress 0x61820000, RegionSize 0x360000, State 0x10000


このエラー文の意味がさっぱり分かりません。
詳しい方いましたらアドバイスお願いします。
また、足りない情報があったら補足しますので
よろしくお願いします。


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


Name: cygwin  ..ぴよぴよ(0ポイント)   Date: 2007/10/12(金) 21:15   No:10967     
Title: Re:無題    
少し付け忘れましたが
OSはXPで
実行コマンドは gcc test.c でやりました。
また -o をつけてやってみましたが同じ結果でした。


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

Name: たかぎ [URL]  ..上級者(16,130ポイント)   Date: 2007/10/12(金) 21:57   No:10968     
Title: Re:無題    
はっきりとしたことは分かりませんが、多分インストールに失敗しています。


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

Name: cygwin  ..ぴよぴよ(52ポイント)   Date: 2007/10/12(金) 22:24   No:10969     
Title: Re:無題    
そう思って1回インストールしなおしたのですが
同じ結果になりました。
やっぱり失敗してるんでしょーか・・・


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

Name: Justy  ..ハッカー(164,999ポイント)   Date: 2007/10/12(金) 22:56   No:10970     
Title: Re:無題    
 ダメもとで。

 rebaseパッケージを入れて、

rebaseall
 か
rebaseall -b 0x61000000

 を実行してみて下さい。


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

Name: cygwin  ..ぴよぴよ(183ポイント)   Date: 2007/10/13(土) 00:39   No:10972     
Title: Re:無題    
rebaseallを実行してみた所

$ rebaseall
rebaseall: only ash processes are allowed during rebasing
Exit all Cygwin processes and stop all Cygwin services.
Execute ash from Start/Run... or a cmd or command window.
Execute '/bin/rebaseall' from ash.

と表示されました。

出てきた文はよくわからないですが
もう一度Cファイルをコンパイルしても
やっぱり結果は一緒でした。

また全部インストールしなおしたほうがいいんでしょうか?


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



Name: よっつん  ..ぴよぴよ(291ポイント)   Date: 2007/10/10(水) 12:20   No:10930       
Title: CPU使用率を下げるには?FPSを安定させるには?    
始めまして、よっつんと申します。

FPSを管理するプログラムを作っているのですが、
FlipScreen()後に、以下のような処理をしてFPSを60FPSにしようとしています。
動作はまぁまぁ期待した通りに動いているのですが、2つ問題がありまして、どうしても解決できません。

一つ目は、CPUの使用率が異様に高いことです。
私のPCでは、約13ミリ秒以上SleepとかWaitTimerやwhileなどで処理を休ませると、
CPU使用率が10%以下から一気に45%程度まで上昇してしまいます。
WaitTimer()の処理を辞めたり、12ミリ秒以下の処理停止では、10%以下になります。
何が原因かさっぱり分かりません。

2つ目は、このプログラムだと、Fpsが56-60までかなり広範囲にぶれてしまうことです。
描画処理などは、一枚絵を表示して、FPSとWaitTimeを表示するだけのものです。
処理落ちするような計算はしていないと思うのですが・・・

筆不精で申し訳ありませんが、よろしくお願いします。

	if( NowTime - OldFrameTime <= 16667 ){//処理スピードが60FPSを超えているので補正する。


WaitTime = OldFrameTime + 16667 - NowTime ;
//余った時間。

//while( GetNowHiPerformanceCount() - OldFrameTime <= 16667 ) {Sleep(1);}
//Sleep( 13 );
WaitTimer( ( int ) ( WaitTime / 1000 ) );//規定時間まで待つ。
//マイクロ秒からミリ秒に直しつつintにキャスト。

OldFrameTime = OldFrameTime + 16667 ;

}
else OldFrameTime = NowTime ;


使用PC
Windows2000
PentiumB866Mhz
モニタ75Mhz


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


Name: 管理人 [URL]  ..伝説のハッカー(430,848ポイント)   Date: 2007/10/10(水) 13:18   No:10931     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
ゲームプログラミングの館の「FPSを表示する」のサンプルプログラムを実行するとどうなりますか?
http://dixq.net/g/#s6



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

Name: tkmakwins15 [URL]  ..プログラマー(29,430ポイント)   Date: 2007/10/10(水) 20:31   No:10937     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
GetNowHiPerformanceCount()の処理が重いのでは?

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

Name: よっつん  ..ぴよぴよ(504ポイント)   Date: 2007/10/10(水) 21:29   No:10938     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
早速返信ありがとうございます。

サンプルプログラムを実行しましたが、同じ結果になりましたw(:_;)w

一つ一つの処理を止めて、CPU使用率を見たところ、
GetNowHiPerfomanceCount()の処理は殆ど影響がありませんでした。

WaitTime()やSleep()などを実行したときのみ処理が異様に重くなります。

取りあえず、強制リフレッシュレート60ヘルツ化の荒業を使おうと思います。

FPSのばらつきは、モニタが75ヘルツなので、誤差がでるのは当然でした(;´Д`)


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

Name: Justy  ..ハッカー(164,939ポイント)   Date: 2007/10/10(水) 21:41   No:10939     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
 再現できるソースコードがあれば、テストが出来るんですが・・・。
 その一部分だけじゃどうにも。

 でも適当に推測を。
 SetWaitVSyncFlag()は設定していますか?
 していないのであれば垂直同期待ちをしないように設定してみて下さい。


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

Name: 管理人 [URL]  ..伝説のハッカー(431,286ポイント)   Date: 2007/10/10(水) 21:51   No:10940     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
私も、while文で待機させると、少々低いスペックのPCだとCPU稼働率が上がった事があります。
ただ、while文を使わないのでしたらGetNowHiPerfomanceCount()を使う意味があるのでしょうか?
どのみちSleep関数などで待たせる事の出来る時間はミリ秒なので、取得する時間もミリ秒単位である
GetNowCount()をお使いになってみてはいかがでしょうか。

もしwhileでループさせながら待機させているならCPU稼働率が異様に上がってしまうのはわかりますが、
そうでないんですよね。
CPUを常に動かしながら待機させるより止めた方がCPUの為によさそうです。
なお、DXライブラリを使うのでしたら、Sleep関数よりメッセージ処理をしてくれる
WaitTimerの方が良いようです。


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

Name: Justy  ..ハッカー(165,013ポイント)   Date: 2007/10/10(水) 22:11   No:10941     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
 あー、ちなみに件の「FPSを表示する」のサンプルプログラムは
うちの環境でそのまま動かすと 30〜40%くらいでしたが
SetWaitVSyncFlag()を使ったら、0%になりました(w



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

Name: よっつん  ..ぴよぴよ(750ポイント)   Date: 2007/10/11(木) 00:22   No:10943 解決!     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
>Dixq様
>Justy様
素早い詳しい回答ありがとうございます。

SetWaitVSyncFlag()使ってみました。CPU使用率が一気に下がりましたヾ(´▽`;)ゝ
ついでに、FPSの精度も60+-0.15まで上がりました。
詳しい仕組みはよく分かりませんが、
WaitTime()等でCPU使用率を下げるには、VSYNC同期を取らないように設定すればいいのですね。

ただ環境によっては垂直同期を取らないとちらつく場合があるようなので、(私のPCではごく僅かにちらつきました)
基本は垂直同期無視で
オプションでフルスクリーンの場合は強制60ヘルツに出来るようにしようと思います。

GetNowHiPerfomanceCount()を使っているのは、FPSの精度を上げるためです。
処理落ちしていないかぎり、大体おおよそ60FPSくらいになるように処理を止めています。
ここで出た誤差は、LONGLONG OldFrameTimeで補正しています。(OldFrameTimeはほぼきっちり正確に60FPSで推移していくので)


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

Name: Justy  ..ハッカー(164,924ポイント)   Date: 2007/10/11(木) 00:42   No:10944     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
 無事解決して何よりです。

> 詳しい仕組みはよく分かりませんが
 多分、内部的に ScreenFlip()のタイミングで、垂直同期開始待ちが発生し、
(75Mhzなら 13.3333ms間隔になるよう)強制的にウエイトが入るのでしょう。

 その処理が WaitTime()のような Sleep()を用いたものなら良かったのですが、
多分スレッドを止めることなく待っている為、その分 CPUを消費しているものと思われます。


> 垂直同期を取らないとちらつく
 これはしょうがないですね。


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

Name: よっつん  ..入門者(2,566ポイント)   Date: 2007/10/11(木) 01:03   No:10945     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
おかげさまで解決できました。ありがとうございました。
問題のプログラムはこんなのでした。SetWaitVSyncFlag()の行のコメントアウトすると
処理が重たくなります。
test.pngを表示して、上下左右に動かすプログラムです。ESCで終了です。

ところで、fpsという変数で割り算するのですが、fpsが0の時の例外処理も書くべきでしょうか?
ほとんど天文学的確率かなと思うのですが。


#include "DxLib.h"

class FpsClass{

private:

//定数の宣言と初期化。他に定義が必ず必要。
static const int FpsRenewalCounter ;

//変数の宣言。
//int x = 0 ;
LONGLONG OldFpsCountTime ;//FPS計測のカウントの内最初の描画成功時の時間
LONGLONG OldFrameTime ; //前フレームの終了時間。16ミリ秒を超えたかどうかの判定に使う。
LONGLONG fps ; //FPSを記憶。
LONGLONG WaitTime ; //処理が早すぎるときに待つ時間。
int FlipCount ; //FpsRenewalCounter回フリップされるごとにFPSを更新。


public://子クラスからアクセスするバージョンではプロテクトにする。
FpsClass();//コンストラクタ
int GetFps();//LONGLONG fpsをintにキャストして返す。
int GetWaitTime();//↑のWaitTime版。
void FpsControl();
//↑全ての描画後に呼び出す。描画回数をカウントして、30回描画するごとにFPSを計算する。
//また、60FPSを保つ役割も持つ。

};

const int FpsClass::FpsRenewalCounter = 15 ;//FPSを何フレーム毎に更新するか

FpsClass::FpsClass(){

fps = 0 ;
FlipCount = 0 ;
WaitTime= 0 ;
OldFpsCountTime = GetNowHiPerformanceCount() ;//計測開始
OldFrameTime = OldFpsCountTime ;

}

int FpsClass::GetFps(){

return ( int ) fps ;

}

int FpsClass::GetWaitTime(){

return ( int ) WaitTime ;

}

void FpsClass::FpsControl(){

LONGLONG NowTime ;//時間を記憶。
//int IntWaitTime ;//悪者探しに使いました。>解決済み。

FlipCount++;

NowTime = GetNowHiPerformanceCount();

if( FlipCount == FpsRenewalCounter ){

FlipCount = 0 ;

fps = NowTime - OldFpsCountTime ;

fps = 100000000 / fps * FpsRenewalCounter ;
//実際は1秒は1000000だが、あえて100倍してある。
//これは、FPS描画用関数で小数点第二位まで表示するために便利だから・・・けど修正予定

OldFpsCountTime = NowTime ;

}



if( NowTime - OldFrameTime <= 16667 ){//処理スピードが60FPSを超えているので補正する。

WaitTime = OldFrameTime + 16667 - NowTime ;
//余った時間。

//以下は悪役探しに使いました。>CPU使用率が上がる問題
//IntWaitTime = ( int ) ( WaitTime / 1000 );//どこが悪いの???
//WaitTimer( IntWaitTime );
//while( GetNowHiPerformanceCount() - OldFrameTime <= 16667 ) {Sleep( 1 )}
//Sleep( 13 );

WaitTimer( ( int ) ( WaitTime / 1000 ) );//規定時間まで待つ。
//ミリ秒に直しつつintにキャスト。

OldFrameTime = OldFrameTime + 16667 ;//WaitTimerの誤差があるはずだが、(・ε・)キニシナイ!!

}
else{

OldFrameTime = NowTime ;

WaitTime = 0 ;

}

}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{

SetWindowText("表示のテスト");

SetOutApplicationLogValidFlag(FALSE);

ChangeWindowMode(TRUE);//デバッグモード専用

// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1 ;

//垂直同期をとらない
SetWaitVSyncFlag( FALSE ) ;

// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
////////////////////////////////////////////////////////以上は前処理

int x = 0 ;
int y = 0 ;
int MyCount = 0 ;
int MyWaitTime = 0 ;
double fpsnum = 0 ;

int GrHandle ;
int Color ;
GrHandle = LoadGraph( "test.png" ) ;
Color = GetColor( 255 , 255 , 255 ) ;

FpsClass myfps ;

while( 1 )
{
// 画面に描かれているものをすべて消す
ClearDrawScreen() ;

// 上下左右のキー入力に対応して x, y の座標値を変更する
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) x -= 8 ;
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) x += 8 ;
if( CheckHitKey( KEY_INPUT_UP ) == 1 ) y -= 8 ;
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) y += 8 ;

// x , y が示す画面座標に画像を描画する
DrawGraph( x , y , GrHandle , TRUE ) ;

MyCount++ ;

if( MyCount == 30 ){//処理にどのくらい余裕があるかを見る。
MyCount = 0 ;
MyWaitTime = myfps.GetWaitTime();
}

DrawFormatString( 0, 0, Color, "FPS %d ", myfps.GetFps() ) ;
DrawFormatString( 0, 200, Color, "Wait %d ", MyWaitTime ) ;

// 裏画面の内容を表画面に反映させる
ScreenFlip() ;

//描画後に必ず呼ぶ。
myfps.FpsControl() ;

// Windows システムからくる情報を処理する
if( ProcessMessage() == -1 ) break ;

// ESCキーが押されたらループから抜ける
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ;
}



//////////////////////////////////////////////////////以下は終了処理
// DXライブラリ使用の終了処理
DxLib_End() ;

// ソフトの終了
return 0 ;

}

<!--3-->


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

Name: よっつん  ..入門者(2,656ポイント)   Date: 2007/10/11(木) 01:29   No:10946 解決!     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
連投すみません。入れ違いになってしまいました。

>Justy様
なるほど納得しました。WaitTimerでCPU使用率が高くなっているのではなく
もともと高かったものが、多少下がったというわけですね。
ありがとうございました\(*^▽^*)/


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

Name: Justy  ..ハッカー(165,033ポイント)   Date: 2007/10/11(木) 01:34   No:10947     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
> 連投すみません。入れ違いになってしまいました
 いえいえ、お気になさらず。


> fpsが0の時の例外処理も書くべきでしょうか
 0は 100%ありえない、というケースを除いてしておいた方がいいでしょう。
 万が一 0除算が発生してアプリが落ちた、なんて滅多に起きなければ起きないほど、
バグがとれない謎の現象になるのでそういうのは事前に潰しておかないと・・・。


> WaitTimerでCPU使用率が高くなっているのではなく
 そんな感じだと思います。
 ただ、WaitTimer自身は内部で ProcessMessage()が呼ばれるので、
メッセージの処理に負荷がかかるとここが重くなる可能性はあります。


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

Name: tkmakwins15 [URL]  ..プログラマー(29,467ポイント)   Date: 2007/10/11(木) 12:48   No:10951     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
ひとつ気になった点があるのですが、実行時にメモリが足りてないので仮想メモリか何かで処理が重くなったとかという可能性はありませんか?

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

Name: よっつん  ..入門者(2,762ポイント)   Date: 2007/10/13(土) 00:20   No:10971     
Title: Re:CPU使用率を下げるには?FPSを安定させるには?    
やはり念には念をいれるべきですよね。わかる範囲でエラー処理をしていこうとおもいます。

仮想メモリで処理が重くなる可能性もあるかもしれませんが、
今回のは違うようです。ScreenFlip()がCPUを占有している可能性が高いと思います。


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



Name: ラウ  ..ぴよぴよ(317ポイント)   Date: 2007/09/27(木) 11:02   No:10669       
Title: 当たり判定    
初めて投稿させてもらいます、ラウと言います。

大学に入ってプログラミングを勉強し始めて半年たって、
ゲームを作りたいと思うようになり、シューティングを製作しようとして、このサイトに流れ着きました。

ここのサイトは初心者の自分にもとても分かりやすくまとめてあって、とても助かります。

今、自機と敵弾に当たり判定を作ろうとしているのですが、どうも上手くいきません。

過去ログなどにも色々書いてあったのをみたのですが^^;


三平方の定理を使って重なる部分がある場合、当たる判定をする、というのは分かるのですが・・・
自機、敵弾のそれぞれの当たり範囲を設定するところで、円の中心の設定は?という感じです。。。

分かりづらいと思いますが、アドバイスのほうよろしくお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(416,664ポイント)   Date: 2007/09/27(木) 14:39   No:10671     
Title: Re:当たり判定    
こんにちは。
私も大学に入ってプログラミングを始めた一人です。
共に頑張っていきましょうm(_ _)m

DrawGraph関数で描画する時は、指定した座標が画像の一番左上になります。
これは3章に書いてあります。
http://dixq.net/g/#3
添付ファイルの上のようになります。
画像の中心は画像サイズによって異なりますから、画像サイズを把握する必要があります。

一方、
DrawRotaGraph関数で描画する時は、指定した座標が画像の中心になります。
添付ファイルの下のようになります。
今度はどんなに画像サイズがかわってもいつも中心になりますから、中心を意識する必要がありません。

それぞれの詳細な使用方法はリファレンスをご覧ください。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

ちなみに、x,yの位置に、50x100サイズの画像をDrawGraphで表示するなら

DrawGraph( x+50/2 , y+100/2 , img , TRUE);

こんな感じになりますね。


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

Name: ラウ  ..ぴよぴよ(404ポイント)   Date: 2007/09/27(木) 20:00   No:10674 解決!     
Title: Re:当たり判定    
お早いレスありがとうございます。m(_ _)m
管理人さんを目指して頑張りたいと思います^^

そういうことなのか・・・。
DrawRotaGraph関数について良く読んでなかったです;

今晩見直して挑戦してきます!


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

Name: 管理人 [URL]  ..伝説のハッカー(416,728ポイント)   Date: 2007/09/28(金) 02:00   No:10679     
Title: Re:当たり判定    
あ、間違い^^;
DrawGraph( x-50/2 , y-100/2 , img , TRUE);
引かないといけませんでしたね(_ _||)
頑張ってください★


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

Name: ラウ  ..ぴよぴよ(222ポイント)   Date: 2007/10/11(木) 13:47   No:10952     
Title: Re:当たり判定    
また質問が出来てしまったので・・・;

当たり判定は出来たんです^^;
それでも、自機が弾に当たった時の処理でおかしなことに・・・

とりあえず、自機にもフラグを作って自機を表示させて、弾に当たったらフラグを消す。
という処理をさせてみたのです。
それで、単発の弾にはしっかり当たって、消えてくれるんです。
が、どうにも連続した弾を撃たれている間、
その処理が行われていない、、、?ようなんです。
(連続弾の最後の弾にはちゃんと反応して、消えます;)

自機のフラグを消す所が、連続弾の途中にあるせいなんだろうけど。。。

当たり判定を行う部分は、関数として作って、敵弾の関数の最後で呼び出してます。

またまたわかりづらくてスミマセン;


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

Name: しりうす〜  ..ぴよぴよ(312ポイント)   Date: 2007/10/11(木) 16:09   No:10953     
Title: Re:当たり判定    
>当たり判定を行う部分は、関数として作って、敵弾の関数の最後で呼び出してます。

この部分の解釈で変わってくる気がしますです。

とりあえず、当たり判定関数の中に自機に弾が当たったら”当たり”と画面に表示するようなデバッグ処理を実装して、実際に連続弾の時に最後の弾以外でも当たり判定が正常に行われているか確認してみては如何でしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(431,922ポイント)   Date: 2007/10/11(木) 19:37   No:10955     
Title: Re:当たり判定    
当たり判定の判定方法は最初のうちはそれでいいと思います。

1、敵の出現フラグを立てる。
2、フラグがたっているなら、敵を表示する。
3、発射した弾と敵の距離を計算し、一定の距離内なら「当たり」として出現フラグを落とす。

ただそれだと毎回総当りで判定させないといけないので、少々弾や敵が増えてきた時、処理回数が増えてしまいますが、わかりやすいのはこの方法だと思います。

発射する弾が増えても、結局3を弾の数だけ繰り返せばいいので、特に問題はないように思います。
コードが無いので、問題箇所は限定出来ませんが、
しりうす〜さんの仰るようにデバッグしてみてはいかがでしょうか。
VC++を使っていらっしゃるのならブレイクポイントでデバッグできますし、
デバッカが無いコンパイラならprintfDxというDXライブラリにprintfに似た関数があるので使ってみてください。
DrawFormatStringを使ってデバッグするのは少し難しいですが、一度printfDxした文字は消えないので、解りやすいと思います。
処理が一瞬で終わってよくわからないような場合はWaitTimer関数で待機させる手もあります。


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

Name: ラウ  ..ぴよぴよ(288ポイント)   Date: 2007/10/11(木) 23:07   No:10959 解決!     
Title: Re:当たり判定    
そうですね、、、
まずはしりうす〜さんの方法で当たり判定が動作しているか試してからやってみます。

ご回答ありがとうがとうございました^^


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



Name: がんも  ..かけだし(2,170ポイント)   Date: 2007/10/11(木) 12:01   No:10950       
Title: フィルタ?の作り方 教えてください!    
C言語初心者です。
「実数ファイルを整数ファイルに変換する」を行なうフィルタ "real2int" を作成しなさい。という課題がでました。フィルタという言葉さえ聞いたことありません;;
問題の全内容はこうです。

「複数の行からなり,1行にひとつの実数値が書かれたファイル(実数ファイルと呼ぶ)」を読み込んで,各行の値を棒グラフで表示する

を,2個のより単純な処理に分解し,それぞれの処理を行なうフィルタを作成してパイプで接続することにより実現することを考えます.

2個のより単純な処理とは,

1.実数ファイルを整数ファイルに変換する.ここに整数ファイルとは,整数の最大値を指定したうえで,実数ファイルが含むすべての値を 0 とこの最大値の間におさまるように相似的に変化させたファイルである(小数点以下は四捨五入とする).
2.整数ファイルを読み込んで,その各行ごとに棒グラフを表示する.ただし棒グラフは,記号 "*" を整数ファイルの各行にある整数値だけ横に並べたものとする.
です.実数ファイルの例 "d9-1.txt" と,最大値を 30 としてこれを変換した整数ファイルの例 "d9-2.txt" ,およびこの整数ファイルに対応した棒グラフの例を参照してください.

そこで問題9−3です.上記の1.に示した処理「実数ファイルを整数ファイルに変換する」を行なうフィルタ "real2int" を作成しなさい.このフィルタは,整数の最大値をオペランドによって指定するものとします.例えば,先に挙げた実数ファイル "d9-1.txt" に対してコマンドライン:

> real2int 30 < d9-1.txt > d9-2.txt

を投入すれば,同じく先に挙げた整数ファイル "d9-2.txt" が得られます(オペランドは 30).


プログラムは答えを見つつ、なんとか理解して作成しました。
でも、real2intというのが拡張子はcでいいのかよくわからなくて、どうしたらいいのか困ってます;
とりあえず、real2int.exeというプログラムを作って、> real2int 30 < d9-1.txt > d9-2.txt を投入してみたのですが、やはりできません。


一応答えのプログラムものせます。

#include <stdio.h>
#include <stdlib.h>
#define MAX 200

int main(int argc, char *argv[])
{
float input[MAX], max, min, ratio;
int i = 0, n, imax, k;

/* ↓ オペランドは1個だけ.これ以外の場合は "** Error! **"
を表示して停止する.exit() は処理を終了する関数.
引数は正常終了なら 0 ,異常終了なら 1 と定められている.*/

if(argc != 2) { printf("** Error! **\n"); exit(1); }

imax = atoi(argv[1]);

scanf("%e", &input[0]);

max = min = input[0];

while(scanf("%e", &input[++i]) != EOF)
{
if(input[i] > max) max = input[i];
if(input[i] < min) min = input[i];
}

fprintf(stderr, "max =%9.2e, min =%9.2e\n", max, min);

ratio = imax/(max - min);

n = i;

for(i = 0; i < n; i++)
{
k = (input[i] - min)*ratio + 0.4;
printf("%3d\n", k);
}

exit(0); /* ← 正常終了は 0 とする(なくてもよい)*/
}



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


Name: Hermit  ..上級者(15,138ポイント)   Date: 2007/10/11(木) 20:01   No:10956     
Title: Re:フィルタ?の作り方 教えてください!    
そのファイルを、real2int.c として、コンパイラで実行ファイルを real2int で動くようにすればいいのですが・・・
コンパイラは何でしょうか?

一般的な UNIX 系であれば、
先に作った real2int.c が置いてあるところで、
cc -o /bin/real2int real2int.c
とすれば、動くと思いますが。

Windows などで、VC++ のコマンドプロンプトなどであれば、
cl real2int.c
で、real2int.exe などがそのままできるので実行できそうですが。

フィルタとは、
入力に対し何らかの選択・変換動作を行い結果を出力する機能を持つものをフィルタと呼ぶことがあるので、
今回の実数を表す文字列を範囲指定された整数を表す文字列に変換動作するプログラムは、
フィルタといってもいいと思います。

次の、棒グラフを表示するプログラムが、foo であるとすれば、
real2int 30 <d9-1.txt | foo
などと、パイプでつなげばいいのですが。
( | が、前のプログラムの標準出力を後のプログラムの標準入力につなげます。通常、これをパイプという)

PS.
とりあえず、先生に、仕様は的確に指示するように言いましょう。
>1.実数ファイルを整数ファイルに変換する.ここに整数ファイルとは,整数の最大値を指定したうえで,実数ファイルが含むすべての値を 0 とこの最大値の間におさまるように相似的に変化させたファイルである(小数点以下は四捨五入とする).

無頓着に考えれば、最大値が指定値、最小が0にして、それを分割していけばいいようですが、
おさまるようにであれば、最大を+無限大、最小を-無限大、とすれば、全て 0 を出力してもかまわなくなります。

PS.2
わすれてました、四捨五入だったら、+0.4 はいけませんね。


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

Name: がんも  ..かけだし(2,290ポイント)   Date: 2007/10/11(木) 20:45   No:10958 解決!     
Title: Re:フィルタ?の作り方 教えてください!    
ありがとうございます。フィルタの使い方がよくわかりました!
実行することもできました。ありがとうございます!!

>わすれてました、四捨五入だったら、+0.4 はいけませんね。
そうですよね!私もおかしいとおもったのですが、答えに0.4とあるので、何か理由があるのかずっと考えてたのですが、答えが間違っていたようですね。0.5に修正します。


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



Name: がんも  ..かけだし(1,459ポイント)   Date: 2007/10/09(火) 21:46   No:10927       
Title: 再びですが教えてください!    
プログラミングについては初心者です;

先日質問した課題の答えを教えてもらったのですが、
その内容が理解できません。ぜひ教えてください



(問題)
あるファイルの内容を書き換えるプログラムを作成します.

前問で作成したファイル "sample.txt" を読み取り,その各行に行番号を付けて再び "sample.txt" に出力するプログラム bango.c を作成しなさい.例えば "sample.txt" の中身が

Hello world.

Good morning.



であれば,bango.c をコンパイル/実行した結果,同じファイル "sample.txt" は

1: Hello world.

2: Good morning.

3:



に書き換えられるものとします(3行目は改行コードのみ).


(答え)
#include <stdio.h>
#define GMAX 50 /* 最大行数 */
#define MMAX 80 /* 1行中最大文字数 */

int main(void)
{
FILE *fp; char s[GMAX][MMAX]; int m, i = 0;

fp = fopen("sample.txt", "r");

while(fgets(s[i++], MMAX-1, fp) != NULL && i < GMAX);

/* 1行の最後は 0 なので,MMAX-1 とする */

m = i - 1; /* ← 全行数 */

fclose(fp); /* ← 必要 */

fp = fopen("sample.txt", "w");

for(i = 0; i < m; i++) fprintf(fp, "%2d: %s", i, s[i]);

fclose(fp); /* ← なくてもよい */
}


char s[GMAX][MMAX]の意味がよくわかりません。
それと、while文の使い方がよくわからないです。これはm = i - 1;というのを繰り返しているんですか?
fgets(s[i++], MMAX-1, fp) != NULL というところの、i++ってあるのですが、iの値はどんどん増えてゆくんですか?
本当にわかんないことだらけで、どなたか教えてください;;


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


Name: 管理人 [URL]  ..伝説のハッカー(430,802ポイント)   Date: 2007/10/10(水) 03:24   No:10929     
Title: Re:再びですが教えてください!    

defineについては
http://www9.plala.or.jp/sgwr-t/c/sec18.html
こちらが参考になると思います。

while(fgets(s[i++], MMAX-1, fp) != NULL && i < GMAX);

これは確かにわかりにくい書き方ですね。
括弧の無い条件文は次のセミコロンまでがひとまとまりになります。

if(a==1){
a=2;
}

このプログラムは

if(a==1)
a=2;

と書き換えられますよね。if文による処理を何もさせたくなければ

if(a==1)
;

こうなります。セミコロンの前の空白を消せば

if(a==1);

こうなります。よって条件文による処理をしないでいる事になります。

while(fgets(s[i++], MMAX-1, fp) != NULL && i < GMAX);

これは

fgets関数を実行し、その返り値がNULLで無い
かつ
iがGMAXより小さい間ループ

を意味していますよね。解りやすく書き換えると

while(i < GMAX){
if(fgets(s[i++], MMAX-1, fp) == NULL)
break;
}

処理される順番はかわりますが(特にi)、感覚的にこれと同じ意味になります。

よってループの条件はm = i-1;の文には届きません。

i++;
というのは、式が評価された後に1増やすという意味です。これとは逆に
++i;
と書けば、式が評価される前に1増やすという意味になります。

i=0;
printf("%d ",i++);
printf("%d ",i++);
printf("%d ",i++);

これと

i=0;
printf("%d ",++i);
printf("%d ",++i);
printf("%d ",++i);

これがどう違うか自分で実行して確認してみてください。


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

Name: やそ  ..かけだし(1,308ポイント)   Date: 2007/10/10(水) 15:46   No:10933     
Title: Re:再びですが教えてください!    
while(fgets(s[i++], MMAX-1, fp) != NULL && i < GMAX);
このwhile文ではfgets関数でs[i++]と言う配列に入力ファイルからデータを読んで保存しています。
・読み込むファイル fpで指定したファイル
・一度に読み込むデータ量 MMAX-1 =79文字(最後に必ず\0が付くのでその分1バイト減らしている)
・読んだデータを保存する場所 s[i++]

なので、iには読み込んだデータの行数(回数)が入ります。
50行よりも少ない場合fgetsの戻り値がNULLになるので終了条件に当てはまります。
行末にセミコロンがあるのでwhile文はそこで完結します。次の行には影響しません。

char s[GMAX][MMAX]ですが、
入力文字列を保存するための2次元配列です。

配列s[]
    MMAX
  [0][1][2][3][4][5][6][7][8][9][10][11][12]・・・[79]
G[0] H e l l o w o r l d .
M[1] G o o d m o r n i n g .
A[2]
X[3]

 ・
 ・
[49]

s[0]とだけ書けば・・・
s[0][0]〜s[0][79]をまとめて指定したことになります。

最後の
for(i = 0; i < m; i++) fprintf(fp, "%2d: %s", i, s[i]);
ですが、コレだと行数が0から始まりませんか?


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

Name: がんも  ..かけだし(1,510ポイント)   Date: 2007/10/11(木) 11:53   No:10949 解決!     
Title: Re:再びですが教えてください!    
すごくよくわかりました!管理人さん、やそさんありがとうございます!!

>やそさん
実行してみたらおっしゃるとおり0からはじまってしまったので、自分で修正しました。ありがとうございます。


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



Name: 青海  ..ぴよぴよ(132ポイント)   Date: 2007/10/10(水) 16:46   No:10934       
Title: 入門編の0からつまづいています・・・    
入門編の0で、VisualC++用のDXライブラリを適用し、はじめのtest1.bmpファイルを表示するところでつまづきました。 F5を押して実行しても 指定のファイルがみつかりません という表示がされ、画像が表示されません・・・。なぜでしょうか?? 指定のファイルというのは Debug¥DXlib.exe ファイルです。

HPのやり方どおりにやったはずなのですが・・・

ご指南お願いいたしますm(_ _;)m


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


Name: たかぎ [URL]  ..上級者(16,106ポイント)   Date: 2007/10/10(水) 16:54   No:10935     
Title: Re:入門編の0からつまづいています・・・    
DXライブラリのことは全く分かりませんが...

> Debug¥DXlib.exe

¥が全角だからということではないのですか?


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

Name: 管理人 [URL]  ..伝説のハッカー(431,042ポイント)   Date: 2007/10/10(水) 17:08   No:10936     
Title: Re:入門編の0からつまづいています・・・    
まず、コンパイラは何ですか?
フリー版のコンパイラである
VisualStudio2005Expressをお使いの場合は
SDKが必要です。
http://homepage2.nifty.com/natupaji/DxLib/dxuse.html
こちらからお使いのコンパイラによった設定を見直してみてください。


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



Name: トロ  ..ぴよぴよ(116ポイント)   Date: 2007/10/10(水) 00:28   No:10928       
Title: ネット上でプログラムを動かすには?    
初心者です。C++とRUBYを使ってプログラミングしたことがあります。
課題でCGI(!?)データーベースを使った物を製作しなければならないのですが…
最近やってなくてさっぱりです。

unix環境でプログラミングして、それ動かす場所ってどうしたらよいのでしょう?
サーバ?とかよくわからなくて困ってます。


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


Name: たかぎ [URL]  ..上級者(16,066ポイント)   Date: 2007/10/10(水) 14:16   No:10932     
Title: Re:ネット上でプログラムを動かすには?    
> unix環境でプログラミングして、それ動かす場所ってどうしたらよいのでしょう?

どうしたら、というのは、お金を出して購入するとか、レンタルするとか、そういうレベルの話でしょうか?
質問の趣旨がよく分かりません。


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



Name: がんも  ..かけだし(1,301ポイント)   Date: 2007/10/07(日) 21:25   No:10893       
Title: ファイルの入出力について    
ファイル入出力について質問させてください

こんな課題がでました

(1)キーボードから入力した文字列を,(改行と空白を含めて)そのままファイル "sample.txt" に出力するプログラムを作成しなさい.ただし、
キーボードから入力する際には,標準関数 getc() を用いる.
入力の終了は,[RET](エンター) を2回繰り返すことで指示する.




(2)あるファイルの内容を書き換えるプログラムを作成します.

前問で作成したファイル "sample.txt" を読み取り,その各行に行番号を付けて再び "sample.txt" に出力するプログラム bango.c を作成しなさい.例えば "sample.txt" の中身が

Hello world.

Good morning.



であれば,bango.c をコンパイル/実行した結果,同じファイル "sample.txt" は

1: Hello world.

2: Good morning.

3:



に書き換えられるものとします(3行目は改行コードのみ).



ファイルの開き方はわかりますが。getc() をつかった入力の方法はわかりません;;
お願いします。


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


Name: tkmakwins15 [URL]  ..プログラマー(29,355ポイント)   Date: 2007/10/07(日) 22:42   No:10895     
Title: Re:ファイルの入出力について    
サンプルです。

int ch;
ch=getc(stdin);

getcは、引数としてファイルポインタを取ります。とすると、キーボードから入力ということになれば、標準入力であるstdinを指定すればキーボードから入力できるようになります。
戻り値は入力された文字ですが、char型ではなくintで受け取ってください。


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

Name: がんも  ..かけだし(1,321ポイント)   Date: 2007/10/09(火) 21:37   No:10926 解決!     
Title: Re:ファイルの入出力について    
入力はわかりました!ありがとうございます!

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



Name:  ..ぴよぴよ(256ポイント)   Date: 2007/10/07(日) 00:37   No:10871       
Title: アルゴリズム    

#include <stdio.h>
#define MAX 5001 /* 配列の大きさ */
#define DIGIT 7500 /* n の最大値 */

void print_box(int []); /* 配列の中身を表示する */
void copy_box(int [], int []); /* 配列をコピーする */
void addition(int [], int [], int []); /* 足し算 */
void subtraction(int [], int [], int []); /* 引き算 */
void division(int [], int, int []); /* 配列 ÷ 整数 */
void division_int(int, int, int []); /* 整数 ÷ 整数 */

int pi[MAX], ans1[MAX], ans2[MAX];
int tmp[MAX], a[MAX], b[MAX], c[MAX];


int main()
{
int i, n;

/*-----------*/
/* 5 */
/*-----------*/
division_int(16, 5, ans1);
copy_box(ans1, tmp);

for( i=1, n=0 ; n+2 <= DIGIT ; i++ ){
n = 2 * i + 1;
division(tmp, 5*5, a);
copy_box(a, tmp); /* ○ ÷ 5^2 の値を退避 */
division(a, n, b); /* ○ ÷ n */
if( i % 2 == 0 ) /* i: 偶数なら */
addition(ans1, b, c); /* + */
else /* i: 奇数なら */
subtraction(ans1, b, c); /* − */
copy_box(c, ans1);
}

/*-----------*/
/* 239 */
/*-----------*/
division_int(4, 239, ans2);
copy_box(ans2, tmp);

for( i=1, n=0 ; n+2 <= DIGIT ; i++ ){
n = 2 * i + 1;
division(tmp, 239*239, a);
copy_box(a, tmp);
division(a, n, b);
if( i % 2 == 0 )
addition(ans2, b, c);
else
subtraction(ans2, b, c);
copy_box(c, ans2);
}

/*----------*/
/* π */
/*----------*/
subtraction(ans1, ans2, pi);
print_box(pi);

return 0;
}

void print_box(int box[])
{
int i;

printf("%5d.", box[0]);

for( i=1 ; i < MAX ; i++ )
printf("%d", box[i]);

printf("\n");
}

void copy_box(int from[], int to[]){
int i;

for( i=0 ; i < MAX ; i++ )
to[i] = from[i];
}

void addition(int x[], int y[], int answer[])
{
int i, carry=0;

for( i=MAX-1 ; i > 0 ; i-- ){
answer[i] = (x[i] + y[i] + carry) % 10;
carry = (x[i] + y[i] + carry) / 10;
}
answer[0] = x[0] + y[0] + carry;
}

void subtraction(int x[], int y[], int answer[])
{
int i;

for( i=MAX-1 ; i > 0 ; i-- ){
if( x[i] >= y[i] ){
answer[i] = x[i] - y[i];
}else{
x[i-1] = x[i-1] - 1;
answer[i] = x[i] + 10 - y[i];
}
}
answer[0] = x[0] - y[0];
}

void division(int x[], int y, int box[])
{
int i, surplus=0;

for( i=0 ; i < MAX ; i++ ){
box[i] = (surplus * 10 + x[i]) / y;
surplus = (surplus * 10 + x[i]) % y;
}
}

void division_int(int x, int y, int box[])
{
int i, surplus;

box[0] = x / y;
surplus = x % y;

for( i=1 ; i < MAX ; i++ ){
box[i] = surplus * 10 / y;
surplus = surplus * 10 % y;
}
}



上のプログラムの簡単なアルゴリズムを教えていただけないでしょうか?
ちなみに、「πをマーチンの公式を使って7500桁(この場合)求める」プログラムです



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


Name: 管理人 [URL]  ..伝説のハッカー(428,168ポイント)   Date: 2007/10/07(日) 00:46   No:10872     
Title: Re:アルゴリズム    
ご質問が2通りに受け取れるのですが、

上のプログラムをもっと簡単にするアルゴリズムを知りたいのでしょうか。

それともどこかから出された、あるいはどこかでみかけたこのプログラムの意味がわからないので、その手続きを手短かに教えてほしいという事でしょうか。


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

Name:  ..ぴよぴよ(290ポイント)   Date: 2007/10/07(日) 15:09   No:10881     
Title: Re:アルゴリズム    
管理人さんが言う、2通りのうちの後者のほうです
できれば、どちらとも教えて欲しいのです。

自分でここは無駄なんじゃないかと思うのは、
配列に値が1つしか入ってないところだと思うのですが。



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

Name: box  ..比類無きプログラマー(87,608ポイント)   Date: 2007/10/07(日) 15:44   No:10882     
Title: Re:アルゴリズム    
> 自分でここは無駄なんじゃないかと思うのは、
> 配列に値が1つしか入ってないところだと思うのですが。

どこのことでしょうか?


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

Name:  ..ぴよぴよ(171ポイント)   Date: 2007/10/07(日) 16:53   No:10884     
Title: Re:アルゴリズム    
>どこのことでしょうか?

感覚的なんですが、
void print_box(int box[])
{
int i;

printf("%5d.", box[0]);

for( i=1 ; i < MAX ; i++ )
printf("%d", box[i]);

printf("\n");
}

のところはそうなっていそうなんですが。


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

Name: 管理人 [URL]  ..伝説のハッカー(428,805ポイント)   Date: 2007/10/07(日) 17:05   No:10886     
Title: Re:アルゴリズム    
厳しい事を言うようですが、聞いてください。

これは学校の課題でしょうか。学校から提示されたものですか?

まず質問する姿勢として、自分はどこまで理解したのか、どの部分が知りたいのか明確にしてもらう事を規約にしています。
また、自分がプログラムが理解出来ず困っている時は、簡単に説明してもらうより、詳しく説明してほしいと思うはずだと思います。
どこまで理解したのか、自分はどれ位知識があるか全く示さず、誰かこのプログラムの意味を手短に教えて欲しいというのはいかがなものでしょうか。

自分がわからない部分をはっきり示し、その部分について詳しい解説を要求した方が問題解決になると思います。

プログラムが全部わから無いという事は無いと思います。自分の理解出来ない箇所を示してください。
もし全く理解出来ないなら自分はどの位で躓いているのか教えてください。


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

Name: box  ..比類無きプログラマー(87,625ポイント)   Date: 2007/10/07(日) 17:12   No:10887     
Title: Re:アルゴリズム    
> 自分でここは無駄なんじゃないかと思うのは、
> 配列に値が1つしか入ってないところだと思うのですが。

box[]の各要素に1桁分しか入っていない、ということですか?

であれば、box[]の各要素に複数の桁を格納できるよう、
プログラムを修正することにチャレンジしてみてはいかがでしょうか。


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

Name:  ..ぴよぴよ(625ポイント)   Date: 2007/10/07(日) 23:27   No:10899     
Title: Re:アルゴリズム    
特に学校とかは通ってなくて、独学でやってるものなんです。
つい最近はじめたばかりなので、知識はかなり浅いほうだと思います。

ちょっと質問の仕方に悪いところが多かったみたいですね。
管理人さんの言うとおりに、質問をしなおしてみます。
かなり基本的なことを質問するかもしれませんが、よろしく御願いします

☆自分が分からない点

●1●
void copy_box(int from[], int to[]){
int i;

for( i=0 ; i < MAX ; i++ )
to[i] = from[i];
}

の部分で、なぜ配列をコピーするのかということ。

●2●
copy_box(a, tmp); /* ○ ÷ 5^2 の値を退避 */

の部分で、5^2の値を退避することによって、どのようなメリットがあるのかということ


以上の2つです。

ネットで勉強してるので、かなり基礎的なことができてないところがありまして。


追伸
box様
いちおう、配列に4桁格納できるようにはしてみました。
しかし、勉強不足なので修行しなおしてきます


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

Name: やそ  ..ぴよぴよ(827ポイント)   Date: 2007/10/09(火) 17:38   No:10925     
Title: Re:アルゴリズム    
マーチンの公式を級数展開して求めているプログラムでは?

PI=16*arctan(1/5)-4*arctan(1/239)

この公式を元にじっくりプログラムを眺めて処理を追ってみると良いでしょう。


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



Name: じゃっく  ..ぴよぴよ(400ポイント)   Date: 2007/10/08(月) 00:24   No:10902       
Title: 初心者の質問    
おとといからC言語に手をつけ始めました。
特に、他の言語をしたということもなく、初めての言語がC言語です。

本題に入ります。

たとえば10桁(1234567890)の数字があったとします。

int ss;
printf("%3d", ss);

とすると、だいたい
1 2 3 4 5 6 7 8 9 0

という感じになるのは分かるんです。

しかし、これを

123
456
789
0

のように3桁出力して、改行という風にするには
どのようにすればいいのでしょうか?
たぶんfor文を使うのだと思うのですが。

for文の使い方は僕の買った本では、

for(初期化;継続条件;再設定)

という風にしか書いてなくて、サンプルがなくてよくわかりません。
質問する側の態度として、厚かましいかもしれませんが
理解したいので、できるだけfor文の使い方、サンプルを詳しくお願いします。



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


Name: box  ..比類無きプログラマー(88,027ポイント)   Date: 2007/10/08(月) 00:52   No:10903     
Title: Re:初心者の質問    
> たとえば10桁(1234567890)の数字があったとします。
>
> int ss;

このとき、ssというint型の変数に、
「十二億三千四百五十六万七千八百九十」という値が入っていることを
想定されていますか?
もしそうだとすると、

> printf("%3d", ss);
>
> とすると、だいたい
> 1 2 3 4 5 6 7 8 9 0

このようには出力しません。
1234567890
と出力します。
"%3d"は、今回の場合ssというint型の変数を出力するために、最低3桁使う、
という意味です。

> 123
> 456
> 789
> 0
>
> のように3桁出力して、改行という風にするには
> どのようにすればいいのでしょうか?

もし、「十二億三千四百五十六万七千八百九十」という数値をもとにして
この出力を得ようとすると、for文の知識に加えて、
整数の割算と剰余に関する知識が必要です。


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

Name: box  ..比類無きプログラマー(88,078ポイント)   Date: 2007/10/08(月) 00:58   No:10904     
Title: Re:初心者の質問    
1から10までfor文でループを回して、

> 1 2 3 4 5 6 7 8 9 0



> 123
> 456
> 789
> 0

という結果を得たい場合は、先ほど回答したのとは
少し違うやり方が必要です。

今回は、
 ・「十二億三千四百五十六万七千八百九十」という数値を扱う
 ・1から10までループを回す
のどちらを採用したいですか?


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

Name: じゃっく  ..ぴよぴよ(455ポイント)   Date: 2007/10/08(月) 05:10   No:10906     
Title: Re:初心者の質問    
明らかに簡単そうな1〜10までループでまわすを使いたいです。
できればfor文のちょっとした応用例を添えてくれるとありがたいです


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

Name: box  ..比類無きプログラマー(88,315ポイント)   Date: 2007/10/08(月) 07:22   No:10908     
Title: Re:初心者の質問    
> 明らかに簡単そうな1〜10までループでまわすを使いたいです。

そうですね。それでいきましょう。
まずは、ここまで。

#include <stdio.h>

int main(void)
{
int ss;

for (ss = 1; ss <= 10; ss++) {
/* 何かの処理 */
}
return 0;
}



このプログラムは、単に10回ループを回して終わり、というものです。
for文の意味は、
「ssを1から始めて、10以下である間、1ずつ増やしながらぐるぐる回る」です。
for文で構成するループの中身は、今はまだ何もありません。これから作っていきます。
ここまではいいですか?


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

Name: じゃっく  ..ぴよぴよ(779ポイント)   Date: 2007/10/08(月) 22:57   No:10920     
Title: Re:初心者の質問    
返信遅れてすみません

>「ssを1から始めて、10以下である間、1ずつ増やしながらぐるぐる回る」
分かりました。

つまり、for(1;2;3;)

1のところでスタート地点を決めて、
2のところでゴール地点を決めて
3のところでは、ゴールに近づくためのスピードというか、新たなスタート地点の設定みたいな感じでいいですか?



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

Name: box  ..比類無きプログラマー(88,510ポイント)   Date: 2007/10/09(火) 09:47   No:10924     
Title: Re:初心者の質問    
さしあたり、そのご理解でよいでしょう。
では、最初の問題

 1 2 3 4 5 6 7 8 9 0

の出力に取りかかります。

10/08の07:22に私が投稿したコードのfor文の中に
/* 何かの処理 */
というコメント部分があります。
その部分を、

 1 2 3 4 5 6 7 8 9 0

を出力するための文で置き換えます。

変数ssを1から10まで1ずつ増やしていく中で、
くだんの出力結果を得るには、
  ・ssが1のとき、" 1" と出力する
  ・ssが2のとき、" 2" と出力する
  ・ssが3のとき、" 3" と出力する
  ・以下同様に、
  ・ssが9のとき、" 9" と出力する
  ・ssが10のとき、" 0" と出力する
という処理を行なうことになります。

ここまではいいですか?


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



Name: ナナイ  ..ぴよぴよ(68ポイント)   Date: 2007/10/08(月) 20:10   No:10915       
Title: ストップウォッチ作成    
はじめまして。
C言語の実力は初心者程度なのですが質問があります。
題の通りなのですが、ストップウォッチって作成可能ですか?
クリックするとカウントを開始して、もう一回クリックすると止まる。
という感じで作りたいのですが。



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


Name: 管理人 [URL]  ..伝説のハッカー(430,158ポイント)   Date: 2007/10/08(月) 20:35   No:10916     
Title: Re:ストップウォッチ作成    
ストップウォッチは簡単に出来ますよ。

time.hをインクルードすることで使えるようになるclock関数を使って今の時間を取得し、
今の時間 - 過去に取得した時間
を計算すればその間の時間が出ます。


#include <stdio.h>
#include <time.h>

int main(){
clock_t t;
printf("エンターを押してください。\n");
getchar();//入力を待つ
t = clock();//時間を格納
printf("計測中。エンターを押してください。\n");
getchar();//入力を待つ
printf("%.3f秒\n",(clock()-t)/(double)CLOCKS_PER_SEC);
}


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

Name: バグ  ..熟練のプログラマー(59,395ポイント)   Date: 2007/10/08(月) 20:57   No:10917     
Title: Re:ストップウォッチ作成    
あら?先を越されてしまいましたか…(苦笑)
せっかくなので、乗せておきます。


#include <time.h>
#include <conio.h>
#include <stdio.h>

clock_t Elapse(clock_t Start);
void Start(clock_t* pStart);

int main(void)
{
clock_t ctStart, ctNowTime = 0;

while (ctNowTime <= 99999)
{
Start(&ctStart);

while (kbhit() == 0)
{
printf("%.3f\r", (double)((ctNowTime + Elapse(ctStart)) / 1000.0f));
}

getc(stdin);
ctNowTime += Elapse(ctStart);

while (kbhit() == 0);
getc(stdin);
}

return 0;
}

// 計測開始
void Start(clock_t* pStart)
{
*pStart = clock();
}

// 経過時間(msec)
clock_t Elapse(clock_t ctStart)
{
return (clock_t)((double)(clock() - ctStart) / (double)(CLOCKS_PER_SEC / 1000.0f));
}


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

Name: バグ  ..熟練のプログラマー(59,461ポイント)   Date: 2007/10/08(月) 21:01   No:10918     
Title: Re:ストップウォッチ作成    
おっと、失礼、<conio.h>は標準関数ではなかったですね。
Windows上では動くはずですが、それ以外の環境では動かないと思います(^_^;)


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

Name: Hermit  ..中級者(14,716ポイント)   Date: 2007/10/08(月) 21:41   No:10919     
Title: Re:ストップウォッチ作成    
VB の様ですが、ソースまで付いてきます。
http://www.vector.co.jp/soft/dl/win95/personal/se246014.html
C、C++ にするのも難しくはなさそうに思います


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

Name: tkmakwins15 [URL]  ..プログラマー(29,413ポイント)   Date: 2007/10/08(月) 23:57   No:10921     
Title: Re:ストップウォッチ作成    
>クリックするとカウントを開始して、もう一回クリックすると止まる。

クリックとなるとAPI使わなきゃ無理です。とりあえずサンプルプログラム組んで見ましたので、(WinAPIです)ご覧下さい。


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

Name: ナナイ  ..ぴよぴよ(104ポイント)   Date: 2007/10/09(火) 00:58   No:10923 解決!     
Title: Re:ストップウォッチ作成    
to 管理人さま、バグさま、Hermitさま 、tkmakwins15さま

回答ありがとうございます。
皆様の返答をもとに作成してみます。



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

Name: Jack   Date: 2008/09/04(木) 12:19   No:109151220498365     
Title: Re:ストップウォッチ作成    
ストップウォッチなのですが最初のキーの入力とストップウォッチの終了の命令がほしいのですがよろしければ教えていただけないでしょうか。




Name: 大工  ..上級者(22,701ポイント)   Date: 2007/10/07(日) 12:30   No:10877       
Title: 前回の続き    
とりあえず、さっきまで勉強してきたものでちょっとは解決できました。

func( p[][] )やfunc( p[2][] )はコンパイルできませんでした。

VCでは
error C2087: 'd' : 添字がありません。
'int (*)[1]' と 'int [7][7]' で配列の添字が異なります。
error C2087: 'd' : 添字がありません。

とエラーが返ってきました。
添字を必要なところに書かなければならないのは当然のことですが、my_dice(dice)の部分で'int (*)[1]' と 'int [7][7]' で配列の添字が異なります。とこのエラーが返ってきたのが気になります。なぜ、(*)[1]となるのでようか???

あと、エキスパートCプログラミングを読んで学んだことは「〜の配列」という仮引数は「〜へのポインタ」として扱われる規定している。また、これは再帰的ではなく「配列の配列」、は「ポインタへのポインタ」になるのではなく、「配列へのポインタ」に書き換えられるのでp[][2]という仮引数は(*p)[2]となる。

つまり、p[][2], p[3][2], (*p)[2]は同じ扱いなり。*p[2]は, **pと同じ扱いしくなる。

このような理解の仕方でよろしいでしょうか???

また、下記のプログラムではコンパイルもでき実行もできました。

しかし、 d[y][10] += 1;という操作はmain関数内でd[7][7];となっているのにどうして警告もないのでしょうか??

これは、関数内ではアドレスしか送られてきてないために元がどういった形式か分からない(上記の本に書いてありました)から起こるのでしょうか???

もしそうだとしたら、int (*d)[7]はd[なんらかの値][7]の形にどうして合わせないといけないのでしょうか?配列のサイズ(?)を送っても関数ないではわからないのに・・・・

すればするほどポインタがややこしくなってきました。。。

ご協力お願いします><。

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

void my_dice(int (*d)[7]);

int main(void){

int dice[7][7];

int n, cnt;

int x, y;

srand(time(NULL)); //乱数の初期化.

//配列の初期化.

for(x = 0; x < 7; x++) {

for(y = 0; y < 7; y++) {

dice[y][x] = 0;
}
}

printf("試行回数:");

scanf(" %d", &n);

for(cnt = 0; cnt < n; cnt++) {

my_dice(dice);

}

return 0;
}

void my_dice(int (*d)[7]) {

int x, y;

y = rand() % 6 + 1;

d[y][10] += 1;

return;

}


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


Name: box  ..比類無きプログラマー(87,660ポイント)   Date: 2007/10/07(日) 18:40   No:10889     
Title: Re:前回の続き    
> d[y][10] += 1;という操作はmain関数内でd[7][7];となっているのにどうして警告もないのでしょうか??

C言語は、そういうものです。
定義した範囲外の領域にアクセスしないようにするのは、
通常、プログラムを書く側の責任です。


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

Name: 大工  ..上級者(22,751ポイント)   Date: 2007/10/07(日) 18:48   No:10891     
Title: Re:前回の続き    
box様>

では引数ではアドレスしかコピーして関数に渡してないのですか??
たとえ、仮引数が(*a)[10]だとしても関数内でa[0][100]にアクセスできてしまうのですか?


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

Name: box  ..比類無きプログラマー(87,895ポイント)   Date: 2007/10/07(日) 21:53   No:10894     
Title: Re:前回の続き    
> では引数ではアドレスしかコピーして関数に渡してないのですか??

関数呼び出しの際、引数に配列を指定したとき、
呼び出される関数ではその引数を当該配列の先頭要素へのポインタとするのは、
これまでのやりとりで見てきたとおりです。

> たとえ、仮引数が(*a)[10]だとしても関数内でa[0][100]にアクセスできてしまうのですか?

コンパイル時には、何もエラーは出ません。
実行時、a[0][100]にアクセスしようとしたとき、
プログラムが即座に落ちるかもしれませんし、落ちないかもしれません。

たまたま即座には落ちなかったとしても、別の変数のための領域や、
あるいはユーザプログラムがアクセスしてはいけない領域を壊していますので、
別のタイミングで突然落ちるかもしれません。こうなると、見つけるのが
やっかいなバグです。


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

Name: 大工  ..上級者(22,816ポイント)   Date: 2007/10/09(火) 00:45   No:10922     
Title: Re:前回の続き    
box様>

なるほど、色々とありがとうございます。

中途半端に知識をつけてしまうと混乱してしまって。。。

とりあえず、自分の中で形になってきました。


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



Name: たまー  ..ぴよぴよ(51ポイント)   Date: 2007/10/08(月) 03:48   No:10905       
Title: 教えてください!    
構造体XYZがあり、その合計値を戻り値として
アドレス渡ししたいのですがわかりますでしょうか?
(言ってる意味通じないかも><)


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


Name: box  ..比類無きプログラマー(88,116ポイント)   Date: 2007/10/08(月) 07:12   No:10907     
Title: Re:教えてください!    
構造体XYZのメンバー構成を教えてください。

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

Name: たまー  ..ぴよぴよ(146ポイント)   Date: 2007/10/08(月) 11:42   No:10910     
Title: Re:教えてください!    
構造体のメンバは参考なのでなんでもいいんです^^;
形を知りたかったので、
char X[10];
char Y[15];
char Z[20];

X(1,2,3,)Y(4,5,6)Z(7,8,9)
こんな感じでよろしいでしょうか?><
値などこれに限らずなんでもいいので参考例を
よろしくお願いいたします!


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

Name: たかぎ [URL]  ..上級者(16,022ポイント)   Date: 2007/10/08(月) 13:46   No:10911     
Title: Re:教えてください!    
> 構造体のメンバは参考なのでなんでもいいんです^^;

構造体の定義によって、操作の仕方が異なります。
それに、合計といっても、何をどう合計するのか皆目分かりません。
何でもよいというのであれば、
struct X { int x; };

struct Y { long y; };
struct Z { double z; }

double sum(const struct X *x, const struct Y *y, const struct Z *z)
{
return x->x + y->y + z->z;
}


とすれば合計を求められますが、これが期待した答えなのかどうか、私にはわかりません。

> char X[10];
> char Y[15];
> char Z[20];

これらは構造体ではなく配列です。


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

Name: たまー  ..ぴよぴよ(255ポイント)   Date: 2007/10/08(月) 14:57   No:10912     
Title: Re:教えてください!    
早い回答ありがとうございます^^
suuziというタグ名で構造体ひとつにしたら、
こんな感じでいいのでしょうか?
ご回答お願いします!
struct suuzi { int x,int y,int z }SUUZI;


int sum(const SUUZI *x, const SUUZI *y, const SUUZI *z)
{
return x->x + y->y + z->z;
}


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

Name: 管理人 [URL]  ..伝説のハッカー(430,009ポイント)   Date: 2007/10/08(月) 15:03   No:10913     
Title: Re:教えてください!    
何がしたいのか、XYZは座標なのかなんなのかによって、プログラムは変わってくると思います。
例えば座標なのでしたら、構造体にx,y,zセットで定義した方が便利ではないでしょうか。


#include <stdio.h>

typedef struct{
double x,y,z;
}xyz_t;

double sum(xyz_t *xyz)
{
return xyz->x + xyz->y + xyz->z;
}


int main(){

xyz_t xyz;

xyz.x=5.0;
xyz.y=8.0;
xyz.z=7.0;

printf("sum = %f",sum(&xyz));
}
 
 
具体的に何がしたいのかがわかればもっと詳細に書けると思います。


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

Name: たまー  ..ぴよぴよ(346ポイント)   Date: 2007/10/08(月) 15:44   No:10914     
Title: Re:教えてください!    
管理人さま、返答ありがとうございます^^
特にすごくこうしたいとかじゃなくて、
書き方、動きなどを知りたかったので、
すごく参考になりました^^
また、こういう機会ありましたらよろしくお願いします^^


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



Name:  ..ぴよぴよ(157ポイント)   Date: 2007/10/07(日) 13:17   No:10878       
Title: 画像の描画でエラーが出ます(ハンドル取得ができていない?)    
 はじめまして。つい最近にこちらを参考にシューティングゲームを作り始めた者です。
 サンプルを魔改造しながらなんとか完成させようと奮闘しているのですが、ある処理をするとエラーが出てしまいます。

 その処理とは、敵撃破時に画像を表示するだけの単純なものなのですが、ビルドすると『player.obj : error LNK2001: 外部シンボル ""int img_enemy_death" (?img_enemy_death@@3HA)" は未解決です。』といったエラーが出てしまいます。
 サンプルの『ExternGV.h』と『GlobalVariable.h』で『img_enemy_death』というハンドルを取得し、『img_sound_load.cpp』で『img_enemy_death = LoadGraph("Sh/img/mons/enemy_death0.png")』として画像をロード、『player.cpp』にある『CollisionDetection()』関数内の当たり判定if内に『DrawGraph(0,0,img_enemy_death,FALSE)』で表示(描画位置は考慮していません)しているのですが……。

ソースはこんな感じです↓
if( (int)sqrt(x*x+y*y) < range+enemy[s].range){ //当たり判定内なら
DrawGraph(0,0,img_enemy_death,FALSE); //画面左上端に画像表示
enemy[s].flag=0; //表示フラグを戻す
PlayerShot[i][j].flag=0; //あたった弾を消す
if(CheckSoundMem(sound_enemy_death)==1) //消滅音がなっていなかったら
StopSoundMem(sound_enemy_death); //とめて
PlaySoundMem(sound_enemy_death,DX_PLAYTYPE_BACK); //消滅音をならす。
}

 色々試行錯誤してみたところ、どうやら『ExternGV.h』と『GlobalVariable.h』で取得しているはずの『int img_enemy_death』がちゃんと機能していないようなのです。まぁ当たり判定if内で直接画像を読み込み表示すれば解決したのですが、この先たくさんの画像を読み込んで表示することを思うと、サンプルにあるように読み込みを纏めておきたいんです。
 おそらく『ファイル場所を変えたら音楽が流れません』というトピックと同じ症状だと思うのですが、解決策がわからなかったので質問しました。
 ちなみに環境はXPでVC++Exp、SDKの読み込みはきちんとできているはずです。どなたか回答お願いできないでしょうか。
 よろしくおねがいします……。


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


Name: 管理人 [URL]  ..伝説のハッカー(428,427ポイント)   Date: 2007/10/07(日) 16:58   No:10885     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    
ExternGV.hに
extern int img_enemy_death;

は書いているが、

GlobalVariable.hには
int img_enemy_death;

が書かれていない・・。などという場合このようなエラーが出ると思います。

ちゃんとGlobalVariable.hに宣言し、ExternGV.hにextern文が書かれていますか?
スペルミスなどありませんか?

#defineと#ifdefを使う事でこの2つのファイルが一つのファイルにまとめられますので、余力があればそちらにもトライしてみてください。


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

Name:  ..ぴよぴよ(380ポイント)   Date: 2007/10/07(日) 17:27   No:10888     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    
 質問のお答え、ありがとうございました!
 しかし、『ExternGV.h』には『extern int img_enemy_death;』、『GlobalVariable.h』には『int img_enemy_death;』としっかり記述してあります。単純な文字に置き換えてもエラーが出るので、スペルミスやファイルの入れ忘れということもなさそうです。どうやら『img_sound_load.cpp』で『img_enemy_death = LoadGraph("Sh/img/mons/enemy_death0.png");』とした際にエラーが出てしまうようなのです。これがロードの失敗なのか、ハンドルが取得できていないからなのかは、わかりませんが……。
 過去ログを漁ってみたものの、同じ症状の方が幾人かいたのですが、解決策は見つからず。
 うーん、どうしたらいいのでしょう。


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

Name: 管理人 [URL]  ..伝説のハッカー(428,888ポイント)   Date: 2007/10/07(日) 18:45   No:10890     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    
ファイルの場所が違う(ロード失敗・ハンドル取得出来ない)場合はコンパイルエラーにはなりません。
返り値に-1が来るだけなので、表示する際-1のハンドルを表示する事になり、表示されないだけです。

プロジェクトをまるごとzipにしてメール添付かアップローダに上げるかして見せていただけませんか?


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

Name:  ..ぴよぴよ(486ポイント)   Date: 2007/10/07(日) 20:23   No:10892     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    
 『http://tool-ya.ddo.jp/webfs/~enigma』の『test.zip』で、パスは『test』です。
 デジタルゲームパッドでの入力を付け足したぐらいで、基本的にサンプルプログラムからいじってません。今回の処理のために追加した部分には、注釈を書いています。すいません、お手数かけますがよろしくおねがいします!


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

Name: 管理人 [URL]  ..伝説のハッカー(429,642ポイント)   Date: 2007/10/07(日) 22:49   No:10896     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    

修正したプログラムをこちらに上げておきます。

http://dixq.net/zip/peach.zip

実はこの宣言の方法は実に非効率なんです。
ただこのサイトはわかりやすいをモットーに書いていこうと思ったので
なるべく入門の段階ではみたことの無いような構文は使わないように
書いていきました。
しかしそれがアダになったようで、無駄な文章をダラダラ書かないといけなくなってしまいました。

#ifdefの使い方ご存知でしょうか。



/* main.cpp */

#define _GLOBAL_INSTANCE_

#include "GV.h"

-------------------------------------------

/* play.cpp */

#include "GV.h"

--------------------------------------------

今上記のような2つのファイルがあるとします。
この2つのファイルはGV.hをインクルードするので、どちらもGV.hを通ります。
GV.hにイカのように書いた時には以下の様な条件分岐をします。


/* GV.h */

#ifdef _GLOBAL_INSTANCE_
//main.cppから呼ばれたときはココを通る
int count = 0;

#else
//play.cppから呼ばれたときはココを通る
extern int count;

#endif

---------------------------------------------

main.cppではGV.hをインクルードする前に_GLOBAL_INSTANCE_が定義されています。
よってGV.hをインクルードしたmain.cppから呼ばれたときはint count=0;を通ります。
定義しなかった、それ以外から呼ばれたときは#elseの部分を通ります。

このように書く事で、1つのファイルに纏める事が出来ます。
構造体の型や諸々の定義は全てのファイルでインクルードしないといけないことから、
GV.hの条件分岐しない最初の部分でインクルードすればいいでしょう。
これが最適な方法かどうかわかりませんが、私なりのやり方をご紹介しました。

詳しい中身はお渡ししたzipファイルをみてください。

ソースファイル中身は変更していません。
2つのhファイルだけ変更しています。

 


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

Name: Justy  ..ハッカー(164,865ポイント)   Date: 2007/10/07(日) 23:39   No:10900     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    
> これが最適な方法かどうかわかりませんが
 余談ですが、多数のグローバル変数を扱う場合、最適な方法の1つはこれです。

Cプログラミング診断室/管理は複雑に/ほとんど同じ
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.5.4.html

 こちらのように GLOBALマクロを使って、定義と宣言を1箇所に纏めてしまえば、
グローバル変数の追加・修正・削除が入ったときのミスが減ります。


 あと、_GLOBAL_INSTANCE_の名前は処理系が予約(_で始まって次が大文字)しているので、
避けた方がいいかと。


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

Name: 管理人 [URL]  ..伝説のハッカー(429,715ポイント)   Date: 2007/10/07(日) 23:59   No:10901     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    
なるほど〜、便利ですね。
今後重宝させていただきます。逆に勉強になりましたm(_ _)m
名前は変えたほうがいいですね。
いつもありがとうございます。


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

Name:  ..ぴよぴよ(706ポイント)   Date: 2007/10/08(月) 08:14   No:10909 解決!     
Title: Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)    
 回答ありがとうございました! 修正ファイル、DLしました。しっかり動きました。

 #ifdefですか……GlobalVariable.hで定義していたものをifdefで最初に定義し、ExternGV.hで定義していたものをelseで定義、と。一つに纏まったことでエラーが出なくなったのですか。うーむ、なかなか繊細ですね(笑
 Justyさんもありがとうございました! こういうやりかたもあるのですね。そちらのサイト様も参考にしながら、続きを作っていきたいと思います。

 思ったより大事だったので少し驚いてますが、ともかく。お二方、ありがとうございました!


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



Name: 待竜  ..ぴよぴよ(309ポイント)   Date: 2007/10/02(火) 15:08   No:10756       
Title: ファイル場所を変えたら音楽が流れません    
初めまして、Cは専門ではないのですが学校の授業でちょろっとやった程度です。
新しいプロジェクトをMy Documentsの中に作りましたが、音楽を流そうとすると
リンクが上手くいきません。
「error LNK2001: 外部シンボル ""int __cdecl PlaySoundW(char const *,int)" (?PlaySoundW@@YAHPBDH@Z)" は未解決です。」「fatal error LNK1120: 外部参照 1 が未解決です。」が出てしまいます。
ゲームプログラミングの館の15節のサンプルプログラムを試しに実行しても同じエラーが出ます。
同フォルダ内にtest.wavはちゃんとあります。
なにか初歩的な勘違いをしてそうなのですがどなたか教えていただけると嬉しいです。

あと、もう一つ、wavの方はDXライブラリのサンプルプログラム実行用フォルダ内で
15節のプログラムを実行すればちゃんと音が出るのですが、midの方は出ないんです・・・
なにか設定とかあるのでしょうか?
未熟者で申し訳ありません、よろしくお願いします。


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


Name: 管理人 [URL]  ..伝説のハッカー(420,907ポイント)   Date: 2007/10/02(火) 18:13   No:10758     
Title: Re:ファイル場所を変えたら音楽が流れません    
midファイルの再生が出ないのなら、普通に再生しても出ないのではないでしょうか。
WindowsMediaPlayerなどで再生してみてください。
それでも鳴らないなら音量調節が出来てないのでしょう。
コントロールパネルの「サウンドとオーディオデバイス」から「音量」の「詳細設定」を選択すると

マスタ音量 WAVA SWシンセサイザ CD音量

が調整できる画面が出てきます。
midはSWシンセサイザだと思いますので、ここがミュートになったり、音量が小さくなったりしていないか、
確認してください。


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

Name: GPGA  ..プログラマー(37,027ポイント)   Date: 2007/10/02(火) 19:02   No:10765     
Title: Re:ファイル場所を変えたら音楽が流れません    
まずエラーに関していいますと、プリプロセッサに「UNICODE」が定義されてしまっているため
windows.hが呼んでいるmmsystem.h内部でdefine定義で

#ifdef UNICODE
#define PlaySound PlaySoundW
#else
#define PlaySound PlaySoundA
#endif // !UNICODE
 
となっているためです。


ただ、今回のエラーの直接的な原因はおそらく DxLib.hをインクルードした後に
windows.hをインクルードしているため、DxLibのPlaySoundにwindows.hのdefineが
かかってしまったと思われます。
PlaySoundは本来WinAPIの一つなので、ライブラリの中に入ってしまってはいけないものなのですが
DxLibを作った方は、そのことを知らず(?)に入れてしまったそうです。(DxLibを作った方が掲示板で失敗したと言っていました)


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

Name: 待竜  ..ぴよぴよ(508ポイント)   Date: 2007/10/07(日) 23:07   No:10897     
Title: Re:ファイル場所を変えたら音楽が流れません    
迅速な回答ありがとうございます。そしてお返事がおくれてすみませんでした!

midファイルですがWindowsMediaPlayerでは流れるのでマスタ音量見てみたら
見事に0に設定されていました。上げたらしっかり流れました、ありがとうございます!

他フォルダでの不具合ですが、ヘッダファイルについて色々調べてみましたが
どのように直せばよいのか分かりませんでした・・・
解決方法がありましたら詳しく教えていただけると嬉しいです。
何度もすみません。


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

Name: 待竜  ..ぴよぴよ(605ポイント)   Date: 2007/10/07(日) 23:25   No:10898 解決!     
Title: Re:ファイル場所を変えたら音楽が流れません    
すみません、なぜか音楽が他フォルダでも流れるようになりました。
原因は良くわからないですが、とりあえず解決したということにしようと思います。
また何かあったら相談させていただきたいと思います。
ありがとうございました。


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



Name:  ..ぴよぴよ(210ポイント)   Date: 2007/10/07(日) 13:34   No:10879       
Title: 分割コンパイルについて    
はじめまして。
http://dixq.net/s/5.html
↑に書いてあるようにプログラムを書いて、ビルドしてみたのですが、下のようなエラーがでてしましました。

------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
リンクしています...
LIBCMT.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\ユーザ\My Documents\Visual Studio 2005\Projects\test\Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
ビルドログは "file://c:\Documents and Settings\ユーザ\My Documents\Visual Studio 2005\Projects\test\Debug\BuildLog.htm" に保存されました。
test - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

どなたか助けてください。お願いします。


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


Name:  ..ぴよぴよ(233ポイント)   Date: 2007/10/07(日) 14:12   No:10880 解決!     
Title: Re:分割コンパイルについて    
過去ログをよく探したら解決しました。
どうもお騒がせしました。


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



Name: 夏天 [URL]  ..初心者(5,477ポイント)   Date: 2007/10/07(日) 11:13   No:10875       
Title: ジャンプの高さ    
http://homepage2.nifty.com/natupaji/DxLib/dxprogram.html#N2
ココを見ているのですが
ジャンプの高さの調節がどうやるのかわかりません。

ボタンを長く押していれば高く
ボタンをポチって短く押せば低いジャンプです

お願いします


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


Name: 管理人 [URL]  ..伝説のハッカー(428,312ポイント)   Date: 2007/10/07(日) 16:47   No:10883     
Title: Re:ジャンプの高さ    
DXライブラリのサンプルはあくまでサンプルなので、実際にはこれじゃゲームに使えません。
等速で飛び上がり、等速で落ちていくモーションはおかしく見えると思います。

http://dixq.net/g/#27

ここに物理的シミュレーションの方法を書いていますのでよければ参考にしてください。
飛び上がる計算を、ボタンを押している間行い、話した瞬間、落ちていくモーションにすればいいと思います。

もしこの説明でわからなければ、再度ご質問下さい。


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



Name: 大工  ..上級者(21,566ポイント)   Date: 2007/10/05(金) 23:57   No:10843       
Title: ポインタ    
こんばんわ、大工です。

過去のログを検索しても引っかからなかったので質問します。

配列の引数についてなのですが

func( (*p)[2] )とfunc( p[][2] )が同じ扱いになることを本を呼んで学びました.( 最外周の添字は書いても無視され, ポインタの扱いになる. ex: func(*p) func(p[]) )しかし, なぜ, 前者が要素を2個もつint配列へのポインタの扱いになっているのは何故なのでしょうか?つまり, 最外周の添字が無視されてポインタの扱いになるのなら. func( p[][2] )とfunc( *p[2] ) が同じなんじゃないんですか??

また, func( p[][] )やfunc( p[2][] )はどういった扱いになるのでしょうか???func( **p )と同じになるのでしょうか???

いったいどれがどれと同じ扱いになるのか教えてください。


#include <stdio.h>

//void my_dice(int (*d)[7]);
void my_dice(int d[][]);

int main(void){

int dice[7][7];
int n, cnt;
int x, y;

srand(time(NULL)); //乱数の初期化.

//配列の初期化.
for(x = 0; x < 7; x++) {

for(y = 0; y < 7; y++) {

dice[y][x] = 0;
}
}

printf("試行回数:");
scanf(" %d", &n);

for(cnt = 0; cnt < n; cnt++) {

my_dice(dice);
}

return 0;
}
void my_dice(int d[][]) {
//void my_dice(int (*d)[7]) {

int x, y;

x = rand() % 6 + 1;
y = rand() % 6 + 1;

d[y][x] += 1;//←ここです

return;
}


あと, 上記の様なソースでは矢印で示している部分において"invalid use of array with unspecified bounds"とエラーが返ってきます。(コメントアウトした部分でコンパイルするとうまくいきます)これは, 要素数が明確でないのが原因なのでしょうが, コメントアウトした部分でも不明確な部分(最外周の部分です)があるのになぜコンパイルできてしまうのでしょうか???

ご協力お願いします。


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


Name: box  ..比類無きプログラマー(87,146ポイント)   Date: 2007/10/06(土) 08:31   No:10844     
Title: Re:ポインタ    
> func( p[][2] )とfunc( *p[2] ) が同じなんじゃないんですか??

演算子の優先順位の関係で、
func((*p)[2])
と、*pの前後にカッコが必要です。

> また, func( p[][] )やfunc( p[2][] )はどういった扱いになるのでしょうか???func( **p )と同じになるのでしょうか???

第2次元以降の要素数を書いていないため、
コンパイルできないはずです。


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

Name: たかぎ [URL]  ..上級者(15,738ポイント)   Date: 2007/10/06(土) 10:04   No:10847     
Title: Re:ポインタ    
> 演算子の優先順位の関係で、

型名を構成する括弧類は演算子ではありません。


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

Name: 大工  ..上級者(21,601ポイント)   Date: 2007/10/06(土) 13:14   No:10848     
Title: Re:ポインタ    
box様>

func( p[2][] )でもコンパイルはできました。。。


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

Name: box  ..比類無きプログラマー(87,231ポイント)   Date: 2007/10/06(土) 14:56   No:10849     
Title: Re:ポインタ    
>たかぎ様

> 型名を構成する括弧類は演算子ではありません。

これは大変失礼いたしました。
素人の浅はかさで、ボロが出てしまいました。

*p[2]と書くと*(p[2])と解釈するため、
「配列へのポインタ」として書くには
(*p)[2]と書かねばならない、と
言いたかったのでありました。


>大工様

> func( p[2][] )でもコンパイルはできました。。。

たまたま、各々のコンパイラが違う動きをしただけだったのですね。


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

Name: 大工  ..上級者(21,673ポイント)   Date: 2007/10/06(土) 15:09   No:10850     
Title: Re:ポインタ    
補足です。

>func( p[][2] )とfunc( *p[2] ) が同じなんじゃないんですか??



最外周がポインタに読み替えられるなら配列へのポインタ( (*P)[2] )ではなくポインタ配列( *p[2] )になるのでは??という意味です。

失礼しました。


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

Name: box  ..比類無きプログラマー(87,283ポイント)   Date: 2007/10/06(土) 15:15   No:10851     
Title: Re:ポインタ    
最外周という言葉を含んで、
添字の外とか内の概念が今一つ
よくわからないです。

左とか右ならよくわかるのですけれど。


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

Name: box  ..比類無きプログラマー(87,376ポイント)   Date: 2007/10/06(土) 15:34   No:10852     
Title: Re:ポインタ    
> 最外周がポインタに読み替えられるなら配列へのポインタ( (*P)[2] )ではなくポインタ配列( *p[2] )になるのでは??

「最外周」が仮に「いちばん左の添字」という意味だとして、
「〜読み替えられるなら」までとそこから後ろがつながらないです。

「配列へのポインタ」は、結局のところポインタです。
また、「ポインタの配列」は、結局のところ配列です。

そうすると、おっしゃっている内容は
「最外周をポインタに読み替えるなら、ポインタではなく配列になるのでは??」となり、
意味が通じなくなっています。


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

Name: 大工  ..上級者(21,741ポイント)   Date: 2007/10/06(土) 22:12   No:10860     
Title: Re:ポインタ    
説明が中と半端ですみません。

func(p[])では添字を書いても書かなくてもfunc(*p)となるので, func(p[][2])だと左半分が先ほどと同じ形なのでポインタになり p[] → *p つまりfuncの中ではfunc(*p[2])といった配列のポインタの扱いになるはずなのにどうしてfunc( (*p)[2] )と配列へのポインタになってしまうのでしょうか??という意味です。

あと, 最外周は一番左の配列のことを言います。

[3][2]だと配列の要素が2つあるものが3つある の3です。


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

Name: box  ..比類無きプログラマー(87,414ポイント)   Date: 2007/10/06(土) 22:21   No:10862     
Title: Re:ポインタ    
(*p)[2] と *(p[2]) との違いはおわかりですね?

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

Name: 大工  ..上級者(21,752ポイント)   Date: 2007/10/06(土) 22:36   No:10864     
Title: Re:ポインタ    
はい、もちろんです。

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

Name: box  ..比類無きプログラマー(87,458ポイント)   Date: 2007/10/06(土) 22:45   No:10865     
Title: Re:ポインタ    
*p[2] と、() を使わずに書いたとき、
言語仕様上、(*p)[2] と *(p[2]) のどちらとみなしますか?


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

Name: 大工  ..上級者(21,761ポイント)   Date: 2007/10/06(土) 22:55   No:10866     
Title: Re:ポインタ    
*(p[2])です。

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

Name: box  ..比類無きプログラマー(87,548ポイント)   Date: 2007/10/06(土) 23:07   No:10867     
Title: Re:ポインタ    
void func1(int (*p)[2]);
と、
void func2(int *p[2]);
という2つのプロトタイプ宣言があるとします。

このとき、func1関数とfunc2関数のそれぞれの引数pの説明を
日本語で行なうとどうなりますか?


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

Name: 大工  ..上級者(21,767ポイント)   Date: 2007/10/06(土) 23:17   No:10868     
Title: Re:ポインタ    
func1:要素を2個持つint配列へのポインタ
func2:int型へのポインタを2つ要素にもつ配列

こんなかんじでどうでしょうか?


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

Name: box  ..比類無きプログラマー(87,597ポイント)   Date: 2007/10/06(土) 23:25   No:10869     
Title: Re:ポインタ    
void func(p[][2]);
というプロトタイプ宣言と同じ意味を持つのは、
先ほどのfunc1関数、func2関数のどちらでしょうか?


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

Name: 大工  ..上級者(21,828ポイント)   Date: 2007/10/06(土) 23:31   No:10870     
Title: Re:ポインタ    
。。。。わからないです。

どうしても, p[] → *p が気になってしまいます。。

演算子の優先順位からだと。。。

func1(*p[2]);とどうしてもなってしまいます。


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

Name: YuO  ..中級者(13,418ポイント)   Date: 2007/10/07(日) 03:07   No:10874     
Title: Re:ポインタ    
追加質問的に。

一つ目。
void func3(int a[2][2]);
という関数宣言があるとします。

この関数の引数aの説明を,配列がポインタになるという規則を無視して,日本語で行うとどうなりますか?
※できれば説明の一部を抜き出した場合に別の型の説明になる場合はその部分の末尾に「〜型」と書いておいてください。


二つ目。
No.10867でboxさんが質問されたfunc1の引数のpおよびfunc2の引数のp,それから私の上の質問のfunc3のa,の3つの日本語の解説に,
説明の一部が別の型の説明になっているものを見つけ出して,それを括弧等で括ってみてください。
# 配列型派生,ポインタ型派生の派生元の型を括弧で括ろう,ということ。
例)int ** p
→『「int型」へのポインタ型』へのポインタ型
※int型,「int型」へのポインタ型はそれぞれint, int *という別の型になります。


三つ目。
二つ目と同様に,以下の二つについて日本語の括弧等入りの解説を作ってみてください。
・int a[3]
・int *p


二つ目と三つ目を比べると,boxさんのNo.10869の質問の解答が見えてくるかな,と思うのですが。

一応,先に関数引数の配列型に関して書いておくと,
引数が
・「〜型」への配列型
という型を持っているとき,コンパイラはこれを
・「〜型」へのポインタ型
と読み替えます。
この時,「〜型」はたとえ配列型であっても変更されません。
# この説明のための二つ目と三つ目の質問です。


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



Name: KURO  ..ぴよぴよ(207ポイント)   Date: 2007/10/04(木) 20:14   No:10821       
Title: LINUXでC言語    
またまたまたよろしくお願いします。
仕事でLINUX環境で使うC言語(C++)プログラムを作っているんですが、
LINUXで「system」コマンドは使えるんでしょうか?

またはLINUXで使える「system」コマンドのような関数はありますか?

キーワードを「LINUX C言語」でググッても、それっぽいサイトは引っかからないんで、
問題ないのかなぁと思うのですが、確信が無いので教えていただきたいです。

よろしくお願いします。


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


Name: YuO  ..中級者(12,800ポイント)   Date: 2007/10/04(木) 20:30   No:10822     
Title: Re:LINUXでC言語    
使えるはずですが。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/system.3.html


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

Name: cus  ..ぴよぴよ(9ポイント)   Date: 2007/10/05(金) 19:17   No:10834     
Title: Re:LINUXでC言語    

>仕事でLINUX環境で使うC言語(C++)プログラムを作っているんですが、
>LINUXで「system」コマンドは使えるんでしょうか?

C言語の開発環境が入っているなら、別にOSに依存せずにC言語の関数は使用できます。

windowsだからこれが使用出来るとか、Linuxだからこれは使用できないということは、ありません。

>キーワードを「LINUX C言語」でググッても、それっぽいサイトは引っかからないんで、
>問題ないのかなぁと思うのですが、確信が無いので教えていただきたいです。

調べるとしたら、[C言語標準関数一覧]などで、調べるといいでしょう。


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

Name: cus  ..ぴよぴよ(89ポイント)   Date: 2007/10/05(金) 19:22   No:10835     
Title: Re:LINUXでC言語    

すんません。よくみたらC++になっていましたね・・・。

C++はC言語の関数をすべてサポートしているので、大丈夫です。

でも、非推奨な関数もありますので、調べながら関数を使用していってくださいね。

余計な投稿が増えてしまって申し訳ありません。


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

Name: 管理人 [URL]  ..伝説のハッカー(427,848ポイント)   Date: 2007/10/05(金) 21:34   No:10838     
Title: Re:LINUXでC言語    
コンパイラによる違いは多くあるのではないでしょうか。

例えばLONGLONG型はwindows環境ではないと使えないと思いますし、

gccで

printf("%d %d ", rand()%2, rand()%2)
printf("%d %d ", rand()%2, rand()%2)
printf("%d %d ", rand()%2, rand()%2)

を実行すると酷いことになりますし。

Linuxはmanコマンドで関数の使い方が確認出来ますよ。

http://www.linux.or.jp/JM/html/man/man1/man.1.html

googleでも「関数名 Manpage」で検索するとたいてい希望するページが見れます。


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

Name: tkmakwins15 [URL]  ..プログラマー(28,962ポイント)   Date: 2007/10/05(金) 21:37   No:10839     
Title: Re:LINUXでC言語    
system関数を使うことはできますが、コマンド自体はOSに依存するはずです。

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

Name: 通りすがり  ..入門者(4,780ポイント)   Date: 2007/10/05(金) 21:45   No:10840     
Title: Re:LINUXでC言語    
>windowsだからこれが使用出来るとか、Linuxだからこれは使用できないということは、ありません。

何を根拠に言っているのかわかりませんが、
OSによって出来る事出来ない事がでてくることは山のようにありますね。


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

Name: cus  ..ぴよぴよ(292ポイント)   Date: 2007/10/05(金) 23:43   No:10842     
Title: Re:LINUXでC言語    


管理人さん
いつも楽しく拝見させていただいています。

>コンパイラによる違いは多くあるのではないでしょうか。
>例えばLONGLONG型はwindows環境ではないと使えないと思います

確かにコンパイラの違いで、型などの違いはありました。intが2バイトだったり4バイトだったり。
軽率な回答をしてしまって申し訳ありません。

>gccで

>printf("%d %d ", rand()%2, rand()%2)
>printf("%d %d ", rand()%2, rand()%2)
>printf("%d %d ", rand()%2, rand()%2)

上記はgccでコンパイルした所、思った通りの結果になりましたが、
ひどい結果とはどのような感じになるのでしょうか??

【tkmakwins15】さん

>system関数を使うことはできますが、コマンド自体はOSに依存するはずです

system関数はANSI C標準の関数なのですが、それでもOSに依存するのでしょうか?
若輩者ですから、間違っていたら指摘をいただきたいです。

【通りすがり】さん

>何を根拠に言っているのかわかりませんが、
>OSによって出来る事出来ない事がでてくることは山のようにありますね。

このKUROさんが質問している事は、C関数の話ですよね?
シェル上、DOS上の話ではないですよね??

例えば、windows上でgccを使用してC標準のプログラムを作成したとした時と、
    linux上でgccを使用してC標準のプログラムを作成した時に、【通りすがり】さんのおっしゃっている
出来ること、出来ないことはあるのでしょうか??
ご教授いただきたいです。

長くなってしまいました。申し訳ありません。





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

Name: たかぎ [URL]  ..上級者(15,721ポイント)   Date: 2007/10/06(土) 09:32   No:10845     
Title: Re:LINUXでC言語    
> 管理人さん

>例えばLONGLONG型はwindows環境ではないと使えないと思います

LONGLONG 型というのは、何か特別なライブラリを使わない限り、どんな環境でも使えません。
ちなみに、long long 型であれば、Turbo C++ でも Visual C++ 2005 でも MinGW でも Cygwin でも使えます。

> gccで
> (中略)
> を実行すると酷いことになりますし。

それは、gcc ではなく glibc などのライブラリの違いによるのでは?


> cusさん

> system関数はANSI C標準の関数なのですが、それでもOSに依存するのでしょうか?

system 関数の仕様をよく調べてみてください。ざっと書いてみると...

・引数に NULL を指定した場合、コマンドプロセッサが利用できる場合は非 0 を、そうでない場合は 0 を返す。
・引数に NULL 以外を指定した場合の動作と返却値は処理系定義。

といったところです。
コマンドプロセッサが使えない環境では、どんなコマンドも system 関数で実行することができません。
具体的には、(最近のものは知りませんが)昔の MacOS 用の CodeWarrior では、system(NULL) が 0 を返したように記憶しています。


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

Name: tkmakwins15 [URL]  ..プログラマー(29,179ポイント)   Date: 2007/10/06(土) 09:38   No:10846     
Title: Re:LINUXでC言語    
>system関数はANSI C標準の関数なのですが、それでもOSに依存するのでしょうか?

依存します。なぜならば、OSによって用意しているコマンドが違うからです。Windowsではファイルの削除は、ドラッグ&ドロップでできますが、UNIXやMS-DOSなどの文字ベースのOSでは、文字列によって操作します。その上で、例えば、UNIXが "kese ファイルパス" というコマンドで消すとします。また、MS-DOSでは、"kiero ファイルパス" だとします。すると、keseというコマンドは、UNIXで使えても、MS-DOSでは使えないことになりますよね。system関数は、このコマンドを実行する関数なので、OSに依存するということです。

※UNIXやMS-DOSの「ファイルを消す」という操作のコマンドは、たとえ話で、違うコマンドがあるはずです。


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

Name: たかぎ [URL]  ..上級者(15,789ポイント)   Date: 2007/10/06(土) 15:49   No:10853     
Title: Re:LINUXでC言語    
ちなみに、「ファイルを消す」コマンドは、

Unix では rm
MS-DOS では del

です。


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

Name: 管理人 [URL]  ..伝説のハッカー(428,058ポイント)   Date: 2007/10/06(土) 22:14   No:10861     
Title: Re:LINUXでC言語    
>cusさん
なんか変な所につっこんでしまってすみません。
ただ今後の誤解を招くかなと思いましたので。
酷い事というのは、例えばゲームを作るときなど、
乱数を%2で使用すると0と1が交互に現れるので、使い物にならないという意味でした。
上位ビットを使えばいいわけですけどね。

>たかぎさん
LONGLONG型を使う時は私はいつもwindows.hをインクルードするので、一般的にlinuxでは使わないかなと思ったので、一般的な話として、windowsで使えてlinuxで使えない機能として言いました。
変なことにつっこんでしまってすみませんm(_ _)m


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

Name: 通りすがり  ..初心者(5,471ポイント)   Date: 2007/10/07(日) 01:56   No:10873     
Title: Re:LINUXでC言語    
まず,別の“通りすがり”であることを断っておきます.


cusさんへ

>このKUROさんが質問している事は、C関数の話ですよね?
>シェル上、DOS上の話ではないですよね??
>
>例えば、windows上でgccを使用してC標準のプログラムを作成したとした時と、
>    linux上でgccを使用してC標準のプログラムを作成した時に、【通りすがり】さんのおっしゃっている
>出来ること、出来ないことはあるのでしょうか??

Cの標準関数そのものは,高い移植性を持っています.
しかし,例え標準関数だけを使って作成したプログラムであっても,
移植性の問題はどうしても出てきます.
どういったプログラムが移植性が高いのか,また低いのかについては,
http://www.google.co.jp/search?hl=ja&rls=GGLG%2CGGLG%3A2006-09%2CGGLG%3Aja&q=c%E3%80%80%E7%A7%BB%E6%A4%8D%E6%80%A7&btnG=%E6%A4%9C%E7%B4%A2&lr=
を参考にして下さい.

また,Windows上で,CygwinとMinGWのどちらでgccを使用するかによっても違います.
Cygwinは,UNIX互換のためにPOSIX準拠のDLLを必要とします.
MinGWは,Cygwinプロジェクトから分離してPOSIX準拠を捨てたため,
CygwinでコンパイルできてもMinGWではコンパイルできないものもあります.

ただし,移植性うんぬんではなく,
純粋に「できること」「できないこと」だけを考えるなら,
確かに,どんな計算機やOSや言語処理系を使用しても大差はありませんね.


KUROさんへ

すみませんが,仕事でと聞いて心配になってしまいました.
思い込みや勘違いでやってしまうと,
チーム全員で何日も徹夜ということにもなりかねません.
ご自分で調べてどうしても分からないときは,
同僚や上司の方に確認するのが筋だと思います.

P.S. もちろん,pipeやfork関係の関数も使えますよ.


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



Name: 大工  ..上級者(21,144ポイント)   Date: 2007/09/30(日) 13:16   No:10714       
Title: 〜雑談or質問〜    
現在、院には行かずに就職を考えております。

専攻はグラフネットワーク関係の研究室を希望しているのですが、大学での知識で社会に出てどこまで通用するのでしょうか???(C言語のテクニックやその他の言語・専攻の知識・・・etc

あと、どんな資格が必要なのでしょうか??

2回生になって不安がつのるばかりです・・・


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


Name: Hermit  ..中級者(14,481ポイント)   Date: 2007/09/30(日) 16:23   No:10720     
Title: Re:〜雑談or質問〜    
>あと、どんな資格が必要なのでしょうか??
一般常識のレベルで、
乙四(甲種でもいい)
消防設備士壱類四類
電気工事士(電験でもいいが、工事士の項目は重要)
高圧ガス
配線の耐火、耐熱、本案関係の知識も欲しい。



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

Name: Sleepy  ..かけだし(1,205ポイント)   Date: 2007/10/01(月) 23:11   No:10738     
Title: Re:〜雑談or質問〜    
学校で習ったコンピュータに関する知識が、
ソフト開発会社でどの程度通用するのか?
との質問であると仮定しての私見です。

学校では動くことを最優先にプログラムを書くと思いますが、
ソフトの開発ではプログラムが動くのは当然のことで、
どこまで異常系を盛り込むか、
どうやって簡潔に書くか、
どうやって動作を早くするか、
等等色々な事を考慮してプログラムを書いています。

なので学校での知識は全く通用しません。
余計な知識があると新しい知識の吸収の妨げとなりますので、
学校で習ったことを完全に忘れて欲しいぐらいです。

資格は不要です。
必要であれば会社から取得する様に指示が出ます。

それよりも部活でも趣味でもなんでも構いませんので、
困難にぶつかってもがき苦しんで何かを成し遂げた経験を持つ人、
いわゆる成功体験を持っている人が伸びる様に思います。


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

Name: Yuki  ..上級者(18,654ポイント)   Date: 2007/10/02(火) 14:24   No:10750     
Title: Re:〜雑談or質問〜    
Sleepyさんに同意です。

学校で勉強したことだけで社会に出てすぐ飯が食えるなんてことはほとんどありません。
○○の資格を持っていれば絶対大丈夫!なんて免罪符的な資格はありません。

就職セミナーで聞いてきたことをお教えします。
企業の欲しい人材【建前】
1.コミュニケーション力
2.チャレンジ力
3.主体性

といっているそうですが、
企業の欲しい人材【本音】
1.続くのか      (3ヶ月とかで辞めないか)
2.考え方が前向きか  (成功体験)
3.人の話が聞けるか  (質問された答えが的確か)

どんな企業でも面接しないで履歴書だけで採用することはないと思います。
そのときに自分の売りにできるものを作っておくと良いのではないでしょうか。


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

Name:  ..中級者(10,109ポイント)   Date: 2007/10/02(火) 14:45   No:10752     
Title: Re:〜雑談or質問〜    
横槍で、すみません。
とても聞きたいので、質問させていただきます。

企業の欲しい人材【本音】
これは、企業の人が言っていたのか、セミナーで説明している人が言っていたのか。

とても気になりました。
ご回答よろしくお願いします。


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

Name: 大工  ..上級者(21,185ポイント)   Date: 2007/10/02(火) 14:50   No:10754     
Title: Re:〜雑談or質問〜    
むむむむ。。。。。

2回生なんですが、就活はいつぐらいからはじめるものなんでしょうか???


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

Name: 通りすがり  ..入門者(4,747ポイント)   Date: 2007/10/02(火) 18:25   No:10759     
Title: Re:〜雑談or質問〜    
あくまで,一大学関係者の意見として聞いて下さい.

1. 大学での知識
周りを見渡して,まじめに授業にも出ず,
卒業単位だけを何とか取っている人はいませんか?
残念ながら,必死に勉強して取得した単位も,
一夜漬けの山が当たって取得できた単位も区別がつきません.
企業が大学卒の新人を採用する際,技術を要求せず,
その人の人間性で決めているという側面も確かにあります.
また,文系の人と一緒に研修を受け,
勝っていたのは最初だけで,
あっという間に追い抜かれたという話もよく聞きます.
しかし,本当に技術を持った人であれば,
そうとも限りません.
研究室での研究の専門性が高ければ高いほど,
その分野では最先端を走っていることになります.
企業と共同研究をしている場合には,
そのまま引き抜いてくれることもあります.
ただし,甘い期待はしないで下さい.

2. 資格
ネットワーク系に限定すると,
国家資格として,
・ソフトウェア開発技術者
・テクニカルエンジニア(ネットワーク)
民間資格として,
・LPIC
・シスコ技術者認定
ぐらいは在学中に取得できると思います.
特に専門学校は,
学士や修士などの学歴がない分,
このような資格はきっちりと揃えて来ます.
有名企業を狙うのであれば,
ぜひ挑戦してみて下さい.

3. 就職活動
人によっては1,2回生でも
企業説明会やインターンシップに行っている人もいます.
多くの学生は3回生から始めます.
しかし,就職活動は思い立ったが吉日です.
就職活動に早すぎるということはありません.


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

Name: Hermit  ..中級者(14,660ポイント)   Date: 2007/10/02(火) 19:23   No:10766     
Title: Re:〜雑談or質問〜    
>しかし,本当に技術を持った人であれば,
>そうとも限りません.
>研究室での研究の専門性が高ければ高いほど,
>その分野では最先端を走っていることになります.

これはかなりあります。
ただし、博士くらいであればの事ですけど。

普通の大学の専門くらいだったら、まともな企業で学んでいけば、すぐ追いつきます。
大学では、他の一般常識なども高度になってくる分、知識の幅が広くなっている事が大事だと思います。

そういう意味で、最初にコメントした関係の知識が後々役に立つと思いますが。
(というか、その手に知識がない人が多いので困ることがたまにある)
(元いた会社では、粉塵爆発起こしたし)


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

Name: Yuki  ..上級者(18,746ポイント)   Date: 2007/10/02(火) 21:46   No:10768     
Title: Re:〜雑談or質問〜    
雷さんへ
企業の本音はセミナーで聞いたことです。
その時の講師の方は職業カウンセラー(正式にこういうのかはわかりませんが)の方で、
企業の採用担当の方々と会話をして最終的にまとめたことだそうです。


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

Name: Sleepy  ..かけだし(1,362ポイント)   Date: 2007/10/02(火) 23:04   No:10772     
Title: Re:〜雑談or質問〜    
学生のみなさんへ

就職する目的は何ですか?
就職してから何をしたいのか考えたことありますか?
企業に採用して貰うこと自体が目的になっていませんか?

それと自分は人付き合いが苦手なので、
機械相手の仕事だからきっと大丈夫と、
コンピュータ業界を選ぶのは大きな勘違いです。
1人でできる仕事はありません。

長所があるにこしたことはありませんが、
短所は最低でも人並み程度に持ち上げておかないと、
人間関係で問題を起こしてしまうことになります。


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

Name:  ..中級者(10,207ポイント)   Date: 2007/10/03(水) 16:04   No:10777     
Title: Re:〜雑談or質問〜    
Yukiさん
ありがとうございます。
企業の方でなく企業と話し合った方と言うことですか…
難しいw

Sleepyさん
ものづくり(ソフト系かな)をしたいから就職する。
そして、それ以上にしたいことがない。
これは就職する目的としては弱いですよね?


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

Name: 管理人 [URL]  ..伝説のハッカー(423,050ポイント)   Date: 2007/10/03(水) 16:21   No:10778     
Title: Re:〜雑談or質問〜    
まさに就活真っ盛りな管理人ですm(_ _)m
某有名な企業の部長さんと1:1で話が出来る機会があったので色々話をしてみました。

「資格はどうでもいい、言ってしまえば学歴も問題ではないと言っていらっしゃいました。」

そして

「私たちが欲しい人材は「どれだけその仕事にやる気があって、社交的か」という事」
「出発点が少々違っても、やる気がある人はドンドン伸びて、追い越してしまう。
会社という集団の一人であるからには全く人とコミュニケーションが取れない人間では困る。
グループで成功させるには社交性が必要。
後、どれ位同じことに専念出来るか、その参考に何年も同じ部活をやっているかどうか参考にする事もある」

と言っていらっしゃいました。
部活を1年ずつやめて転々とするのは、職を転々とするであろうことを表しているのかもしれません。

このお話から私が想像するに、どれだけ面接でやる気と明るさ、社交性、ガッツを見せるかが大事なんじゃないでしょうか。
きっと何度も面接をされている面接官の方は
どれだけ機転が利いて、どれだけ頭が切れる人間かは面接を重ねていくうちにある程度解るのではないかと思います。

まだ質問する立場ですが、私の感じた意見でした。


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

Name: Sleepy  ..かけだし(1,744ポイント)   Date: 2007/10/03(水) 22:47   No:10786     
Title: Re:〜雑談or質問〜    
雷さんへ
別に目的は何でも良いのです。

仕事の上で必ず何かしらの障害が発生します。
そのときにしっかりした目的意識があれば、
障害はただの過程にすぎないと割り切り乗り越えられます。

しっかりした目的意識がなければ、
眼前で起きていることにのみ意識し振り回され、
結果として乗り越えることができなくなります。


管理人さん、Yukiさん
新卒者が仕事で利益を生み出す様になるまで3年から5年かかります。
その間は企業にとってその人の生産性はマイナス、
つまり給料泥棒ということになります。

いったん採用してしまうと給料を払う義務が生じるので、
採用は非常に慎重にならざるを得ません。
ちなみに企業にとって最大のコストは人件費です。

自分も面接官をやることがありますが面接は非常に難しいです。
何故なら応募者は一番良い状態の自分を面接にぶつけて来るからです。
色々と想定外の事を質問するのは本心が知りたいからなのです。

結局、自分が採用するかどうかの判断基準は、
学歴でも資格でもなく人間性です。
一緒に仕事したいと思えるか思えないかです。


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

Name:  ..中級者(10,256ポイント)   Date: 2007/10/03(水) 23:26   No:10788     
Title: Re:〜雑談or質問〜    
>一緒に仕事したいと思えるか思えないかです。
なるほど!!

とても分かりやすいです!!


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

Name: Yuki  ..上級者(19,032ポイント)   Date: 2007/10/05(金) 18:44   No:10832     
Title: Re:〜雑談or質問〜    
Sleepyさん
就職セミナーと書きましたが、これは*大きな声では言えませんが*
失業保険をもらうために受けました。
私は、ソフト会社で7年勤務し今年の3月退社しました。
今後、プログラマとして就職することはたぶん無いと思いますが、
自分の経験が助言になるのならと回答させていただきました。


私も就職するまでは、「自分がプログラマに向いているのだろうか」
「資格も何も持たないで就職してしまってやっていけるのだろうか」
等と悩む時期もありましたが、あまり悩んでいられない性格のようで
「入社してからがんばろう!」と早々に切り替えてしまいました。

卒業後入社するまで、「何か予習でもしようかな」とも思いましたが
面倒くさがり屋なのと、就職したらこんなに長い休みはもうないな
という気持ちから、何もしないで遊び歩きました。

こんな私でも、なんとか飯が食えるくらいにはなりましたので、
(しがない中小企業だからできたことかもしれませんが)
あまり根つめて悩まずに、「がんばってやろう」という気持ちがあれば
後は「なんとかなるさ」で大丈夫だと思います。


変な文章でごめんなさい。伝えたいことを書きました。


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

Name: Yuki  ..上級者(19,047ポイント)   Date: 2007/10/05(金) 18:46   No:10833     
Title: Re:〜雑談or質問〜    
↑退社ではなく退職ですね。
すみません><


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

Name: Sleepy  ..かけだし(2,315ポイント)   Date: 2007/10/06(土) 22:28   No:10863     
Title: Re:〜雑談or質問〜    
Yukiさん

ご同業の方でしたか。
大学関係の方かと勘違いしておりました。
中小規模の会社で7年もやっておられたのでしたら、
業界の事はもうあらかたご存知ですね。
大変失礼いたしました。

自分は色々と仕事で空回りすることが多かったのですが、
仕事で失敗しても命までは取られないやと開き直ったら、
それまで見えていなかったことが見える様になりました。

文面から真面目で寡黙な方かと想像しております。
仕事で色々と大変な目にお遭いになったとは思いますが、
だれもがみんな自分の事だけで大変になっていますので、
もう少しお気楽になられると良いかと、
これまた勝手に想像しております。


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



Name: じゃが  ..ぴよぴよ(289ポイント)   Date: 2007/10/06(土) 16:17   No:10854       
Title: 文字が出ない。    
前のエラーの質問に答えてくださった方々ありがとうございました。

また質問なんですが、
文字を出すプログラムで

#include <stdio.h>
int main (void)
{
printf("Hello World\n");
return 0;
}

とやったんですが、ウィンドウが出てすぐに消えてしまってHelloWorldと出ないんですが、
なんかおかしいところはありますかね?
これが普通なのでしょうか?


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


Name: バグ  ..熟練のプログラマー(59,085ポイント)   Date: 2007/10/06(土) 16:27   No:10855     
Title: Re:エラー E2268 HelloWorld.cpp 4: 未定義の関数    
prinrf

ではなくて…

printf

ですね。


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

Name: box  ..比類無きプログラマー(87,400ポイント)   Date: 2007/10/06(土) 16:29   No:10856     
Title: Re:エラー E2268 HelloWorld.cpp 4: 未定義の関数 'prinrf' を呼び出した(関数 main() )と言うエラー    
関数名が正しくありません。
prinrfではなくてprintfです。


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

Name: じゃが  ..ぴよぴよ(278ポイント)   Date: 2007/10/06(土) 17:55   No:10857 解決!     
Title: Re:エラー E2268 HelloWorld.cpp 4: 未定義の関数 'prinrf' を呼び出した(関数 main() )と言うエラー    
ありがとうございました。

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

Name: tkmakwins15 [URL]  ..プログラマー(29,231ポイント)   Date: 2007/10/06(土) 19:09   No:10858     
Title: Re:文字が出ない。    
じゃがさん。

別の質問をする時は、新たなスレッドを作ったほうがいいですよ。

回答ですが、return 0;の前に

getchar();

といれてみてください。


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

Name: たかぎ [URL]  ..上級者(15,895ポイント)   Date: 2007/10/06(土) 19:37   No:10859     
Title: Re:文字が出ない。    
> なんかおかしいところはありますかね?

どんな環境かを書いていないのが一番おかしい。
エラーや不具合に関する質問は、どんな環境で、どんな操作をしたときに、どんな現象になったのかを詳しく書くべきです。
今回の件については、大体どんなことなのか予想がつきますが、もしかするとそうではないかもしれませんので。


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



Name: ウババア  ..ぴよぴよ(276ポイント)   Date: 2007/10/04(木) 23:44   No:10824       
Title: エラー終了するにはどうすればいいですか?    
c言語でゲームを作っているのですが
スタート画面の処理、ゲーム画面の処理をswitchでわけたとき、どうやってエラーのとき終了すればいいのかわかりません

while(1){
switch ( g_FrameNo ) {
case START:
Start();
break;
case GAME:
Game();
break;
}
}

Game()の戻り値が1だったらエラーで終了しようとして

while(1){
switch ( g_FrameNo ) {
case START:
Start();
break;
case GAME:
if ( Game() != 0 ) return 1;
break;
}
}

こうやればいいのかとおもったのですがswitch関数を抜けるだけで終わってしまいます
なにかいい方法ないでしょうか?


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


Name: 管理人 [URL]  ..伝説のハッカー(426,591ポイント)   Date: 2007/10/05(金) 01:08   No:10826     
Title: Re:エラー終了するにはどうすればいいですか?    
return 文を書くとそこで関数が終了します。
よって条件文を抜けるだけにはなりません。

returnを書く事でswitch文を抜けるのなら一番下の文字が出力されるはずです。
実行してみてください。


#include <stdio.h>

int main(){
switch(1){
case 1:
if(1!=0){
printf("エラーreturn");
return 0;
}
break;
}
printf("ここは出力されない");
return 0;
}


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

Name: ウババア  ..ぴよぴよ(327ポイント)   Date: 2007/10/05(金) 17:03   No:10831 解決!     
Title: Re:エラー終了するにはどうすればいいですか?    
おお!returnでmain関数を抜けることってできるんですね
よく見たら違うところでミスしてました
ありがとうございました


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

Name: tkmakwins15 [URL]  ..プログラマー(28,928ポイント)   Date: 2007/10/05(金) 21:28   No:10837     
Title: Re:エラー終了するにはどうすればいいですか?    
異常終了ならば、標準ライブラリ関数のabout()関数を使うことも可能ですよ。

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

Name: 管理人 [URL]  ..伝説のハッカー(427,914ポイント)   Date: 2007/10/05(金) 23:27   No:10841     
Title: Re:エラー終了するにはどうすればいいですか?    
もしDXライブラリでゲームを作成されているのでしたら、
DxLib_End() ;を通して終了した方がよさそうです。

DX_exit(int);

とでも関数をつくり、intにエラー番号を渡してから終了させれば管理もしやすくなるでしょう。


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



Name: 組木紙織  ..上級者(22,483ポイント)   Date: 2007/10/04(木) 00:14   No:10790       
Title: コンパイラのバグ?が見つかったときどうしますか。    
今日。コンパイラのバグ?と思われるものを見つけました。
ソースコードは長くなるのでほとんど記述しませんが、

起きた現象はある自作関数中のコンソール出力の部分が全て無視されるというものです。

Releaseで実行したり、Debugでステップ実行をすると正しく動くのですが、
Debugでデバッグなしで実行をしたときのみ上記のような現象が起きます。

気をつけていれば気にすることでもなく、特定のソースのみ常に現象が起こり、少し変更を
かけたらすぐにこの現象は起こらなくなるので、別段何の問題もないのですが、

コンパイラのバグが起きたときの対処をどのようにしているのか気になったので投稿をしました。

#コンパイラを変えるということは不可能なので、その対処法だけはできません。




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


Name: Sleepy  ..かけだし(1,954ポイント)   Date: 2007/10/04(木) 00:44   No:10792     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
怪しいのは以下の3点です。

変数の初期化漏れ。
領域破壊。
スタックオーバーフロー。


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

Name: Justy  ..ハッカー(164,657ポイント)   Date: 2007/10/04(木) 00:46   No:10793     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
 ソースを見ないと何ともいえませんが、そういう場合大抵ソースコードにバグがあります。

 もし、本当にコンパイラのバグであるなら、その周辺をアセンブルコードを見ながら
ステップ実行してどのインストラクションでどう間違ったコードを出力したのか
調べるしかありません。
(或いは、あきらめてMLかBBSに丸ごと投げて調べて貰うとか)


> コンソール出力の部分が全て無視されるというものです
 単純にバッファに溜まってる可能性がありそうです。
 '\n'を最後に入れるとか、fflush()とかを使って出力ストリーム内のバッファを
出力してみてはどうでしょうか?


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

Name: 組木紙織  ..上級者(22,851ポイント)   Date: 2007/10/04(木) 01:15   No:10797     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
C言語系の話では無いのでソースコードここで上げるのはどうかと思っているのですが、
(言語はfortran77です。というより始めに言語をかくべきでしたね。忘れてました。)

>変数の初期化漏れ。
全部初期化してます。

>領域破壊。
動的に領域を確保していないので関係ないと思います。

>スタックオーバーフロー
PCのスタックを消費するほど深い再帰は使ってないはずなんですが。
#それとも私のほうが勘違いしてる?

とりあえずzipで圧縮したものを上げておきます。
一応簡単な説明文を書き込んでおきます。
大学の卒論の関係なので何の計算をしているのか分からないかもしれませんが、
何処で何をしたら現象が起きるかという部分はコメントで入れてあります。

>アセンブルコード
何かあるとすぐアセンブルコードを表示するので、見るだけなら慣れてきた。。。
意味は全然読めないですが。


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

Name: Justy  ..ハッカー(164,741ポイント)   Date: 2007/10/04(木) 01:38   No:10798     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
 fortranですか。

 申し訳ない。ちょっと手が出ないです。
 でもちょっと気になったところが。

 TRparaを get2spacePot()の引数に指定していますが、未初期化な気がします。
 代わりに TPparaという変数?を 0で初期化してたりするので、このあたりが怪しいような。


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

Name: 組木紙織  ..上級者(22,975ポイント)   Date: 2007/10/04(木) 01:55   No:10799     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
>TPpara =0
>PSpara =0

この部分ですか?
私がしたかったのは以下です。
TRpara =0
PSpara =0

多分これで、問題なくなるとおもいます。
まさか。PとRのミスあったなんて、思いもよらなかったです。

#fortranは宣言が絶対に必要なわけではないので、変数名のミスに気づきにくくて困ります。


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

Name: Justy  ..ハッカー(164,710ポイント)   Date: 2007/10/04(木) 09:45   No:10800     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
 やっぱり、そこはタイポでしたか。
 それでうまくいくといいですね。


> 変数名のミスに気づきにくくて困ります
 コンパイラオプションで何か警告とかないですか?


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

Name: 組木紙織  ..上級者(22,799ポイント)   Date: 2007/10/04(木) 10:45   No:10801     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
今使っているコンパイラの詳しい説明書がなく、詳しく使い方を教えてくれる人もいなかったので
コンパイラオプションの設定の仕方がまだよくわからないのです。

色んなことを試してはいますが、言語仕様自体に宣言なしの変数を一部容認しているので、
(i,j,k,l,m,nなどは宣言なしで扱える整数型となっています。ほかはどうだったかな覚えていませんが、)

期待はしないほうがいいのかなと思います。


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

Name: hoge  ..かけだし(1,636ポイント)   Date: 2007/10/04(木) 12:49   No:10803     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
そのコンパイラではimplicit noneは使えないの?

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

Name: TT414  ..ぴよぴよ(310ポイント)   Date: 2007/10/04(木) 15:27   No:10815     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
>i,j,k,l,m,nなどは宣言なしで扱える整数型となっています。ほかはどうだったかな覚えていませんが

はi,j,k,l,m,nから始まる変数は整数型、i〜n以外の変数は実数型です。


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

Name: GPGA  ..プログラマー(37,078ポイント)   Date: 2007/10/04(木) 15:32   No:10816     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
>i,j,k,l,m,nから始まる変数は整数型、i〜n以外の変数は実数型です。
Fortranでこの仕様があったため、Cでfor文を使用するときの
ループ変数に、iやjが使われているとか、いないとか。


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

Name: 組木紙織  ..上級者(22,852ポイント)   Date: 2007/10/05(金) 20:22   No:10836     
Title: Re:コンパイラのバグ?が見つかったときどうしますか。    
>そのコンパイラではimplicit noneは使えないの?

実際に使ってみたら使えました。
私の持っている参考書にその記述がなかったので、知らなかっただけでした。
ありがとうございます。


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



Name: KAZU  ..ぴよぴよ(296ポイント)   Date: 2007/10/05(金) 16:21   No:10829       
Title: 初めまして☆    
今回初めてC言語にてゲームを作らせていただいております。
このサイトを見ながら、VisualC++ Express Editionを導入させていただき、設定まで終わらせた後、点を打つプログラミングを実行しようとしたのですが・・・
------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
コンパイルしています...
DrawPixel.cpp
c:\documents and settings\pc-user\my documents\visual studio 2005\projects\test\drawpixel.cpp(1) : fatal error C1083: include ファイルを開けません。'DxLib.h': No such file or directory
ビルドログは "file://c:\Documents and Settings\PC-USER\My Documents\Visual Studio 2005\Projects\test\Debug\BuildLog.htm" に保存されました。
test - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
というエラーが出てしまい、全く先に進めません↓
どなたか助けていただけないでしょうか?
まだ初心者なので本当にお願いいたします。


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


Name: KAZU  ..かけだし(1,190ポイント)   Date: 2007/10/05(金) 16:38   No:10830     
Title: また書き込みします。    
すいません、先ほど質問させていただいた件なのですが、自己解決できました。
新しく生成されたプロジェクトのフォルダにDXライブラリの ソースファイルをコピーし、更にプロジェクトに追加する事です。

   @ 生成する時に指定したフォルダにDXライブラリのファイル
   『DxLib.lib DxUseCLib.lib DxLib.h DxDirectX.h』
     及び以下のファイル
   『zlib.lib libpng.lib libjpeg.lib ogg_static.lib
   vorbis_static.lib vorbisfile_static.lib 』
     をコピーします。ファイルはDXライブラリを解凍したフォルダの中の
    『プロジェクトに追加すべきファイル_VC用』という長いフォルダ名のフォルダに
    すべて入っています。
   A 次に VisualC++ 2005 Express Edition のメニューから[プロジェクト]→
     [既存項目の追加]を選び、「DxLib.h」を追加します。

の設定の場面で、コピーする場所をprojectの中ではなく、project内の自分で作ったフォルダ内にコピーしないといけなかったのですね。
お手数お掛けしまして申しわけございません。

また何かありましたらお願いします。


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

Name: たまご   Date: 2007/12/30(日) 02:19   No:108291198948793     
Title: わかりません    
はじめまして僕もKAZUさんのように初心者です。
------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
コンパイルしています...
DrawPixel.cpp
d:\test\test\drawpixel.cpp(1) : fatal error C1083: include ファイルを開けません。'DxLib.h': No such file or directory
ビルドログは "file://d:\test\test\Debug\BuildLog.htm" に保存されました。
test - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
というエラーが出てきました。いろいろ調べてみたんですけどまったく解決方法がわかりません。だれかわかりやすくおしえてください。よろしくお願いします。
それと関係があるかどうかはわかりませんが僕のパソコンは
OS; windows vista basic
型:FMV-BIBLO NF-40U
です。




Name: プーコ  ..入門者(3,520ポイント)   Date: 2007/10/02(火) 14:50   No:10753       
Title: 簡単な野球のプログラムを作っているのですが。。。    
管理人様、いつもご丁寧にありがとうございます。
以前の1000試合の問題は解決しました!!!!(^^)ありがとうございます!!
作っているうちに楽しくなってきました。。
盗塁を実行させるために何かいい案はないでしょうか??
盗塁も確率で済ませることができるかどうか、悩んでます。。。


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


Name: 管理人 [URL]  ..伝説のハッカー(422,160ポイント)   Date: 2007/10/02(火) 18:40   No:10762     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
あ、題名が「簡単な」に変わっている^^;

盗塁に関して、どこまで本格的に作るかですが、現在の得点によったり、その選手の足の速さによったり、次の打者の打率によったりして変わるのではないでしょうか。

最低限でいいのでしたら、選手の足の速さだけは設定してはいかがでしょうか。

「実況!パワフルプロ野球」ってご存知でしょうか?もし本格的に作るのならそういうゲームをモデルに作ってみてはいかがでしょう。

選手にそれぞれステータスが設定されてますよね。
構造体で選手一人一人のデータを設定して、その都度計算すればいいのではないでしょうか。
例えば、盗塁しようとしている選手の足の能力を48とし、捕手の肩の能力を52とします。
数値が高い方が能力が高いとしていたら、4ほど捕手の方が有利だということになります。つまりアウトになる確率が高い。
この数値に依存した確率を計算してやればよいシミュレートが出来そうだと思います。

前回のトピでDXライブラリでサンプルを作ってみましたが、DXライブラリを使ってシミュレートしてみると視覚的にも面白くなると思います。


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

Name: 管理人 [URL]  ..伝説のハッカー(423,741ポイント)   Date: 2007/10/03(水) 17:46   No:10779     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
走者の走力と、捕手の肩の力を受け取ると、盗塁が成功する確率を計算するプログラムを作ってみました。
この関数は

・やっぱゲームの確率は曲線を描かないと面白くない
・起こることに100%など無い

という事から、sin波を使った確率を計算する関数です。
-90度〜90度は増加することを利用して、確率を求めています。
sin波を+1してやると、
-90度になるにつれ、限りなく0に近づき、90度になるにつれ、限りなく2に近づきます。

走者の能力、捕手の能力は、それぞれ1〜100で設定することとします。

差分 = 走 - 肩;

を計算する事で、能力差が-99〜99で求まります。これを100で割って、90度をかければ
-99〜90が

-90度〜90度の数値になります。
後は求まったsin波のy座標を+1してやり、2で割れば最大値1の確率が求まります。

数学的なプログラムは簡単なプログラムでも解りづらくなるので、日本語で書いてみました。
(全角に対応したコンパイラならこのままでコンパイルは通ります)

かえって見難くなってたりして・・・。


#include <stdio.h>
#include <math.h>

#define 90度 3.141592/2

double 確率計算(int 走,int 肩){
int 差分 = 走 - 肩;
double 位置= 90度 * (差分/100.0);

return (sin(位置)+1)/2;
}

int main(){
int i;
for(i=1;i<=100;i+=3)
printf("[走%3d-肩%3d] 確率 = %f\n",i,101-i,確率計算(i,101-i));
}

実行結果

[走 1-肩100] 確率 = 0.000062
[走 4-肩 97] 確率 = 0.003020
[走 7-肩 94] 確率 = 0.010389
・・・(略)
[走 49-肩 52] 確率 = 0.476447
[走 52-肩 49] 確率 = 0.523553
・・・(略)
[走 97-肩 4] 確率 = 0.996980
[走100-肩 1] 確率 = 0.999938



捕手の肩の能力がいい場合は盗塁出来る確率は低く、
走者の走る能力がいい場合は盗塁出来る確率は高くなっています。
お互い50-50の時は、(sin(0度)+1)/2ですから、0.5つまり50%になります。


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

Name: 管理人 [URL]  ..伝説のハッカー(423,897ポイント)   Date: 2007/10/03(水) 17:52   No:10780     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
構造体で選手の能力を格納すれば効率よく計算できると思いますよ。
実際には初期化関数で初期化するのではなく、ファイルに選手データを作っておいて、そこから読み込むようにすれば汎用的に成ると思います。


typedef struct{
char 名前[32];
double 打率;
int 力;
int 走;
int 肩;
int 守;
}states_t;

states_t 選手1,選手2;

void 初期化(){

strcpy(選手1.名前, "イチロー");
選手1.打率=0.306;
選手1.力=90;
選手1.走=70;
選手1.肩=60;
選手1.守=75;

strcpy(選手2.名前, "松井");
選手2.打率=0.286;
選手2.力=40;
選手2.走=80;
選手2.肩=65;
選手2.守=65;

}

 
 
それともしよろしければお聞かせ願いたいのですが、
プーコさんはDXライブラリでゲームをお作りなんでしょうか。
それとも野球の詳細なシミュレートを計算し、選手データから今年の勝敗予想をするようなプログラムをお作りなのでしょうか?
私は根っからゲームの方ばかりですが、後者の方もおもしろそうですね。
ただそうなると正確な選手データと、試合を再現するための緻密で膨大な分析が必要そうですね。


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

Name: プーコ  ..入門者(3,642ポイント)   Date: 2007/10/04(木) 12:22   No:10802     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
管理人様、
私は後者の方です!!勝敗予想と言うことではないのですが、確率上で野球をしてみるとおもしろいかと
思ったのです!!(^^)
以前、試合を繰り返すと勝敗結果が偏ると言いましたが、あの問題が解決していませんでした(TT)
添付してみようとしましたが、テキストエディタで作ったプログラムは添付できませんでした(TT)


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

Name: プーコ  ..初心者(5,608ポイント)   Date: 2007/10/04(木) 12:52   No:10804     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
プログラムが大きいのでここに分割して載せてみます(^^)

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main()

{

int g,team,e,o,s[2],b[4],dajun[2],y,x,z;

float ran0,P[2][9][5];

srand((unsigned)time( NULL ));

/*イニング数、アウト数、得点、打順,ベースの状況(b[0]:本塁。b[1]:一塁。b[2]:二塁。b[3]:三塁)の初期設定*/

e=0;team=0;o=0;s[1]=0;s[0]=0;dajun[0]=1;dajun[1]=1;b[1]=0;b[2]=0;b[3]=0;b[0]=1,g=1,y=0,x=0,z=0;


P[0][0][0]=0.2400; P[0][0][1]=0.2800; P[0][0][2]=0.3000; P[0][0][3]=0.3100; P[0][0][4]=0.3600;

P[0][1][0]=0.2400; P[0][1][1]=0.2800; P[0][1][2]=0.3000; P[0][1][3]=0.3100; P[0][1][4]=0.3600;

P[0][2][0]=0.2400; P[0][2][1]=0.2800; P[0][2][2]=0.3000; P[0][2][3]=0.3100; P[0][2][4]=0.3600;

P[0][3][0]=0.2400; P[0][3][1]=0.2800; P[0][3][2]=0.3000; P[0][3][3]=0.3100; P[0][3][4]=0.3600;

P[0][4][0]=0.2400; P[0][4][1]=0.2800; P[0][4][2]=0.3000; P[0][4][3]=0.3100; P[0][4][4]=0.3600;

P[0][5][0]=0.2400; P[0][5][1]=0.2800; P[0][5][2]=0.3000; P[0][5][3]=0.3100; P[0][5][4]=0.3600;

P[0][6][0]=0.2400; P[0][6][1]=0.2800; P[0][6][2]=0.3000; P[0][6][3]=0.3100; P[0][6][4]=0.3600;

P[0][7][0]=0.2400; P[0][7][1]=0.2800; P[0][7][2]=0.3000; P[0][7][3]=0.3100; P[0][7][4]=0.3600;

P[0][8][0]=0.2400; P[0][8][1]=0.2800; P[0][8][2]=0.3000; P[0][8][3]=0.3100; P[0][8][4]=0.3600;



P[1][0][0]=0.2400; P[1][0][1]=0.2800; P[1][0][2]=0.3000; P[1][0][3]=0.3100; P[1][0][4]=0.3600;

P[1][1][0]=0.2400; P[1][1][1]=0.2800; P[1][1][2]=0.3000; P[1][1][3]=0.3100; P[1][1][4]=0.3600;

P[1][2][0]=0.2400; P[1][2][1]=0.2800; P[1][2][2]=0.3000; P[1][2][3]=0.3100; P[1][2][4]=0.3600;

P[1][3][0]=0.2400; P[1][3][1]=0.2800; P[1][3][2]=0.3000; P[1][3][3]=0.3100; P[1][3][4]=0.3600;

P[1][4][0]=0.2400; P[1][4][1]=0.2800; P[1][4][2]=0.3000; P[1][4][3]=0.3100; P[1][4][4]=0.3600;

P[1][5][0]=0.2400; P[1][5][1]=0.2800; P[1][5][2]=0.3000; P[1][5][3]=0.3100; P[1][5][4]=0.3600;

P[1][6][0]=0.2400; P[1][6][1]=0.2800; P[1][6][2]=0.3000; P[1][6][3]=0.3100; P[1][6][4]=0.3600;

P[1][7][0]=0.2400; P[1][7][1]=0.2800; P[1][7][2]=0.3000; P[1][7][3]=0.3100; P[1][7][4]=0.3600;

P[1][8][0]=0.2400; P[1][8][1]=0.2800; P[1][8][2]=0.3000; P[1][8][3]=0.3100; P[1][8][4]=0.3600;






char name[2][16]={"表 川崎","裏 宗則"};
printf("ーーーーーーーーーーーーー \n\n\n\n\n");
for(g=1;g<=1000;g++)
{
dajun[0]=1;dajun[1]=1;
printf("%d試合目です!!\n\n",g);

for(e=0;e<9;e++)
{
printf("=============================%d回====================================\n\n\n",e+1);
for(team=0;team<2;team++)
{
if(e==8&&team==1&&s[1]>s[0])
{
printf("ここまでの得点が%sの方が高いため、9回裏の%sの攻撃はありません!\n\n",name[team],name[team]);
break;
}
else
{
printf("%d回の%sの攻撃です!!\n",e+1,name[team]);
while(o<3)
{

for(dajun[team];dajun[team]<=9;dajun[team]++)
{
ran0 = rand()/(RAND_MAX+1.0);
if(0.0<ran0&&ran0<P[team][dajun[team]][1])/*ヒット*/
{
/*ランナーなしの時の動き*/
if(b[1]==0&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!ランナー一塁!\n",dajun[team]);
b[1]=1;b[2]=0;b[3]=0;b[0]=1;
}
/*ランナー一塁のときの動き*/
else if(b[1]==1&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!ランナー一塁二塁!!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=0;b[0]=1;
}
/*ランナー一塁二塁のときの動き*/
else if(b[1]==1&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!満塁!!ランナー満塁!!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー満塁の時の動き*/
else if(b[1]==1&&b[2]==1&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 ヒットです!一点追加!!なおもランナー満塁!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=1;b[0]=1;
s[team]=s[team]+1;
}
/*ランナー一塁三塁の時の動き*/
else if(b[1]==1&&b[3]==1&&b[2]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!一点追加でランナー一塁二塁!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=0;b[0]=1;
s[team]=s[team]+1;
}
/*ランナー二塁三塁のときの動き*/
else if(b[2]==1&&b[3]==1&&b[1]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!一点追加でランナー一塁三塁!\n",dajun[team]);
b[1]=1;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+1;
}
/*ランナー二塁のとき*/
else if(b[1]==0&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ヒットです!ランナー2塁3塁!!\n",dajun[team]);
b[1]=0;b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー三塁のとき*/
else if(b[1]==0&&b[2]==0&&b[3]==1&&b[0]==1)
{

printf(" %d番打者 ヒットです!一点追加でランナー一塁!!\n",dajun[team]);
b[1]=1;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+1;
}
}


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

Name: プーコ  ..初心者(8,229ポイント)   Date: 2007/10/04(木) 12:53   No:10805     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    

else if(P[team][dajun[team]][1]<ran0&&ran0<P[team][dajun[team]][2])/*ツーベースヒット*/

{
/*ランナーなしの時の動き*/
if(b[1]==0&&b[2]==0&&b[3]==0&&b[0]==1)
{

printf(" %d番打者 ツーベースヒットです!!ランナー二塁!!\n",dajun[team]);
b[1]=0; b[2]=1; b[3]=0; b[0]=1;
}
/*ランナー一塁のときの動き*/
else if(b[1]==1&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ツーベースヒットです!ランナー2塁3塁!!\n",dajun[team]);
b[1]=0; b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー一塁二塁のときの動き*/
else if(b[1]==1&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ツーベースヒットです!一点追加!!ランナー二塁三塁!!\n",dajun[team]);
b[1]=0; b[2]=1;b[3]=1; b[0]=1;
s[team]=s[team]+1;
}
/*ランナー満塁の時の動き*/
else if(b[1]==1&&b[2]==1&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 ツーベースヒットです!2点追加!!なおもランナー二塁三塁!\n",dajun[team]);
b[1]=0; b[2]=1; b[3]=1; b[0]=1;
s[team]=s[team]+2;
}
/*ランナー一塁三塁の時の動き*/
else if(b[1]==1&&b[3]==1&&b[2]==0&&b[0]==1)
{
printf(" %d番打者 ツーベースヒットです!1点追加でランナー2塁3塁!\n",dajun[team]);
b[1]=0;b[2]=1; b[3]=1;b[0]=1;
s[team]=s[team]+1;
}
/*ランナー二塁三塁のときの動き*/
else if(b[2]==1&&b[3]==1&&b[1]==0&&b[0]==1)
{
printf(" %d番打者 ツーベースヒットです!2点追加でランナー2塁!\n",dajun[team]);
b[1]=0;b[2]=1;b[3]=0; b[0]=1;
s[team]=s[team]+2;
}
/*ランナー二塁のとき*/
else if(b[1]==0&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 ツーベースヒットです!一点追加でランナー2塁!!\n",dajun[team]);
b[1]=0;b[2]=1;b[3]=0; b[0]=1;
s[team]=s[team]+1;
}
/*ランナー三塁のとき*/
else if(b[1]==0&&b[2]==0&&b[3]==1&&b[0]==1)
{

printf(" %d番打者 ツーベースヒットです!一点追加でランナー2塁!!\n",dajun[team]);
b[1]=0;b[2]=1;b[3]=0; b[0]=1;
s[team]=s[team]+1;
}
}

else if(P[team][dajun[team]][2]<ran0&&ran0<P[team][dajun[team]][3])/*スリーベースヒット*/

{
/*ランナーなしの時の動き*/
if(b[1]==0&&b[2]==0&&b[3]==0&&b[0]==1)
{

printf(" %d番打者 スリーベースヒットです!!!ランナー三塁!!\n",dajun[team]);
b[1]=0; b[2]=0; b[3]=1; b[0]=1;
}
/*ランナー一塁のときの動き*/
else if(b[1]==1&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 スリーベースヒットです!!!一点追加!なおもランナー三塁!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+1;

}
/*ランナー一塁二塁のときの動き*/
else if(b[1]==1&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 スリーベースヒットです!!!二点追加!!なおもランナー三塁!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+2;

}
/*ランナー満塁の時の動き*/
else if(b[1]==1&&b[2]==1&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 スリーベースヒットです!3点追加!!なおもランナー3塁!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+3;
}
/*ランナー一塁三塁の時の動き*/
else if(b[1]==1&&b[3]==1&&b[2]==0&&b[0]==1)
{
printf(" %d番打者 スリーベースヒットです!2点追加でランナー3塁!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+2;
}
/*ランナー二塁三塁のときの動き*/
else if(b[2]==1&&b[3]==1&&b[1]==0&&b[0]==1)
{
printf(" %d番打者 スリーベースヒットです!2点追加でランナー3塁!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+2;
}
/*ランナー二塁のとき*/
else if(b[1]==0&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 スリーベースヒットです!一点追加でランナー3塁!!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+1;
}
/*ランナー三塁のとき*/
else if(b[1]==0&&b[2]==0&&b[3]==1&&b[0]==1)
{

printf(" %d番打者 スリーベースヒットです!一点追加でランナー3塁!!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
s[team]=s[team]+1;
}
}


2,621ポイント を手に入れた。

Name: プーコ  ..中級者(10,502ポイント)   Date: 2007/10/04(木) 12:54   No:10806     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
else if(P[team][dajun[team]][3]<ran0&&ran0<P[team][dajun[team]][4])/*HR*/

{
/*ランナーなしの時の動き*/
if(b[1]==0&&b[2]==0&&b[3]==0&&b[0]==1)
{

printf(" %d番打者 HRです!!!!一点追加!!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+1;
}
/*ランナー一塁のときの動き*/
else if(b[1]==1&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 HRです!!!二点追加!!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+2;

}
/*ランナー一塁二塁のときの動き*/
else if(b[1]==1&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 HRです!!!!三点追加です!!ランナーなくなりました!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+3;

}
/*ランナー満塁の時の動き*/
else if(b[1]==1&&b[2]==1&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 HRです!4点追加!!ランナーなくなりました!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+4;
}
/*ランナー一塁三塁の時の動き*/
else if(b[1]==1&&b[3]==1&&b[2]==0&&b[0]==1)
{
printf(" %d番打者 HRです!3点追加でランナーなくなりました!!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+3;
}
/*ランナー二塁三塁のときの動き*/
else if(b[2]==1&&b[3]==1&&b[1]==0&&b[0]==1)
{
printf(" %d番打者 HRです!3点追加でランナーなくなりました!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+3;
}
/*ランナー二塁のとき*/
else if(b[1]==0&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 HRです!二点追加でランナーなくなりました!!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+2;
}
/*ランナー三塁のとき*/
else if(b[1]==0&&b[2]==0&&b[3]==1&&b[0]==1)
{

printf(" %d番打者 HRです!二点追加でランナーなくなりました!!\n",dajun[team]);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
s[team]=s[team]+2;
}

}

else if(P[team][dajun[team]][4]<ran0&&ran0<P[team][dajun[team]][5])/*四死球*/

{
/*ランナーなしの時の動き*/
if(b[1]==0&&b[2]==0&&b[3]==0&&b[0]==1)
{

printf(" %d番打者 四死球です!!!!!ランナー一塁!!\n",dajun[team]);
b[1]=1;b[2]=0;b[3]=0;b[0]=1;
}
/*ランナー一塁のときの動き*/
else if(b[1]==1&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 四死球です!!!!!ランナー一塁二塁!!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=0;b[0]=1;
}
/*ランナー一塁二塁のときの動き*/
else if(b[1]==1&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 四死球です!満塁!!ランナー満塁!!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー満塁の時の動き*/
else if(b[1]==1&&b[2]==1&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 四死球です!一点追加!!なおもランナー満塁!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=1;b[0]=1;
s[team]=s[team]+1;
}
/*ランナー一塁三塁の時の動き*/
else if(b[1]==1&&b[3]==1&&b[2]==0&&b[0]==1)
{
printf(" %d番打者 四死球です!ランナー満塁!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー二塁三塁のときの動き*/
else if(b[2]==1&&b[3]==1&&b[1]==0&&b[0]==1)
{
printf(" %d番打者 四死球です!ランナー満塁!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー二塁のとき*/
else if(b[1]==0&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 四死球です!ランナー2塁1塁!!\n",dajun[team]);
b[1]=1;b[2]=1;b[3]=0;b[0]=1;
}
/*ランナー三塁のとき*/
else if(b[1]==0&&b[2]==0&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 四死球です!ランナー一塁3塁!!\n",dajun[team]);
b[1]=1;b[2]=0;b[3]=1;b[0]=1;
}

}


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

Name: プーコ  ..中級者(11,399ポイント)   Date: 2007/10/04(木) 12:54   No:10807     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
else /*アウト*/

{
o=o+1;
/*ランナーなしの時の動き*/
if(b[1]==0&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=0;b[2]=0;b[3]=0;b[0]=1;
}
/*ランナー一塁のときの動き*/
else if(b[1]==1&&b[2]==0&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=1;b[2]=0;b[3]=0;b[0]=1;

}
/*ランナー一塁二塁のときの動き*/
else if(b[1]==1&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=1;b[2]=1;b[3]=0;b[0]=1;

}
/*ランナー満塁の時の動き*/
else if(b[1]==1&&b[2]==1&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=1;b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー一塁三塁の時の動き*/
else if(b[1]==1&&b[3]==1&&b[2]==0&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=1;b[2]=1;b[3]=0;b[0]=1;
}
/*ランナー二塁三塁のときの動き*/
else if(b[2]==1&&b[3]==1&&b[1]==0&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=0;b[2]=1;b[3]=1;b[0]=1;
}
/*ランナー二塁のとき*/
else if(b[1]==0&&b[2]==1&&b[3]==0&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=0;b[2]=1;b[3]=0;b[0]=1;
}
/*ランナー三塁のときの動き*/
else if(b[1]==0&&b[2]==0&&b[3]==1&&b[0]==1)
{
printf(" %d番打者 アウト!%dアウトです!!\n",dajun[team],o);
b[1]=0;b[2]=0;b[3]=1;b[0]=1;
}
}
if(dajun[team]==9)
{
dajun[team]=0;
}
if(o==3)
{
dajun[team]=dajun[team]+1;
break;
}
}
}
}
printf(" 3アウトになりました! チェンジです!!\nこの回までの%sの得点は%d点です!!\n\n\n\n",name[team],s[team]);
o=0;
b[1]=0;
b[2]=0;
b[3]=0;
b[0]=1;
}
}

if(s[0]>s[1])
{
printf("試合終了です!!\n%d対%dで%sの勝利です!!\n",s[0],s[1],name[0]);
x=x+1;
s[0]=0,s[1]=0;
}
else if(s[1]>s[0])
{
printf("試合終了です!!\n%d対%dで%sの勝利です!!\n",s[1],s[0],name[1]);
s[0]=0,s[1]=0;
y=y+1;
}
else
{
printf("試合終了です!!\n%d対%dで引き分けです!!\n",s[0],s[1]);
s[0]=0,s[1]=0;
z=z+1;
}
}
printf("=================================\n\n通算成績\n川崎%d勝 宗則%d勝 %d引き分け\n\n\n\n\n\n",x,y,z);
return 0;

}


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

Name: プーコ  ..中級者(11,474ポイント)   Date: 2007/10/04(木) 12:57   No:10809     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
2チームとも全員私の好きな川崎選手にしてみました!!チーム名も(笑)
全部つなげるとコンパイラで実行できます!!
全員同じ確率なので、1000試合繰り返すと、大体同じくらい勝つと思うのですが、
プログラムのどこを修正すれば良いかわかりません!(TT)
できたと思ったのですが(TT)


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

Name: 管理人 [URL]  ..伝説のハッカー(424,358ポイント)   Date: 2007/10/04(木) 13:55   No:10811     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
うわぉ、長い。
コードを投稿する時は、プレタグで囲んでください。
今回は私が全部修正しました。
<pre>から</pre>で囲んでコードを書くと字下げされます。

パッと見ですが、まず
else if(P[team][dajun[team]][4]<ran0&&ran0<P[team][dajun[team]][5])/*四死球*/
のところ、使ってはいけない[5]を使っています。
[1]からじゃなく[0]から始まるべきでは?


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

Name: プーコ  ..中級者(11,605ポイント)   Date: 2007/10/04(木) 14:26   No:10812     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
管理人様、そこも間違いでしたね(TT)
いじっていて気づいたのですが、打順の繰り返しのところなのですが、
試合の最初にdajun[0]=0;dajun[1]=0;と設定しました。
で、if(dajun[team]==8)
{
dajun[team]=0;
}
という風に繰り返すようにしています。
で、表示を printf("%d番打者なんたらです。"dajun[team]+1);
の様に表しました。
しかし、実行結果を見ると、表示されているのが9番の次は2番打者になってしまいます。
dajun[team]=0;に戻しているのになぜ2番打者からになってしまうのでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(424,381ポイント)   Date: 2007/10/04(木) 14:46   No:10813     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
ちょっと今用事中なので、また家に帰ったらお書きしますm(_ _;)m

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

Name: 管理人 [URL]  ..伝説のハッカー(425,777ポイント)   Date: 2007/10/04(木) 19:45   No:10818     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
お書きになったプログラムをなるべく壊さないように(といってもかなり変更しましたが)書き換えました。
最低でもforで短縮出来る手続きは短縮したほうがよく、関数化できるところは関数化したほうがいいと思います。
今回は1ゲームしか行いませんから、100ゲームの結果がみたければ、forを変更してください。

詳しくは注釈を見ていただきたいのですが、わかりにくいところは、下で説明します。
わからないところがあれば遠慮なく聞いてください。
なるべく、変更点を少なくかつ、即席で作ったのであってるかどうかわかりませんが、とりあえず実行結果はよさそうなので。


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

int g,team,e,out,s[2],b[6],dajun[2],y,x,z;
double ran0,P[2][9][6];
char name[2][16]={"川崎","宗則"};
char hit_name[6][16]={"ヒット","二塁打","三塁打","本塁打","四球 ","アウト",};
char rui_name[3][16]={" 一塁 "," 二塁 "," 三塁 "};

//前のプログラムでP[0][0][0]から大量に初期化していた奴をforに置き換えただけ
void ini(){
int i,j,t;
double arr[6]={0.20, 0.15, 0.15, 0.10, 0.10, 0.30};
for(t=0;t<2;t++)
for(j=0;j<9;j++)
for(i=0;i<6;i++)
P[t][j][i]=arr[i];
}

//走者をptで受け取った分だけ移動させる
int move_player(int pt){
int i,j,score=0;
for(j=0;j<pt;j++){
for(i=3;i>=0;i--){
b[i+1]=b[i];
b[i]=0;
}
if(b[4]==1){
score++;
b[4]=0;
}
}
return score;
}

//塁にいる選手を描画
void disp_rui(){
int i;
printf("[");
for(i=1;i<4;i++){
if(b[i]==1)
printf("%s",rui_name[i-1]);
else
printf("   ");
}
printf("]");
}

/*ベースの状況(b[0]:本塁。b[1]:一塁。b[2]:二塁。b[3]:三塁。b[4]:本塁)*/
int main(){
int score,i;
double p;
srand((unsigned)time( NULL ));

ini();//設定

for(g=1;g<=1;g++){//
dajun[0] = 0; dajun[1] = 0; s[0]=0; s[1]=0;//初期化

printf("%d試合目\n",g);

for(e=0;e<9;e++){
printf("=============================%d回====================================\n",e+1);

for(team=0;team<2;team++){
if(e==8&&team==1&&s[1]>s[0]){
printf("ここまでの得点が%sの方が高いため、9回裏の%sの攻撃はありません!\n",name[team],name[team]);
break;
}
else{
printf("%d回の%sの攻撃\n",e+1,name[team]);
out=0;
b[1]=0; b[2]=0; b[3]=0;//走者の初期化

while(out<3){
b[0]=1;//打席に立たせる
ran0 = (rand()%1000)/1000.0;
for(p=0,i=0;i<6;i++){//6種類のPによる確率で分岐。あった所でif文に入る
if(p<=ran0 && ran0<p+P[team][dajun[team]][i]){
printf(" %2d番打者 %s ", dajun[team]+1, hit_name[i]);
if(i<4){//四球、アウトじゃなければ
score = move_player(i+1);//i=0はヒット、=1は二塁打、=2は三塁打、=3はHRを表すので、進めるマスはi+1
s[team] += score;//前関数から返って来たスコアを加算する。
disp_rui();//塁にいる走者を描画
if(score>0)//今得点が入ったら
printf(" %d点追加",score);
}
else
disp_rui();
if(i==5)//アウトなら
out++;
break;
}
p+=P[team][dajun[team]][i];//6種類のPの確率をforでまわすため加算
}
printf("\n");
dajun[team] = (++dajun[team])%9;//数字を9で割った余りは8になる。つまり足して9になれば0になる。よってループ出来る。
}
}
printf("  3アウトチェンジ\n  ** %s[%d] : %s[%d] **\n",name[0],s[0],name[1],s[1]);
}
}
if(s[0]>s[1]){
printf("試合終了\n%d : %dで%sの勝利\n\n",s[0],s[1],name[0]);
x++;
}
else if(s[1]>s[0]){
printf("試合終了\n%d : %dで%sの勝利\n\n",s[1],s[0],name[1]);
y++;
}
else{
printf("試合終了\n%d : %dで引き分け\n\n",s[0],s[1]);
z++;
}
}
printf("=================================\n\n");
printf("通算成績\n川崎%d勝 宗則%d勝 %d引き分け\n\n\n",x,y,z);
return 0;
}

 
 


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

Name: 管理人 [URL]  ..伝説のハッカー(426,647ポイント)   Date: 2007/10/04(木) 19:55   No:10819     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    


実行結果例

1試合目
=============================1回====================================
1回の川崎の攻撃
1番打者 三塁打 [       三塁 ]
2番打者 アウト [       三塁 ]
3番打者 本塁打 [         ] 2点追加
4番打者 四球  [         ]
5番打者 二塁打 [    二塁    ]
6番打者 ヒット [ 一塁     三塁 ]
7番打者 ヒット [ 一塁 二塁    ] 1点追加
8番打者 アウト [ 一塁 二塁    ]
9番打者 三塁打 [       三塁 ] 2点追加
1番打者 二塁打 [    二塁    ] 1点追加
2番打者 アウト [    二塁    ]
  3アウトチェンジ
  ** 川崎[6] : 宗則[0] **
1回の宗則の攻撃
1番打者 ヒット [ 一塁       ]
2番打者 二塁打 [    二塁 三塁 ]
3番打者 二塁打 [    二塁    ] 2点追加
4番打者 アウト [    二塁    ]
5番打者 二塁打 [    二塁    ] 1点追加

・・・・略






まず、move_player関数です。

int move_player(int pt){
int i,j,score=0;
for(j=0;j<pt;j++){//pt分進める
for(i=3;i>=0;i--){//三塁からホームベースまで
b[i+1]=b[i];//1つずつ進める
b[i]=0;//コピー元は削除
}
if(b[4]==1){//もし1周まわっていたら
score++;//スコアを加算
b[4]=0;//本塁にいる走者を削除
}
}
return score;//スコアを返す
}

ビットシフトの方がいいと思いますが、どうしても配列でやりたければこのようにしてはいかがでしょうか。
ptに受け取った分だけ塁を進める関数です。

b[0]:打席、b[1]:一塁、b[2]二塁、b[3]三塁、b[4]本塁

で定め、「四塁」にあたる本塁も定めます。本塁にたどり着くと得点になります。
一つずつみてやれば難しくありませんから注釈を見てください。
一つずつマスを進めているだけです。


次に現在塁にいる人を描画する関数です。

void disp_rui(){
int i;
printf("[");
for(i=1;i<4;i++){
if(b[i]==1)
printf("%s",rui_name[i-1]);
else
printf("   ");
}
printf("]");
}

これも特に難しくなく、ただ特定のbに人がいればそのrui_nameを表示しているだけです。

今回かなり短縮させたのは、6種類の確率を計算する部分で

if(p<=ran0 && ran0<p+P[team][dajun[team]][i]){
}
p+=P[team][dajun[team]][i];//6種類のPの確率をforでまわすため加算

これをまわしています。
これにより、範囲が
[0]〜[1]、[1]〜[2]、[2]〜[3]。。。。
とする事が出来ます。

後はこの部分です。

dajun[team] = (++dajun[team])%9;

0 を9で割った余りは0
1 を9で割った余りは1
2 を9で割った余りは2
3 を9で割った余りは3
4 を9で割った余りは4
5 を9で割った余りは5
6 を9で割った余りは6
7 を9で割った余りは7
8 を9で割った余りは8
9 を9で割った余りは0
10を9で割った余りは1
11を9で割った余りは2
12を9で割った余りは3

つまり割った余りと言うのはループするので、

たした結果が9以上になろうとすると0に戻るため、このような書き方でループできます。

他に何かわからない箇所があれば聞いてください。



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

Name: 管理人 [URL]  ..伝説のハッカー(426,716ポイント)   Date: 2007/10/04(木) 23:29   No:10823     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    


250万回計算した結果

通算成績
川崎1222478勝
宗則1221830勝
55692引き分け


 
妥当な結果になったのではないでしょうか。


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

Name: プーコ  ..中級者(11,773ポイント)   Date: 2007/10/05(金) 14:30   No:10827     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
管理人様、こんなすごいものをありがとうございます!!(^^)
さすがに神ですね!!しかも250万試合とは!
私は、関数の作りかたは分かるのですが、あまり関数を用いてコードを書かないので、
敬遠してきました(TT)
しかし、管理人様の解説が大変分かりやすかったです!!
こちらの方が見やすいですし、なによりコードが短くて良いですね!!!!(^^)
しかし、今はニチーム分まったく同じ打者だから良いのですが、
全員違う率の打者にするにはどうすればよいのでしょうか?


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

Name: 管理人 [URL]  ..伝説のハッカー(427,674ポイント)   Date: 2007/10/05(金) 15:28   No:10828     
Title: Re:簡単な野球のプログラムを作っているのですが。。。    
前にも書いたとおり、選手データをファイルから読み込む形にすれば、楽になると思います。
こんなデータが書かれたテキストファイルを用意します。

イチロー
312

松井
287

前田
301

選手名と打率が書かれています。
fopen関数でファイルを開き、fgets関数で1行ずつデータを読み込みます。
ここでは、読みにくくならないように最小限の処理しかしていません。
きっと打率以外にも欲しいデータはあるでしょうし、
行わなければならないエラー処理もやらずにあります。

理解したのち、任意に追加してください。

説明は注釈を見てください。

1行ずつ読み込む時、今何行目を読み込んでいるかiでカウントし、その行によってswitch文で処理分岐させます。
jはその組をカウントしてあります。今回はデータが3組ありますね。

「0行目はなまえ、1行目は打率、2行目は何もかかれていない」

という書式のデータ組であることに注目してください。

名前は改行コードが最後に入っているので、除去して使ってください。


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

typedef struct{
char name[64];
int state[1];
}states_t;

#define BUF 64
#define MAX 10

int main(){
int i=0,j=0,t;
FILE *fp;
states_t states[MAX];
char st[BUF];

if ( (fp = fopen("dat.txt", "r") ) ==NULL ){//ファイルを開けて、エラーが起これば
printf("ファイルオープンエラー");
return 0;
}

while( fgets(st, BUF , fp) && j<MAX){//1行読み込みが成功中 かつ j組個が最大値より少ない
switch(i){
case 0://0行目
strcpy(states[j].name, st);//stをnameにコピー
break;
case 1://1行目
states[j].state[i-1] = atoi(st);//文字列を数値に変換して代入
break;
case 2://2行目
if(st[0]!='\n'){//何も書かれていないはずの行なので、最初が改行じゃなければ
printf("データの書式が間違っています。");//エラー
return 0;
}
break;
}
i = (++i) % 3;//3つヒトまとまりのループをさせる
if(i==0)//3つ数えると元に戻るからi==0の時カウントすると組がカウント出来る
j++;
}

for(t=0;t<j;t++)
printf("%s - %d \n", states[t].name, states[t].state[0]);

return 0;
}

 
 


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



Name: HEAVEN  ..ぴよぴよ(99ポイント)   Date: 2007/10/02(火) 14:43   No:10751       
Title: 初めまして!    
Visual StudioでのDXライブラリを導入できません、どなたか助けてもらえませんか?
ファイルを展開し、slnファイルを実行してみたのですが、
「選択されたファイルはVisual Studioのソリューションファイルではありません。」
と、表示され、先に進めません。
Visual C++ 6.0 OSはXPを使ってます。


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


Name: 管理人 [URL]  ..伝説のハッカー(420,609ポイント)   Date: 2007/10/02(火) 18:07   No:10757     
Title: Re:初めまして!    
DxLib.dswを開いてみてください。


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

Name: HEAVEN  ..ぴよぴよ(191ポイント)   Date: 2007/10/05(金) 00:22   No:10825 解決!     
Title: Re:初めまして!    
すみません、返信遅れました。
ありがとうございます!起動することが出来ました!
過去ログを見ても分からない言葉がちらほら出て混乱してしまいました。
また分からない事が出来たら教えてくださると嬉しいです。


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



Name: KURO  ..ぴよぴよ(42ポイント)   Date: 2007/09/30(日) 13:07   No:10712       
Title: インターフェースクラスとは    
こんにちわ
突然ですが、インターフェースクラスって何ですか?
色々サイトを読んでみたんですが、よくわかりません。

ものすごくアバウトな質問ですが、教えてください


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


Name: たかぎ [URL]  ..上級者(15,393ポイント)   Date: 2007/09/30(日) 15:33   No:10717     
Title: Re:インターフェースクラスとは    
対象となる言語も文脈も分からないのでアバウトな回答しかできません。

> インターフェースクラスって何ですか?


文字通り、インタフェースとなるクラスのことです。


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

Name: KURO  ..ぴよぴよ(7ポイント)   Date: 2007/10/04(木) 20:06   No:10820 解決!     
Title: Re:インターフェースクラスとは    
たかぎさん、ありがとうございました。

勉強不足だったようです・・・(笑)
もう少し勉強しようと思いますorz


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



Name: haku  ..ぴよぴよ(651ポイント)   Date: 2007/10/03(水) 23:57   No:10789       
Title: べき乗剰余計算アルゴリズム【バイナリー法】    
はじめまして☆
大学で情報セキュリティの研究室に属しています、hakuと申します。

情報セキュリティの研究室に属してはいますが、恥ずかしながら今までCをいじった経験はほとんどなく、研究の課題に苦しんでいます。

今取り組んでいるのはRSA暗号で使う、べき乗剰余計算アルゴリズムのバイナリー法をC言語で書くというものです。
以下は最も基本的なバイナリー法のアルゴリズムです。

【バイナリー法】
データのビット長をn, dのバイナリー(二進数)表現を(d[n-1],d[n-2],....d[0])とし、入力a,N,d,出力S=a^d mod Nとする。
[STEP1]S=1,j=n-1とおく。
[STEP2]j<0であればSを出力して終了し、j>=0であればSTEP3に進む。
[STEP3]S=(S*S) mod Nを計算し、STEP4へ。
[STEP4]d[j]=0のときはSTEP5に進む。d[j]=1であるときはS=(S*a) mod Nを計算し、STEP5へ。
[STEP5]j=j-1としてSTEP2に戻る。


私の研究では巨大な数のべき乗計算を扱うので、標準ライブラリ関数のpowではなく、どうしてもこのバイナリー法のアルゴリズムをC言語で書くことが必要になったのです。

自分でもやってみたのですが、10進数で与えたdの値を2進数に直したときに、STEP4の『d[j]=1であるときはS=(S*a) mod Nを計算し』というところをC言語でどのようにd[j]=1であるのか判定させ=(S*a) mod Nという計算にもっていくのか、というところがどうしてもできません。

例えば
S=3^21 mod 11のバイナリー法での計算を考えたときに、まずd=21を2進数に直すと、(10101)となりますがSTEP4に進んだときにd[j]=0なのかd[j]=1なのかをどう判定するのか、というところです。ちなみに2進数に直すときには配列を使って配列に1or0を入れていきました。

わかりにくい説明で申し訳ないのですが、よろしくお願いします。

一応、自分が考えている10進数から2進数に直すまでのプログラムを載せておきます。私はこれを使ってSTEP4のループのところを考えましたが、うまくできませんでした(>_<)


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


Name: Sleepy  ..かけだし(1,903ポイント)   Date: 2007/10/04(木) 00:36   No:10791     
Title: Re:べき乗剰余計算アルゴリズム【バイナリー法】    
何やらゴチャゴチャ書いてありますが、
3^21 mod 11をC言語で計算したいのでやり方を教えて欲しい。
との質問でよろしいのでしょうか?

ただ研究の課題であるならご自分で研究なさるべきです。
安易に誰かの研究成果を寄せ集めるのはどうかと思います。

べつに完成しなくても研究の成果は、
C言語での巨大な数のべき乗計算の手法として、
ひとつの立派な研究として成り立つと思います。


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

Name: haku  ..ぴよぴよ(809ポイント)   Date: 2007/10/04(木) 00:48   No:10794     
Title: Re:べき乗剰余計算アルゴリズム【バイナリー法】    
そうですね。わかりにくくてすいません(>_<)

最終的な課題というか、そこに行くまでの途中のところでして。。。
4人で分担してプログラムを書いてまして、一人がつまづくと他にも迷惑がかかるので焦ってたんです(;一_一)


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

Name: Sleepy  ..かけだし(2,077ポイント)   Date: 2007/10/04(木) 00:57   No:10795     
Title: Re:べき乗剰余計算アルゴリズム【バイナリー法】    
ならばまず他の人に、
このままじゃできないどうしよう。
と相談すべきです。

4人で話し合えば何か解決策が見つかるかもです。

尚、プログラムは書く前に実現方法を明確にするものです。
実現方法も分からないままプログラムを書き始めると、
ほぼ間違いなく地獄に落ちることになります。


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

Name: haku  ..ぴよぴよ(846ポイント)   Date: 2007/10/04(木) 01:14   No:10796     
Title: Re:べき乗剰余計算アルゴリズム【バイナリー法】    
それぞれの課題が大変そうだったのでなかなか聞きにくくて。。。でも聞いてみますね!

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

Name: box  ..比類無きプログラマー(87,100ポイント)   Date: 2007/10/04(木) 13:31   No:10810     
Title: Re:べき乗剰余計算アルゴリズム【バイナリー法】    
バイナリー法とどこまで関連するかはよくわからないですが、
べき乗数の剰余を求める際は「整数の合同」について
調べてみるとよいかもしれません。


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

Name: haku  ..ぴよぴよ(865ポイント)   Date: 2007/10/04(木) 18:54   No:10817 解決!     
Title: Re:べき乗剰余計算アルゴリズム【バイナリー法】    
解決しました!
ありがとうございました!


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



Name: レクサス [URL]  ..ぴよぴよ(3ポイント)   Date: 2007/10/03(水) 22:12   No:10782       
Title: 配布するときのしかた    
どうもはじめまして。

初歩てきな質問かもしれないですが、
簡単なゲームを作成して、友達にやらせてと言われたのですが

どのファイルを渡せばいいのでしょうか?

相手の人がVCをもっていないといけないのでしょうか


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


Name: 管理人 [URL]  ..伝説のハッカー(424,218ポイント)   Date: 2007/10/03(水) 22:18   No:10784     
Title: Re:配布するときのしかた    
こんにちは。レクサスさん。

配布する時は、コンパイルしていないソースを渡す事はないですよ。
例えば、レクサスさんが市販のゲームをする時、ゲームで遊ぶ前に毎回コンパイルしてから遊びますか?
ゲームを実行してゲームスタートですよね。
そのように、実行ファイルのみ渡せばOKです。
もし画像ファイルや音声ファイルを使うときは、それも一緒に同梱しましょう。
例えば
他のトピに
「ロックマン」
のトピがありますよね。そこで実行ファイルをあげました。
http://dixq.net/zip/Rockman.zip
これです。
使う画像ファイルと、音声ファイルを実行ファイルと一緒にいれてZipに固めればOKです。
後は実行ファイルをダブルクリックするだけです。

VCでコンパイルしている場合、コンパイルした後に、プロジェクトファイルがあるフォルダに
「Debug」か「Release」のフォルダが出来ていると思います。
おそらく前者かと思います。その中に実行ファイルがありますので、それを入れてください。


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

Name: レクサス [URL]  ..ぴよぴよ(64ポイント)   Date: 2007/10/03(水) 22:36   No:10785 解決!     
Title: Re:配布するときのしかた    
お早い返事ありがとうございます。

無事にできました。

いままで学校とかでDebugだけでよかったので
どうしたらと悩んでいました。

わかりやすい説明ですぐにできました。
ありがとうございます。




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

Name: YuO  ..中級者(12,774ポイント)   Date: 2007/10/03(水) 23:03   No:10787     
Title: Re:配布するときのしかた    
> 「Debug」か「Release」のフォルダが出来ていると思います。
> おそらく前者かと思います。その中に実行ファイルがありますので、それを入れてください。

DebugよりReleaseの方が良いと思いますよ。

最低でも,DLL版のCRTは再頒布不可なので,Releaseを配布すれば誤って再頒布不可ファイルを配布する可能性が減らせます。
# 2005のデフォルト構成では,CRTはDLL版が選択されています。

Debugでは動くがReleaseだと動かない,というのはたいていの場合は単なるバグなので,そもそも配布するのが間違いですし……。
# まぁ,コンパイラのバグの可能性に関して無きにしもあらず,ですが。


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



Name: 夏天 [URL]  ..初心者(6,172ポイント)   Date: 2007/10/02(火) 18:29   No:10761       
Title: ロックマン    
ロックマンのティウンティウンみたいな表現は
どのようにすれば出来るのでしょうか。

座標を減らしていったりすると
正方形やダイヤの形になってしまいます。


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


Name: 管理人 [URL]  ..伝説のハッカー(422,393ポイント)   Date: 2007/10/02(火) 18:50   No:10763     
Title: Re:ロックマン    
ティウンティウンというのは
http://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A5%A6%A5%F3%A5%C6%A5%A3%A5%A6%A5%F3
こういうことですか?

これを実現するのは簡単だと思います。私もこのような表現はよくやります。
まず、中心から外に広がる丸いエフェクトの画像を用意します。

ゲームオーバーになった瞬間のロックマンの座標を保存します。その時の時間も保存します。
そこから
PI * 1/4
PI * 2/4
PI * 3/4
PI * 4/4
PI * 5/4
PI * 6/4
PI * 7/4
PI * 8/4
の角度で広げていけば8方向に広がりますよね。
中心座標の決定方法はその場所から、時間をt、角度をangとすると
x = cos(ang);
で求まります。y座標は
y = sin(ang);
で求まります。
DrawRotaGraph関数を使って若干拡大率を大きくしたり小さくしたりさせながら広げていけばあのようなシーンが実現できる事でしょう。


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

Name: 夏天 [URL]  ..初心者(5,541ポイント)   Date: 2007/10/02(火) 21:14   No:10767     
Title: Re:ロックマン    
三角関数を使うんですか
難しいです。

やり方がわかりません・・・;;
指摘お願いしますorz

#include <math.h>
#include "DxLib.h"
#define PI 3.14159
int en;
double enX[8],enY[8];
void thiunset(void){
en = LoadGraph( "data/grap/en.png" ) ;
for(int Z=0;Z<8;Z++){
enX[Z] =300+ cos(PI * (Z+1)/4);
enY[Z] =300+ sin(PI * (Z+1)/4);
}

}
void thiun(void)
{

DrawGraph( enX[0] , enY[0] , en , TRUE ) ;
DrawGraph( enX[1] , enY[1] , en , TRUE ) ;
DrawGraph( enX[2] , enY[2] , en , TRUE ) ;
DrawGraph( enX[3] , enY[3] , en , TRUE ) ;
DrawGraph( enX[4] , enY[4] , en , TRUE ) ;
DrawGraph( enX[5] , enY[5] , en , TRUE ) ;
DrawGraph( enX[6] , enY[6] , en , TRUE ) ;
DrawGraph( enX[7] , enY[7] , en , TRUE ) ;

enY[0]-=2;

enX[1]--;
enY[1]--;

enX[2]-=2;

enX[3]--;
enY[3]++;

enY[4]+=2;

enX[5]++;
enY[5]++;

enX[6]+=2;

enX[7]++;
enY[7]--;


}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){


ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
SetGraphMode( 800 , 600 , 32 ) ;
SetDrawScreen( DX_SCREEN_BACK );
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数
thiunset();
for(int Z = 0 ; Z<50; Z++){
ClearDrawScreen();
thiun();
ScreenFlip();
}

//WaitKey() ;//何か入力があるまで待つ関数

DxLib_End() ;//終了処理をする関数
return 0 ;
}


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

Name: 管理人 [URL]  ..伝説のハッカー(422,451ポイント)   Date: 2007/10/02(火) 22:16   No:10769     
Title: Re:ロックマン    
三角関数というような大そうなものじゃないですよ。
先ほども書いたとおり、角度にcosかsinをかけただけです。
sin PI/2は1ですよね。PI/4は1/√2ですし。

ではちょっとサンプルを作ってみますね。


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

Name: バグ  ..熟練のプログラマー(59,057ポイント)   Date: 2007/10/02(火) 22:29   No:10770     
Title: Re:ロックマン    
最近仕事で三角関数を使う事になって、勉強しました。
下記のサイトが分かりやすかったですよ(^-^)

http://ab.sinryow.net/lesson/sankaku.html
http://homepage1.nifty.com/gfk/sin-cos.htm


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

Name: 管理人 [URL]  ..伝説のハッカー(422,524ポイント)   Date: 2007/10/02(火) 23:03   No:10771     
Title: Re:ロックマン    
サンプル作ってみました。
以下のzipファイル解凍して実行してみてください。
こんなエフェクトでよかったですか?

http://dixq.net/zip/Rockman.zip

変にスマートに書いたり、まとめたりすると余計理解しにくくなると思ったのでちょっと行は長くなっていますが、
そちらで理解されたら纏めてください。
これがいいかどうかわからないので、あくまで一例ということで。
プログラムはこの記事左上のアイコンをクリックすると確認出来ます。

このエフェクトのモデルは先ほどのリンク先
http://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A5%A6%A5%F3%A5%C6%A5%A3%A5%A6%A5%F3
です。
もっと似せたければエフェクトを良く見たら見えるあのワッカを付け足したらいいでしょう。
あと、実際にはαブレンドしてあると思いますので、200位の強さでαブレンドすればもっと似ると思います。

※注意
このサンプルはモニタのリフレッシュレート60hzで正常動作しますので、それよりヘルツが高いと速いモーションになってしまいます。
モニタが60ヘルツじゃない場合は、60ヘルツにするか、スピードであるspdに渡す数値を変更していい速さを見つけてください。
ちなみにティウン1回は0.247秒でしたから、プログラムでは15フレームを1周期としています。


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

Name: 夏天 [URL]  ..初心者(5,576ポイント)   Date: 2007/10/03(水) 18:33   No:10781 解決!     
Title: Re:ロックマン    
自分がほしかったティウンティウンそのままです!!
色々といじくってみようかと思います
大変お世話になりました


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

Name: 管理人 [URL]  ..伝説のハッカー(423,951ポイント)   Date: 2007/10/03(水) 22:13   No:10783     
Title: Re:ロックマン    
もしプログラムの意味がわからなければ、

0度
90度
180度
270度

の方向へはそれぞれ4ずつ座標をずらし、斜め方向へはx,yを 4/√2 ずつずらせばOKです。
±は任意に付けてください。


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



Name: ビスタ  ..かけだし(1,528ポイント)   Date: 2007/10/03(水) 00:23   No:10774       
Title: コンパイラの設定?    
すみません、タイトルが思い浮かばないです…。
私の以前の記事のアドレスから入ってセットアップはしたのですが…

C:\Program Files\Microsoft Visual Studio 8\Microsoft Visual C++ 2005 Express Edition - JPN

↑ここに入ってからどうしたらいいのかわかりませんでした…。
もしかして入ってる場所が違うのでしょうか…


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


Name: 管理人 [URL]  ..伝説のハッカー(422,583ポイント)   Date: 2007/10/03(水) 00:33   No:10775     
Title: Re:コンパイラの設定?    
インストールしたなら「スタート」から起動できるようになっているはずです。
起動してからプロジェクトの作り方は前回の記事にお書きしました。


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

Name: ビスタ  ..かけだし(1,567ポイント)   Date: 2007/10/03(水) 07:08   No:10776 解決!     
Title: Re:コンパイラの設定?    
> インストールしたなら「スタート」から起動できるようになっているはずです。
あ、ありました;;ちょっと確認しなさ過ぎですね…。ありがとうございました。


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



Name:  ..ぴよぴよ(573ポイント)   Date: 2007/10/01(月) 23:03   No:10737       
Title: return -1 ???    
初めまして、幻といいます!
最近Cを身に付けたくてプログミングを始めた初心者です

参考書を片手に必死こいて勉強してます^^
ただその中のサンプルプログラムで分からない事があったので質問させてください

コマンドライン引数という単元のサンプルに「return 0;」と「return -1;」というのがありました。
「return 0;」の方は、それまでのプログラムで何度も出てきたのですが 、「return -1;」はいきなり出てきて説明も載っていませんでした。
「0」と「-1」で処理がどのように変わってくるのでしょうか?

お願いします


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


Name: 管理人 [URL]  ..伝説のハッカー(419,623ポイント)   Date: 2007/10/02(火) 01:15   No:10741     
Title: Re:return -1 ???    
関数を一つ自分で作れるようになるとその意味が分かると思います。
きっとその疑問をお持ちだと言う事は関数を作ったことがまだ無いせいだと思います。
現在どの辺りまで勉強なさっているのかわかりませんが、

http://www5c.biglobe.ne.jp/~ecb/c/c00.html

この7章を読むとその意味がわかります。

答えだけ言うと、その関数を呼び出した部分にその数字が返されるわけです。
return 0;
とは基本的に正常終了を意味します。
returnという言葉から推測できるように、呼び出された部分に値を返すということです。
return 0では0を関数が終了した時に返します。
プログラムで「0が返ってきたら正常終了なので、何もエラーを起こさなくていい」と書いておけば、0が返ってきた時、何もエラーはおきません。
一方「-1が返ってきたら異常終了なので、エラーを起こすように」と書いておけば、-1が返ってきた時、エラーを起こすことが出来ます。

そのプログラムを見るときっとその部分はエラー処理になっているのではないかと思います。

一つサンプルを作ってみました。
そのままコピーして実行してみてください。
そして、
act関数内の、return -1の部分をreturn 0;に変更して再度実行してみてください。
結果が変わるはずです。


#include <stdio.h>

int act(){
return -1;
}

void main(){
int i;
i = act();

if(i==0)
printf("正常終了です。");
if(i==-1)
printf("異常終了です。");
}

 
きっと詳しい使い方は7章辺りをよく読んで見ないとわからないでしょうけど、自作関数部をまだ勉強していないならここまで深く考えなくてもいいと思います。


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

Name:  ..かけだし(1,035ポイント)   Date: 2007/10/02(火) 14:54   No:10755     
Title: Re:return -1 ???    
>管理人さん

用意していただいたソース実行しました。
−1では異常終了、0では正常終了と出力されました。
確かに参考書のサンプルを改めて見てみると、return -1の箇所はエラー処理となっていました。
これで疑問が解けました、ありがとうございますm(_ _)m

これから分からないところが出てくると思いますので、その際はまたお願いします^^



あと参考に聞いておきたいのですが、管理人さんはプログミング初心者の頃の勉強法はどのようにしていましたか?
僕は参考書の説明読む→載っているサンプルを打って実行結果を確かめる→自分で似たようなプログラムを作ってみる(物凄く簡単なヤツですけど…)といった感じにやっているんですが、このやり方で良いのか悪いのか分かりません…。
他の方々も宜しければ教えてください、お願いします。


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

Name: 管理人 [URL]  ..伝説のハッカー(421,749ポイント)   Date: 2007/10/02(火) 18:26   No:10760     
Title: Re:return -1 ???    
初心者の頃というか今も十分初心者ですが、それでもよろしければお書きしますm(_ _)m

私は最初、

参考書や入門サイトをダラダラ読む→読んで解った気になる→実際書いてみるとさっぱり。

この繰り返しでした。やはりプログラミングは社会のような暗記科目ではなく、数学のように演習で習得する科目だと思うので、実際に自分で書いてみることが何より大事だと思います。
私は上のような勉強法で続けていた時は、面白くも無く、知識もさっぱり付きませんでした。

しかしあるとき、DXライブラリに出会って、こんなにC言語の知識が無くてもゲームが作れるんだということを知り、
毎日何時間も、十数時間もプログラムを書きました。
私は前からずっとゲームが作りたかったので、楽しくて仕方ありませんでした。
それは「勉強」ではなく「趣味」だったので何時間やっても疲れませんでした。
ゲームを作っているうちに、
・構造体の使い方を知った方がよりスムーズにかける
・関数ポインタを使ったほうが便利だ
などがわかり、その都度その分野を勉強しました。

参考書片手にただ目標無く勉強するスタイルは私にあってなかったのですが、自分が好きなことを完成させるために知識を付けたいと思って勉強するスタイルは私にあってました。
好きなことっていうのは全然苦になりませんもんね。

ということで、私の勉強スタイルは、「ゲームを作りながら、必要になったらその都度必要な分野を勉強し、それを生かしてゲームプログラムを作る」というものでした。
ただこれでは、「自分の出来る範囲で作る」ゲームになりがちで、ヒープソートアルゴリズムやスタック、キューなどの知識が付かないので、それは別に勉強しました。

最初のうちは幻さんの勉強スタイルは最良の方法だと思います。
もう少し知識が付いてきたら何か自分の好きなものを作りながら勉強していくと今よりもっと意欲的になれるかもしれません。
私は大学3年の後期から勉強を始めて、現在院1年なので、まだまだ青二才もいいとこですが、私の体験談でしたm(_ _)m


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

Name: tkmakwins15 [URL]  ..プログラマー(28,908ポイント)   Date: 2007/10/02(火) 18:58   No:10764     
Title: Re:return -1 ???    
私も本を買ってきたのですが、コンパイラを設定する事ができずに苦労しました。そのため、その間はコンパイルできなかったのですが、結局本読んでも分からずじまいでした。

何かきっかけを持てばかなりかけるようになりますよ。


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

Name:  ..かけだし(1,268ポイント)   Date: 2007/10/02(火) 23:48   No:10773 解決!     
Title: Re:return -1 ???    
お二方ありがとうございますm(_ _)m

>管理人さん
僕もはっきり言うと一般的な参考書にあるような、出力がただの数字や文字列というのはあまり面白いとも思わないし、僕の性格上長続きしないと思います。
やっぱり何か自分の好きな事や興味のある事を勉強に取り入れると身に付きやすいのかなぁというのが今の思いです。
取り合えず、プログラミングの勉強はこれまで通りのやり方を続けていこうと思います。
それと、僕もゲームは作ってみたいと思っていたので、さっそくここのサイトでゲームプログラミング始めてみました^^
説明が分かりやすいのと、やりたいと思っていたことが出来てとても楽しいです!
これからもどんどん活用させてもらいますね!!


> tkmakwins15さん
同じく^^;
僕が買ったのは「猫でもわかるC言語プログラミング」という本で、完全な入門者用に設定されているのですが、何故かコンパイラの設定の説明が適当で、しかもページの後ろの方に載っていたので最初は気づきもしませんでした;;


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



Name: ビスタ  ..ぴよぴよ(754ポイント)   Date: 2007/10/01(月) 12:54   No:10723       
Title: 乱数のファイル出力、配列読み込み    
学校の課題で、
・乱数を生成しファイル出力するプログラム
・↑のファイルを配列に読み込み、値の平均を標準出力するプログラム

を求められたのですが…乱数生成プログラム以外はどうしたらいいのか
全く手もつけられない状態です…。

講師には30分もあればできるとまで言われてるのに本を読んでも何を
見ればいいのか分からないとか正直かなり落ち込んでるんですが…
どうかお願いします。



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


Name: ビスタ  ..ぴよぴよ(824ポイント)   Date: 2007/10/01(月) 13:02   No:10724     
Title: Re:書き忘れです    
基本的に学校でプログラムを実行してるんですが演習環境は

OS:Linux
コンパイラ:gcc 3.3.5

です。Linuxのバージョンは分かりませんでした。家のPCはwin vistaですが
こちらには演習環境作ってません。


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

Name: 管理人 [URL]  ..伝説のハッカー(417,606ポイント)   Date: 2007/10/01(月) 14:56   No:10725     
Title: Re:書き忘れです    
まず、家にコンパイルできる環境を作りましょう。
学校だけでやってたんじゃ、絶対詳しくなれないですから。

ビスタさんが、どこまでおわかりか、知りたいのですが、配列の使い方はおわかりですか?
例えば、以下のプログラムを1〜3に示すように完成させてください、といったら出来ますか?



#include <stdio.h>

int main(){
int a[3];
a[0]=2;
a[1]=6;
a[2]=4;
printf("平均は");
}


 
1、これをfor文を使って書き換えてください。
2、小数点以下が表示されるように変更してください。
3、さらにrand関数を使って、2,6,4の代入の部分にランダムな数値を入れてください。

もしここまで出来れば、半分終わりです。

ファイルに書き込むにはfopenとfprintf関数を使って見ましょう。
ここや
http://www9.plala.or.jp/sgwr-t/c/sec17.html
ここの12章
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
を見て勉強してください。
もしわからなければまた聞いてください。


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

Name: 管理人 [URL]  ..伝説のハッカー(418,138ポイント)   Date: 2007/10/01(月) 15:07   No:10726     
Title: Re:書き忘れです    
コンパイラはここからダウンロードできます。

http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
(修正済)

使い方がちょっとややこしいので説明します。
私が持っている種類と少し違うので、いかに示す方法と全く同じかどうかわからないですが、

まず
「ファイル」>「新規作成」>「プロジェクト」
でプロジェクト生成画面を出します。

左画面の「VisualC++」のカテゴリの中の「Win32」を選択。
右画面の「Wind32コンソールアプリケーション」を選択。
プロジェクト名に好きな名前をいれ、好きな場所に保存してください。
このままの場所でも結構です。

次に出てくるヴィザード画面で「次へ」を選択します。
「空のプロジェクト」を選択して完了を押します。

するとプロジェクトを作成出来ました。

ソリューションエクスプローラーが左か右に表示されていると思います。
なければメニューから表示させてください。
ソリューションエクスプローラーに先ほど決めたプロジェクト名が表示されている場所で右クリックし
「追加」>「新しい項目」
で、画面を出し、
左画面に「コード」が選択されている事を確認し、「.cpp」のファイルが右画面に選択されている事を確認します。
好きなファイル名を書いてファイルを作ると、何か書き込める画面が出てきます。
ここにソースコードを書いて、

Ctrl + F5 を押すと、コンパイルして実行してくれます。


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

Name: tkmakwins15 [URL]  ..プログラマー(27,542ポイント)   Date: 2007/10/01(月) 15:29   No:10727     
Title: Re:書き忘れです    
管理人さん、それVBのダウンロードになってますよ。VCはこっちのはずです。

http://www.microsoft.com/japan/msdn/vstudio/express/visualc/

ここからダウンロードしてください。


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

Name: ビスタ  ..かけだし(1,002ポイント)   Date: 2007/10/01(月) 15:30   No:10728     
Title: Re:できませんでした…    
> まず、家にコンパイルできる環境を作りましょう。
> 学校だけでやってたんじゃ、絶対詳しくなれないですから。

そうですよね…コンパイラは、何度かやってみたのですが保存時に行方不明にしてしまって
使えなかったのと設定方法がよくわからなかったことでPCに入れるのを敬遠してました…。
もう一度やってみます。



#include <stdio.h>

int main(){

int a=2;
int b=6;
int c=4;

for(.....)

printf("平均は");
}



ええと…ここまででした…。何か根本的に間違ってるような気がします。
これでは初期値も条件式も出てこないのでforでループさせられませんよね…。
しかも本も見ててこんな状態です…。forの使い方は載ってますが…

乱数のほうもアルゴリズム的には全く理解できてないのでコピペ状態です。


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

Name: 管理人 [URL]  ..伝説のハッカー(418,552ポイント)   Date: 2007/10/01(月) 15:40   No:10729     
Title: Re:できませんでした…    
>tkさん
あらら、寝起きだったんで寝ぼけてました^^;(遅っ
ありがとうございます。

>ビスタさん
なるほど、まずファイルオープンウンヌンより、まず、コンパイラを導入すること、そして完全に入門分野を見直すことからはじめたほうがよさそうです。
でも、大丈夫です、みんなそこから始まりました。
私もコンパイラの導入でよくわからなくなって止めてしまった事のある人間の一人です。

でも、くじけてしまったらそこまでです。頑張っていきましょう。出来れば楽しいものですから。

では、先ほど2つ目に紹介したリンク先、
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
ここはかなりつかえます。参考書などかわなくても、ウェブで十分勉強出来る世の中ですし、その辺で勉強してください。

勉強する時のコツは、ただダラダラ解説を見て進まないこと。
書いてあるサンプルプログラムを実際に自分でコンパイルして実行してみること、少し数値を変えたりしてどのように結果が変化するのか、自分が期待する結果になったかどうか確認しながら進めることです。
そして「完全に理解できなかった」「少しでも疑問がわいた」時はそれを調べるなり、質問するなりして、疑問を残さないことです。

とにかく演習が大事です。
プログラミングは社会のような暗記科目じゃなく、数学のように演習で身につける科目です。
リンク先を1章から順番に4章の最後までしっかり読んで身に付けてください。
for文や配列の使い方がわかってくるはずです。


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

Name: tkmakwins15 [URL]  ..プログラマー(28,231ポイント)   Date: 2007/10/01(月) 16:28   No:10730     
Title: Re:できませんでした…    
>乱数のほうもアルゴリズム的には全く理解できてないのでコピペ状態です。

乱数アルゴリズムに付いては、説明しましょう。たぶん課題の内容から考えて、アルゴリズムは何でもいいはずです。なので、線形合同法に付いて説明します。

線形合同法とは、簡単に言えば、割り算のあまりを乱数とするアルゴリズムです。そして、漸化式以下によって与えられます。

Xn=(Xn-1×A+B)%M+1
(A,B,Mは定数、A<M B<M A>0 B>0)


となります。それで、A,B,Mの決め方がポイントになります。Mは簡単です。得たい乱数の範囲の最大値をMとすればいいのです。

Aの決め方ですが、Mが4の倍数でなければ、条件は一つになります。Mが持つ全ての素因数をA-1が持つ事が条件となります。例えば、M=50であれば、50の素因数は2と5ですから、A-1は、2×5=10の倍数であればいいのです。
簡単に言うと、Mが割り切れる全ての素数を掛け算したものの倍数に、+1した数をAとすればいいのです。
ところが、Mの値が4の倍数の場合、A-1も4の倍数倍数であるという条件もクリアする必要があります。

Bの決め方は、B,Mが共に割り切れる数が1しかないようにすればいいのです。

後は、これをC言語のプログラムにしてください。とりあえず、エクセルで出力した結果を添付します。ご参考までに。


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

Name: ビスタ  ..かけだし(1,410ポイント)   Date: 2007/10/01(月) 17:16   No:10731 解決!     
Title: Re:切羽詰る    
>管理人さん
参考URLその他でとにかくがんばってみます。課題が提出できないと進級できないのが
つらいですが…。来週までに間に合うことを願うしかないですね…。
またつまづいたら来ます。とりあえず解決済みにしておきます。

>tkmakwins15さん
アルゴリズムの説明までしてくださってありがとうございます。
数学的なことですっきりと分かった、とこまでいかないのが悔しいですが
追々理解していきたいです。


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

Name: 管理人 [URL]  ..伝説のハッカー(418,981ポイント)   Date: 2007/10/01(月) 22:59   No:10735     
Title: Re:切羽詰る    
おそらくプログラムは課題だけすませようとするような勉強方法では全く身に付きません。
きっとビスタさんはこの分野に興味があったから入学されたのだと思いますし、今の機会に是非勉強してください。
先ほどのリンク先の1章分は熟読したとしても1時間もかからないでしょう。
4時間あったら出来ることですし、それ全てについて詳しく調べていったとしても3日もあれば出来るはずです。
焦って飛ばしたり、サンプルを実行しなかったりすると結局時間を無駄にしただけになってしまうので、
じっくりやれば必ず出来ますから、じっくり頑張ってください。

この課題を完成させるための橋渡しとして、課題を作ってみますので、勉強しながらといていってみてください。
こういう場合は、順をおって完成させるのが一番です。



課題A 以下のプログラムを作ってください。

1、配列要素10個の配列を一つ作り、その中に何でもいいので、値を代入し、配列要素3番目の値を表示するプログラムを作ってください。
2、先ほど入れた値を全て足し、平均を表示するプログラムを作ってください。
3、配列に代入する値をrand()による乱数に変更し、乱数の平均を表示するプログラムを作ってください。
4、先ほどのプログラムの代入部分をfor文によって書き換えてください。

ここまで出来れば前半終了です。

課題B

1、fopenでファイルオープンし、閉じるだけのプログラムを作ってください。(開けなかった時のエラー処理も書きましょう)
2、ファイルオープンした時、fprintf関数を使って、数字の「5」を書き込み、閉じるプログラムを作ってください。
3、ファイルオープンした時、乱数を10個書き込み、閉じるプログラムを作ってください。

ここまで出来れば最初の課題が終わりです。
2つ目の課題はここまで出来ればすぐ出来ます。
頑張ってください。


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

Name: 管理人 [URL]  ..伝説のハッカー(419,132ポイント)   Date: 2007/10/01(月) 23:03   No:10736     
Title: Re:切羽詰る    

課題Aの1番の答えのサンプルです。参考にしてください。

#include <stdio.h>

void main(){

int a[10];

a[0]=2;
a[1]=6;
a[2]=4;
a[3]=2;
a[4]=6;
a[5]=4;
a[6]=2;
a[7]=6;
a[8]=4;
a[9]=4;

printf("3番目は %d \n",a[2]);
}

 


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

Name: 管理人 [URL]  ..伝説のハッカー(419,659ポイント)   Date: 2007/10/02(火) 01:30   No:10744     
Title: Re:切羽詰る    
課題Aの2の回答のサンプルです。範囲指定で見れますので、
もし答えが出たら答えあわせをしてください。



#include <stdio.h>

void main(){

int a[10],t;
t = 0;
a[0]=2;
t = t + a[0];
a[1]=6;
t = t + a[1];
a[2]=4;
t = t + a[2];
a[3]=2;
t = t + a[3];
a[4]=6;
t = t + a[4];
a[5]=4;
t = t + a[5];
a[6]=2;
t = t + a[6];
a[7]=6;
t = t + a[7];
a[8]=4;
t = t + a[8];
a[9]=4;
t = t + a[9];
t = t/10;

printf("平均は %d \n",t);
}


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

Name: 管理人 [URL]  ..伝説のハッカー(419,894ポイント)   Date: 2007/10/02(火) 01:32   No:10745     
Title: Re:切羽詰る    
課題Aの3


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

void main(){

int a[10],t;

t = 0;
a[0]=rand();
t = t + a[0];
a[1]=rand();
t = t + a[1];
a[2]=rand();
t = t + a[2];
a[3]=rand();
t = t + a[3];
a[4]=rand();
t = t + a[4];
a[5]=rand();
t = t + a[5];
a[6]=rand();
t = t + a[6];
a[7]=rand();
t = t + a[7];
a[8]=rand();
t = t + a[8];
a[9]=rand();
t = t + a[9];
t = t/10;

printf("平均は %d \n",t);
}


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

Name: 管理人 [URL]  ..伝説のハッカー(420,065ポイント)   Date: 2007/10/02(火) 01:33   No:10746     
Title: Re:切羽詰る    
課題Aの4


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

void main(){

int a[10],t,i;

t = 0;

for(i=0;i<10;i++){
a[i]=rand();
t = t + a[i];
}

t = t/10;

printf("平均は %d \n",t);
}



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

Name: 管理人 [URL]  ..伝説のハッカー(420,437ポイント)   Date: 2007/10/02(火) 01:37   No:10747     
Title: Re:切羽詰る    
課題B_1


#include <stdio.h>

void main(){
FILE *fp;

fp = fopen("test.txt", "w");//書き込みw形式でファイルオープン

if ( fp == NULL ){//開けなかったらNULLが入るのでエラー
printf("ファイルオープンエラー\n");
return;
}

fclose(fp);
}



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

Name: 管理人 [URL]  ..伝説のハッカー(420,548ポイント)   Date: 2007/10/02(火) 01:40   No:10748     
Title: Re:切羽詰る    
課題B_2

#include <stdio.h>

void main(){
FILE *fp;

fp = fopen("test.txt", "w");//書き込みw形式でファイルオープン

if ( fp == NULL ){//開けなかったらNULLが入るのでエラー
printf("ファイルオープンエラー\n");
return;
}

fprintf( fp , "%d" , 5);//5をファイルfpに書き込む

fclose(fp);
}


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

Name: 管理人 [URL]  ..伝説のハッカー(420,577ポイント)   Date: 2007/10/02(火) 01:40   No:10749     
Title: Re:切羽詰る    
課題B_3


・・・は出来たらそれが学校の課題の完成プログラムですっ。


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +