• 締切済み

テキストファイルからデータを読み込みモータを動かす

理系の研究室にいます.現在VisualC++6.0でモータを動かすことにより台をある速度で動かす機械を使っています. テキストファイルに 1 1.2 1.3 と書いてあり,それを読み込んでボタンをクリックしたら モータを動かし,1秒ごとにテキストファイルに書いてる速度に 変化させていくというものです.(1秒 1mm/s 2秒 1.2mm/s) 初心者で,前研究者が作ったものを参考にしたり, 本を見て作りました. 以下がC++言語です. void CSyncStartDlg::OnDielessstart() { INT nRet; int main(void) { fstream finout; //入出力用ストリームの宣言 char ss[1000]; finout.open("data.txt", ios::in); //ファイルオープン if(finout.fail()){ cout << "入力ファイルをオープンできません\n"; exit (1); } while(!finout.eof() && !finout.fail()) //データの入力 { finout.getline( ss,1000 ); nRet=MtrChangeSpeed(hDeviceHandle1,MTR_ACCDEC_CHANGE,(ss*360*9)/(0.04394531*5)); //関数の実行結果 if(nRet != MTR_ERROR_SUCCESS) AfxMessageBox("速度変更に失敗しました"); Sleep(1000); } finout.close(); DeviceHandle1はモータの1軸ということです. エラーは:mainのローカル関数の定義がおかしい fatal errorと出ます. 初心者で何がおかしいかわかりません. もしよければ添削していただけると幸いです. よろしくお願いします.

みんなの回答

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

記載されているソースだけでは問題が他にも出てきそうな気がしますが・・・ とりあえず、以下の3行を削除してみてはどうでしょう? >INT nRet; >int main(void) >{

関連するQ&A

  • 2つのテキストファイルのマージについて

    現在C言語を学習中の超初心者の者です。C言語のファイル処理や関数、マージ、ポインタの処理に悪戦苦闘している日々を送っています(泣) 皆様に、是非、アドバイスを頂けたらと思い、投稿させて頂きました。 2つのテキストファイルを読み込み、それぞれ、ファイルの中身の文字列をソートし、昇順に並び替え、さらに、その2つのファイルをマージし、昇順に並び替え表示させる(関数を用いて)課題をクリアできずにいます。 int main(void) { char strAry1[20][20]; char strAry2[20][20]; //ファイル1"menber1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル1情報ソート sortString( ); //ファイル1ソート後出力 putOut( ); //ファイル2"kantoku1.txt"情報を取得 getData( ); //ファイル1ソート前出力 putOut( ); //ファイル2情報ソート sortString( ); //ファイル2ソート後出力 putOut( ); return 0; } main()関数はこのようなイメージで考えているのですが、どうのように処理すればよいのでしうか?(泣)質問がアバウトで申し訳ありません。ちなみに、2つのテキストファイルの中身は (1) "menber1.txt"-------- takahara inamoto endou nakazawa komano abe nakamura (2) "kantoku1.txt"------ torushie ofuto jico oshimu kamo okada farukan です。一応、途中まで考えて、いきずまってしまったソースです。→ int getData(char *filename, int count, char ss[][20]); void putOut( char ss[][20], int count); void sortString( char ss[][20], int count); int main(void) { char strAry1[20][20]; char strAry2[20][20]; int count = 7; //ファイル1情報を取得 getData("menber1.txt", count, strAry1); //ファイル1ソート前出力 putOut( strAry1, count); //ファイル1情報ソート sortString(strAry1, count ); //ファイル1ソート後出力 putOut( strAry1, count); //ファイル2情報を取得 getData("kantoku1.txt", count, strAry2); //ファイル1ソート前出力 putOut( strAry2, count); //ファイル2情報ソート sortString(strAry2, count ); //ファイル2ソート後出力 putOut( strAry2, count); return 0; } //ファイル情報を取得  int getData(char *filename, int count, char ss[][20]) {      FILE *fp1; if((fp1 = fopen(filename, "r")) == NULL){ //ファイルオープン printf("ファイルオープンできません\n"); exit(1); } count = 0; while(fp1 != NULL){ fgets(ss[count], 20, fp1); //1行単位で文字列取得 if(feof(fp1)) break; count++; } fclose(fp1); return 0; } //ファイルを出力する void putOut( char ss[][20], int count) { int i; for(i=0; i<count; i++){ printf("%s",ss[i]); } printf("\n"); } //ファイルをソートする void sortString( char ss[][20], int count) { int i,j; char temp[20]; for(i=0; i<count-1; i++){ for(j=i+1; j<count; j++){ if(strcmp(ss[i], ss[j]) > 0){ strcpy(temp, ss[i]); strcpy(ss[i], ss[j]); strcpy(ss[j], temp); } } } printf("ソート後\n"); } 少しでも情報がほしいです(泣)皆様忙しいと思いますが、助言をお願い致します。

  • 30~60秒に1回モーターを回したい

    古いH8のマイコンが載った、(Beauto Chaserと呼ばれる)車型のロボットで30秒~60秒に1回ランダムにモーターを前後に回したいです。しかし、思うように動きません。 自分でC言語のコードを書いてHEWとFDTで読み込ませていますが、なぜかいつも32秒±1秒くらいまで待って動き始めます。しかも、プログラム上は前後の動きは30秒~60秒に1回しか無いはずなのに、8回とか10回とか繰り返してから、次の32秒±1秒のルーチンに入るようです。何がおかしいのでしょうか? これが私のコードです: #include<36064s.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <math.h> #include "vs-wrc003.h" void main(void) { const BYTE MainCycle = 60; Init((BYTE)MainCycle); //CPUの初期設定 Mtr_Run(0,0,0,0); //モータを停止 LED(2); //オレンジのLED点灯 //ループ while(1) { //メインループ if(getSW()) { //スイッチが押されたら int r = 30000; while(1) { Mtr_Run(-64,64,0,0); //前に進む Wait(500); Mtr_Run(64,-64,0,0); //後ろに下がる Wait(500); Mtr_Run(0,0,0,0); //モータを停止 srand(r); r = rand() % 30000; //0~29,999の乱数を生成する…はず Wait(30000 + r); //30~60秒待つ…はず } } } } …これを10~20秒に設定すると正確に動きます。 8回くらいテストしましたが、12~20秒の間でランダムに動きました。しかも、前後の動きは必ず1回だけです。 なぜ30~60秒にするとダメなのでしょうか? H8/36064のデータシートは見つけました: http://robot.tamagawa.ac.jp:8080/cyber/H8cpp/rescue/rjj09b0049_h836064.pdf ただ、タイマーが複数あって、どこを見たらいいのか分かりません。404ページもあって上限○秒みたいなのは書いてないんですよね…見つけられてないだけかもしれませんが。 あれこれ試行錯誤する前に質問しようと思い、今、質問しています。 よろしくお願いします。 ※<time.h>が使えないマイコンでの疑似乱数の生成方法については、次回質問します。今回は一応、動いているので気にしません。

  • 配列について

    初歩的な質問ですいませんが、質問よろしくお願いします。 ◎1----------------------------- #include<stdio.h> int main(void) { char ss[10]="AB"; printf("ss=%s\n",ss); return 0; } ------------------------------------ ◎2-------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss[0]='A'; ss[1]='B'; ss[2]=0; printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎3------------------------------- #include<stdio.h> #include<string.h> int main(void) { char ss[10]; strcpy(ss,"AB"); printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎4------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss="AB"; printf("ss=%s\n",ss); return 0; } ---------------------------------- 以上4つのプログラムで、◎2と◎3は正常に動くと理解できたのですが、何故、◎1は正常に動き、◎4は「'const char [3]' から 'char [10]' に変換できません。」といったようなエラーが出てしまうか分かりません。 教えていただければ嬉しいです。

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • テキストファイルが開けません。

    main関数に2つの引数をとり、第1引数で指定したファイルの内容を第2引数で指定したファイルにコピーするプログラムを以下のように作りました。 #include<stdio.h> #include<fcntl.h> int main(int argc, char* argv[]){ int fd1, fd2, rs, ws; char buffer[10000]; if(argc!=3){ write(2, "使用法:実行ファイル コピー元ファイル コピー先ファイル\n", 54); exit(1); } fd1=open(argv[1], O_RDONLY); if(fd1<0){ fprintf(stderr, "can't open file '%s'.\n", argv[1]); exit(1); } fd2=open(argv[2], O_WRONLY|O_CREAT|O_TRUNC); if(fd2<0){ fprintf(stderr, "can't open file '%s'.\n", argv[2]); exit(1); } while((rs=read(fd1, buffer, 10000))>0){ if((ws=write(fd2, buffer, rs))!=rs){ write(2, "an error occurred while copying.\n"); exit(1); } } close(fd1); close(fd2); } コンパイル、実行ともに正常終了したのですが、 コピー先のテキストファイルを開こうとすると、 「アクセスは拒否されました。」というダイアログが表示されて 開くことができません。 なぜなのでしょうか。 よろしくお願いします。 ちなみにOSはWindows Vistaで、 プログラムはcygwin上で実行しました。

  • 2つのcppファイルから

    1つのexeファイルを作る必要性が出てきました。 (現在質問中の質問に関連しています。) 例えば file.cpp: #include<iostream> using namespace std; void Output(int x) { cout<<x<<endl; } void main(void) { for(int i=0;i<9;Output(i++)); } をコンパイルリンクすれば済むことを file1.cpp: #include<iostream> using namespace std; void Output(int x) { cout<<x<<endl; } file2.cpp: void main(void) { for(int i=0;i<9;Output(i++)); } という風に分かれているファイルをコンパイルリンクしなければならないのです。 cpp -e file.exe -c file1.cpp -c file2.cpp ではエラーになります。 どうすれば良いのでしょうか?

  • テキストファイルについて

    以前は、マップを作るときに下のようにしていたのですが char dungeon[5][5]={{0,0,0,1,1}, {1,1,0,1,1}, {1,0,0,0,1}, {1,1,0,1,1}, {1,1,0,0,0}}; for(i=0;i<5;i++){ for(j=0;j<5;j++){ else if(dungeon[i][j]==0)printf("+"); else printf("#"); } printf("\n"); } 最近、ファイルの入出力で読み込む事にチャレンジしています。 それで、メモ帳で書いたマップを使おうとしているのですが、 こんなのです。 1011111111111 1000000000001 1111111111101 1111100000001 1111100000001 1111100000001 1111100002001 1000000000001 1011111111111 fp = fopen("map.txt","r");の部分でテキストファイルを指定しますが、複数作った上のようなマップを切り替える時、どうすればいいんでしょうか? 質問が稚拙かもしれませんがよろしくお願いします。 #include <stdio.h> void map(void);//マップの表示関数の宣言 int main(){ map(); } void map(void));//マップの表示関数の定義 { FILE *fp; char str[1024];//これくらいでいいかな? //map.txtを読み込みモードで開く fp = fopen("map.txt","r"); //ファイルオープンに失敗したら if(fp==NULL){ //失敗を表示し終了 printf("ファイルのオープン失敗\n"); return -1; //exit;でもいいのかな? } //fgetsの戻り値がnullになるまで //strにファイルから内容を格納 while((fgets(str,256,fp))!=NULL){ //格納された文字を出力 printf("%s",str); } //ファイルを閉じる fclose(fp); }

  • int型とchar型について

    C言語初心者です。 よろしくお願いします。 ◎1----------------------- #include<stdio.h> int main(void) { int ss[4]="789"; printf("%c\n",ss[0]); return 0; } --------------------------- ◎2----------------------- #include<stdio.h> int main(void) { int *p; p="789"; printf("%c\n",*p); return 0; } --------------------------- ◎1、◎2の2つのプログラムについて疑問があります。 ◎1の「int ss[4]="789";」と◎2の「int *p;」のintの部分は今まで、何の疑問も抱かず、「char」として入力していました。 そこでchar型は1バイトの整数、int型は4バイトの整数ということで容量が違うだけで、intとしても大丈夫だろうと思ったのですが、 ◎1では、「'initializing' : 'char [4]' から 'int [4]' に変換することはできません。」とエラーが出て、◎2では「'char [4]' から 'int *' に変換することはできません。」とエラーが出ます。 intは文字列は扱えないということなのでしょうか? 以上intだと実行できない理由がわかりません。 初歩的なことですいませんが、教えていただけると嬉しいです。

  • テキストファイルの読み込みについて教えて

    また教えてください test13.txtの中身を1,2,3,4,5,6として、以下をコンパイルスルと、 printf("%d\n",a[0]);のときは 1 と結果がでますが printf("%d\n",a[3]);とすると -858993460などと、わからない数字がでます、どこがおかしのか初心者なのでさっぱりわかりません。 #include <stdio.h> int main(void) { int i; int a[6]; FILE *file; file = fopen("d:\\test\\test13.txt","r"); for(i=0;i<6;i++) fscanf(file,"%d",&a[i]); fclose(file); printf("%d\n",a[3]); return 0; }

  • VC++:ウィンドウキャプションの変更

    環境:VC++6/MFC ファイルを開こうとしたときにファイル形式を確認して、対応していないときは中断する。 というコーディングをしたいです。 どうしたらいいんでしょう? ファイルオープン部のコード void CProjectDoc::Serialize(CArchive& ar) {  if (ar.IsStoring())  {   // TODO: この位置に保存用のコードを追加してください。  }  else  {   // TODO: この位置に読み込み用のコードを追加してください。   m_FileName = ar.GetFile()->GetFilePath();   int nRet;   char szErrMsg[128];   nRet = LoadFile(m_FileName);   if(nRet == 1) {    // ファイルオープンエラー    wsprintf(szErrMsg,"ファイル %s が開けません",m_FileName);    MessageBox(NULL,szErrMsg,"LogViewer",MB_OK | MB_ICONERROR);    // ここで何かする?    return;   }   UpdateAllViews(NULL);  } }