• ベストアンサー

ひとつのプログラムにしたいのですが

(1)以前GPSで取得した測位データをRS232C通信でPCに表示するプログラムを作成するに当たって、多くの方に助言を頂けたことでなんとかNMEAデータを表示できるようになりました。 (2)そこで次の段階として、取得したNMEAデータに含まれる”緯度””経度””時刻”の要素のみ取り出して表示する方法として、strtok関数を用いたプログラムを教わり、用意した文章から必要な要素のみを出力する方法も確認できました。 (1)と(2)のプログラムをあわせて、受信したデータから緯度経度時刻のみを表示するプログラムを作成したいのですが、 assignment makes pointer from integer without とコンパイル時に表示されてしまいます。ポインタの受け渡しに問題があるということでしょうか?どのように組み合わせれば受信データから必要なデータを表示できるようになるでしょうか。方法があればご教授お願いします。 以下が(1)と(2)のプログラムです。 (1)受信したデータをRS232C通信でPCに指定した行数表示するプログラム #include<unistd.h> #include<fcntl.h> #include<strings.h> #include<termios.h> #include<stdio.h> #define BAUDRATE B4800 #define MODEMDEVICE "/dev/ttyS0" int main() { int fd, c, res; int i=0; int j=0; struct termios oldtio, newtio; unsigned char buf[512]; if((fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ))==-1){ perror(MODEMDEVICE); exit(-1); } tcgetattr(fd, &oldtio); /*シリアルポートの設定を待避*/ bzero(&newtio, sizeof(newtio)); /*新しいポートの設定の構造体をクリア*/ newtio.c_cflag = (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD);/*ボー:4800*/ newtio.c_iflag = (IGNPAR | ICRNL); newtio.c_oflag = 0; newtio.c_lflag = ICANON; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); while (i==0) { res = read(fd,buf,512); buf[--res]=0; j++; printf("%s\n",buf); //j++; if(j==48)i++; /*NMEAセンテンス1セットは24行(12種と1行ずつのスペース)なのでここでは48行で2セット分のループ*/ } tcsetattr(fd, TCSANOW, &oldtio); close(fd); return(0); } (1)実行結果 $GPRMC,081312,A,3428.9433,N,13549.4905,E,0.0,0.0,060808,6.7,W,A*06 $GPRMB,A,,,,,,,,,,,,A,A* $GPGSA,A,3,03,06,07,,16,,21,,25,27,,,2.3,2.0,1.0*34 ・・と48行このようなNMEAセンテンスを表示します。 (2)NMEAセンテンスから時刻、緯度、経度のみを出力 #include <stdio.h> #include <string.h> #include <math.h> char buf[512]="$GPRMC,143514,A,3428.9468,N,13549.4507,E,0.0,196.2,180708,6.7,W,A*05"; /*緯度経度時刻がすべて含まれているGPRMCからデータを取得したいのでGPRMCのモデルを1行用意*/ void pnmea(void) { int utc; double lat; /*緯*/ double lon; /*経*/ char ew; /*東西*/ char ns; /*南北*/ char stat; char *p; /*一行のNMEAセンテンスから時刻緯度経度のみを取り出すために、strtokで”,”ごとのトークンを得る*/ if ((p=strtok(buf,","))==NULL) return; if (strcmp(p,"$GPRMC")!=0) return; /*センテンスの先頭は$GPRMCか?*/ if ((p=strtok(NULL,","))==NULL) return; sscanf(p,"%d",&utc); if ((p=strtok(NULL,","))==NULL) return; stat=p[0]; if ((p=strtok(NULL,","))==NULL) return; /緯度*/ sscanf(p,"%lf",&lat); if ((p=strtok(NULL,","))==NULL) return; ns=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*経度*/ sscanf(p,"%lf",&lon); if ((p=strtok(NULL,","))==NULL) return; ew=p[0]; if (stat!='A') return; printf("%02d時%02d分%02d秒(UTC) ",utc/10000, (utc%10000)/100, utc%100); if (ns=='N') printf("北緯"); else if (ns=='S') printf("南緯"); printf("%.0lf度%.4lf分",floor(lat/100.0), fmod(lat,100.0)); if (ew=='E') printf("東経"); else if (ns=='W') printf("西経"); printf("%.0lf度%.4lf分",floor(lon/100.0), fmod(lon,100.0)); printf("\n"); } int main(void) { pnmea(); return 0; } (2)実行結果 14時35分14秒(UTC) 北緯34度28.9468分東経135度49.4507分 (1)で得たデータを(2)でGPRMCか判別し、必要な部分を取り出し表示 したいと考えています。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

こんな感じでどうでしょう? #includeいろいろ #include <strings.h> → #include <string.h> #define いろいろ char buf[512]; /* グローバル変数 */ void pnmea(void) { 関数の内容(bufの定義は消す) } int main(void) { 関数の内容(bufの定義は消す。pnmeaを呼び出す) }

abcmottu
質問者

お礼

>JaritenCatさん 非常に参考になりました。 大変遅くなってしまい申し訳ありません、本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.4

自分の勉強のためにNMEAパーサを書いてみるならそれはそれとして、私なら世の中にオープンソースで出ているNMEAパーサのソースコード見ちゃいます。例えば http://sourceforge.net/projects/nmeap/ とか。

abcmottu
質問者

補足

>Interestさん回答ありがとうございます。 そのような方法でも学習できるのですね。勉強になりました。ありがとうございます。 そのページはひらくとエラーが発生してしまうので、他のサイトも探して勉強してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

#include<string.h> がインクルードされていないためstrtok( )関数の引数がint型と仮定されてしまっているようです #include<strings.h> がタイプミスではないでしょうか

abcmottu
質問者

補足

>php504さんありがとうございます。 本当ですね。すぐに変更して確認してみます。include文の誤りはエラーとして捕らえられないものなのでしょうか? また、(1)と(2)を組み合わせたプログラムのとき、(2)の部分で扱われる”buf”は res = read(fd,buf,512); buf[--res]=0; j++; printf("%s\n",buf); とあったprintf文に(2)のプログラムをほぼそのまま追加して表示方法を変更させたかったので、 res = read(fd,buf,512); buf[--res]=0; /* 文字列終端をセット */ j++; /*一行のNMEAセンテンスから時刻緯度経度のみを取り出すために、strtokで”,”ごとのトークンを得る*/ if ((p=strtok(buf,","))==NULL) return; ・・・・ のような形に変えたのですがこのような書き方で問題ないのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

Cは「関数を呼び出す際は、実体を宣言するか、実体を宣言しないならプロトタイプを宣言してから呼び出す」事になっています。 ライブラリ関数の実体やプロトタイプは、通常「#include文」で指定した、ライブラリヘッダファイルの中で行われています。 で、Cは「実体もプロトタイプも宣言されてない関数が呼び出された場合、関数へのすべての引数は、取りあえず、仮にすべてint型だと思っておく」と言う事をします。 その後で、関数の実体が現れたり、プロトタイプ宣言に出くわすと、引数の引き渡しを、その宣言部に書かれている引数の型に合わせ、暗黙のキャストを行います。 この時「仮にすべてint型だと思っていたら、実はポインタだった」と言う事が起き、それが原因で「引数にポインタを要求している関数で(実はポインタだったけど、仮にint型だと思われてしまい、結局はint型になっちゃった)int型の引数が渡されているので、キャストも何もしないでint型をポインタだと思いこんで渡したぞ」と言う警告が出ます。 たぶん「main関数は下に書く」と覚えたでしょうが、これは「呼ばれる関数を上に、呼び出している部分を下に書く事になり、関数の実体が宣言されたあとで、関数が呼び出されるので、いちいちプロトタイプ宣言しなくても済むから」です。 そういう訳で、 assignment makes pointer from integer without の警告が出るのは ・「#include文」でヘッダファイルを読み込むのを忘れた ・プロトタイプ宣言するのを忘れている ・関数を宣言している部分よりも上(前)で、宣言前の関数を呼び出している ・関数に渡す引数の個数、タイプを間違っている などです。

abcmottu
質問者

補足

>chie65536さん回答いただきありがとうございます。 assignment makes pointer from integer withoutを出してしまう要因についてとても参考になりました。 >(1)「#include文」でヘッダファイルを読み込むのを忘れた >(2)プロトタイプ宣言するのを忘れている >(3)関数を宣言している部分よりも上(前)で、宣言前の関数を呼び出している >(4)関数に渡す引数の個数、タイプを間違っている 以下が組み合わせてつくってみたプログラムになります。 chie65536さんに頂いた例で確認すると(3)(4)に問題があるのでしょうか? #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<strings.h> #include<termios.h> #include<stdio.h> #include<math.h> #define BAUDRATE B4800 #define MODEMDEVICE "/dev/ttyS0" int main() { int fd, c, res; int i=0; int j=0; int utc; char stat; char ns; char ew; char *p; double lat; double lon; struct termios oldtio, newtio; char buf[512]; if((fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ))==-1){ perror(MODEMDEVICE); exit(-1); } tcgetattr(fd, &oldtio); /*シリアルポートの設定を待避*/ bzero(&newtio, sizeof(newtio)); /*新しいポートの設定の構造体をクリア*/ newtio.c_cflag = (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD);/*ボー:4800*/ newtio.c_iflag = (IGNPAR | ICRNL); newtio.c_oflag = 0; newtio.c_lflag = ICANON; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); while (i==0) { res = read(fd,buf,512); buf[--res]=0; /* 文字列終端をセット */ j++; /*一行のNMEAセンテンスから時刻緯度経度のみを取り出すために、strtokで”,”ごとのトークンを得る*/ if ((p=strtok(buf,","))==NULL) return; if (strcmp(p,"$GPRMC")!=0) return; /*センテンスの先頭は$GPRMCか?*/ if ((p=strtok(NULL,","))==NULL) return; /*utc:世界標準時*/ sscanf(p,"%d",&utc); if ((p=strtok(NULL,","))==NULL) return; /*stat:ステータス*/ stat=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*lat:緯度*/ sscanf(p,"%lf",&lat); if ((p=strtok(NULL,","))==NULL) return; /*ns:南北*/ ns=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*lon:経度*/ sscanf(p,"%lf",&lon); if ((p=strtok(NULL,","))==NULL) return; /*ew:東西*/ ew=p[0]; /*時刻緯度経度に対応するトークン表示*/ if (stat!='A') return; /*ステータスチェック*/ printf("%02d時%02d分%02d秒(UTC) ",utc/10000, (utc%10000)/100, utc%100); if (ns=='N') printf("北緯"); else if (ns=='S') printf("南緯"); printf("%.0lf度%.4lf分",floor(lat/100.0), fmod(lat,100.0)); if (ew=='E') printf("東経"); else if (ns=='W') printf("西経"); printf("%.0lf度%.4lf分",floor(lon/100.0), fmod(lon,100.0)); printf("\n"); printf("%d周目\n",j); if(j==48)i++; /*NMEAセンテンス1セットは24行(12種と1行ずつのスペース)なのでここでは48行で2セット分のループ*/ } tcsetattr(fd, TCSANOW, &oldtio); /* 退避させた設定に戻す */ close(fd); /* COM1のシリアルポートを閉じる */ return(0); } 出力結果 rsgps.c: In function ‘main’: rsgps.c:47: 警告: assignment makes pointer from integer without a cast rsgps.c:49: 警告: assignment makes pointer from integer without a cast rsgps.c:51: 警告: assignment makes pointer from integer without a cast rsgps.c:53: 警告: assignment makes pointer from integer without a cast rsgps.c:55: 警告: assignment makes pointer from integer without a cast rsgps.c:57: 警告: assignment makes pointer from integer without a cast rsgps.c:59: 警告: assignment makes pointer from integer without a cast

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その警告が出てるのはどの行?

abcmottu
質問者

補足

>Tacosanさん回答ありがとうございます。 (1)のprintf("%s\n",buf); 部分のかわりに(2)を入れてコンパイルしてみました。 while (i==0) { res = read(fd,buf,512); buf[--res]=0; /* 文字列終端をセット */ j++; /*一行のNMEAセンテンスから時刻緯度経度のみを取り出すために、strtokで”,”ごとのトークンを得る*/ 47行目→ if ((p=strtok(buf,","))==NULL) return; if (strcmp(p,"$GPRMC")!=0) return; /*センテンスの先頭は$GPRMCか?*/ if ((p=strtok(NULL,","))==NULL) return; /*utc:世界標準時*/ sscanf(p,"%d",&utc); if ((p=strtok(NULL,","))==NULL) return; /*stat:ステータス*/ stat=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*lat:緯度*/ sscanf(p,"%lf",&lat); if ((p=strtok(NULL,","))==NULL) return; /*ns:南北*/ ns=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*lon:経度*/ sscanf(p,"%lf",&lon); if ((p=strtok(NULL,","))==NULL) return; /*ew:東西*/ ew=p[0]; /*時刻緯度経度に対応するトークン表示*/ if (stat!='A') return; /*ステータスチェック*/ printf("%02d時%02d分%02d秒(UTC) ",utc/10000, (utc%10000)/100, utc%100); if (ns=='N') printf("北緯"); else if (ns=='S') printf("南緯"); printf("%.0lf度%.4lf分",floor(lat/100.0), fmod(lat,100.0)); if (ew=='E') printf("東経"); else if (ns=='W') printf("西経"); printf("%.0lf度%.4lf分",floor(lon/100.0), fmod(lon,100.0)); printf("\n"); printf("%d周目\n",j); if(j==48)i++; /*NMEAセンテンス1セットは24行(12種と1行ずつのスペース)なのでここでは48行で2セット分のループ*/ } tcsetattr(fd, TCSANOW, &oldtio); /* 退避させた設定に戻す */ close(fd); /* COM1のシリアルポートを閉じる */ return(0); } gcc -lm rsgps.c rsgps.c: In function ‘main’: rsgps.c:47: 警告: assignment makes pointer from integer without a cast rsgps.c:49: 警告: assignment makes pointer from integer without a cast rsgps.c:51: 警告: assignment makes pointer from integer without a cast rsgps.c:53: 警告: assignment makes pointer from integer without a cast rsgps.c:55: 警告: assignment makes pointer from integer without a cast rsgps.c:57: 警告: assignment makes pointer from integer without a cast rsgps.c:59: 警告: assignment makes pointer from integer without a cast で以上のように出力されました。どのように組み合わせれば解決できるでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 受信データから必要な部分のみ表示するプログラム

    現在C言語を使用して、受信したデータから必要な部分だけを表示するプログラムを作成しております。 以前作成した、GPSからデータを受信するpg1と、必要な部分のみ表示するpg2をあわせることで、受信したデータから必要な部分を抜き出すことができました。 次の段階として、そのプログラムを指定した回数表示が行えるよう変更を試みたのですが、一度表示するとそこで終了してしまう状態から抜け出せません。どの点を改良すれば、回数を指定して表示ができるようになるのでしょうか。よろしくお願いいたします。 このときGPS端末はRS232CでPCに接続GPS端末で受信しています。 受信したNMEAと呼ばれるフォーマットのデータから時刻,緯度,経度に対応する要素を取り出して表示しようとしています。 #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<string.h> #include<termios.h> #include<stdio.h> #include<math.h> #define BAUDRATE B4800 #define MODEMDEVICE "/dev/ttyS0" int main() { int fd, c, res; int utc; char stat; char ns; char ew; char *p; double lat; double lon; struct termios oldtio, newtio; char buf[512]; FILE *fp_gps; while(1){ if((fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ))==-1){ perror(MODEMDEVICE); exit(-1); } tcgetattr(fd, &oldtio); /*シリアルポートの設定を待避*/ bzero(&newtio, sizeof(newtio)); /*新しいポートの設定の構造体をクリア*/ newtio.c_cflag = (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD);/*ボー:4800*/ newtio.c_iflag = (IGNPAR | ICRNL); newtio.c_oflag = 0; newtio.c_lflag = ICANON; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); res = read(fd,buf,512); buf[--res]=0; /* 文字列終端をセット */ if ((p=strtok(buf,","))==NULL) return; if (strcmp(p,"$GPRMC")!=0) return; /*センテンスの先頭は$GPRMCか?*/ if ((p=strtok(NULL,","))==NULL) return; /*utc:世界標準時*/ sscanf(p,"%d",&utc); if ((p=strtok(NULL,","))==NULL) return; /*stat:ステータス*/ stat=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*lat:緯度*/ sscanf(p,"%lf",&lat); if ((p=strtok(NULL,","))==NULL) return; /*ns:南北*/ ns=p[0]; if ((p=strtok(NULL,","))==NULL) return; /*lon:経度*/ sscanf(p,"%lf",&lon); if ((p=strtok(NULL,","))==NULL) return; /*ew:東西*/ ew=p[0]; if (ew==p[0]){ fp_gps = fopen("gdata/gdata.dat","w"); if (fp_gps == NULL){ printf("open fp_gps err\n"); } } /*時刻緯度経度に対応するトークン表示*/ if (stat!='A') return; /*ステータスチェック*/ printf("%02d時%02d分%02d秒(UTC) ",utc/10000+9, (utc%10000)/100, utc%100);/*utc+9時間は日本時間における標準時*/ fprintf(fp_gps,"%02d時%02d分%02d秒(UTC) ",utc/10000+9, (utc%10000)/100, utc%100); if (ns=='N') printf("北緯"); else if (ns=='S') printf("南緯"); printf("%.0lf度%.4lf分",floor(lat/100.0), fmod(lat,100.0)); fprintf(fp_gps,"%.0lf度%.4lf分",floor(lat/100.0), fmod(lat,100.0)); if (ew=='E') printf("東経"); else if (ns=='W') printf("西経"); printf("%.0lf度%.4lf分",floor(lon/100.0), fmod(lon,100.0)); fprintf(fp_gps,"%.0lf度%.4lf分",floor(lon/100.0), fmod(lon,100.0)); printf("\n"); } tcsetattr(fd, TCSANOW, &oldtio); /*退避前の設定に戻す*/ fclose(fp_gps); close(fd); /*ポートを閉じる */ } /*実行結果 ./a.out ./a.out 14時15分48秒(UTC) 北緯34度28.9393分東経136度49.4900分 */実行結果は上記のように出力され、何も表示されないこともあります。ご指摘よろしくお願いいたします。

  • CSVを用いた検索プログラム動かし方

    #pragma warning( disable: 4996 ) #include <stdio.h> #include <string.h> #include <fstream> using namespace std; typedef struct tagKOTOWAZA{ char japanese[50]; char english[50]; }KOTOWAZA; int main() { char buf[256]; KOTOWAZA c[200]; int i, count; /*ifstream strtok strcpy を使ってファイルを読み込む*/ //=====ここから===== ifstream fin("Book1.csv"); if(fin.is_open()){ //ファイル内容の表示とクローズ for(count=0;fin.getline(buf, sizeof(buf)), !fin.eof();count++){//読み込める間 //printf("%s",buf);デバッグ用 char *p; p = strtok(buf,","); if(p)strcpy(c[count].japanese,p); p = strtok(NULL,","); if(p)strcpy(c[count].english,p); } fin.close(); }else{ printf("ファイルのオープンに失敗しました。\n"); return 1; } //=====ここまで==== return 0; } ここからどうすればCSVファイルに書いた 漢字,English を検索できるのかがわかりません・・・ 言語はC++を使っていますvisualstudio2012を使っています。 どうすればいいのか全く分かりません。 よろしくお願いします。

  • char型をfloat型に変換

    GPSからシリアルポートに流れてくるコンマ区切りのフォーマットをいったんcharにいれて、トークンでぶちぶち切って、違う変数に格納したいです。 流れてくるデータは、 $GPGGA,042449.00,3449.30669291,N,13531.38645000,E,1,4,4.4,81.885,M,34.255,M,,*6D のような数値です。緯度経度や日付等のデータです。 緯度や経度の数値をfloatやdoubleに変換して変数に格納したいのですが、どうしたらよいでしょうか? そのまましたらエラーが出てしまいます。 以下は数値をブチブチ切って表示させるプログラムです。 #include <windows.h> #include <stdio.h> int main(void) { char szSend[] = "$GPGGA,000000.00,0000.00000000,N,00000.00000000,E,0,0,0.0,00.000,M,00.000,M,,*00"; char szBuf[sizeof(szSend)]="$GPGGA,042449.00,3449.30669291,N,13531.38645000,E,1,4,4.4,81.885,M,34.255,M,,*6D"; char *ptr; ptr=strtok(szBuf,","); printf("%s\n",ptr);//$GPGGA ptr=strtok(NULL,","); printf("%s\n",ptr);//時間 ptr=strtok(NULL,","); printf("%s\n",ptr);//緯度 ptr=strtok(NULL,","); printf("%s\n",ptr);//N北 ptr=strtok(NULL,","); printf("%s\n",ptr);//経度 ptr=strtok(NULL,","); printf("%s\n",ptr);//E東 ptr=strtok(NULL,","); ・ ・ ・ ・ return 0; } コンパイラはmicrosoftvisualC++6.0です。 floatとかboubleにしたいのは緯度や経度の数値を計算して扱いやすいデータにするためです。 よろしくお願いします。

  • 複数のファイルへの一括処理(困ってます)

    あるディレクトリ内の全てのファイルに同じ処理(添付のプログラムによるtest1.csvファイルに対する処理と同一の処理)をしたいと考えています。 どのようなプログラムを組めば良いのですか? 手法については検討もつかない状況です。 教えていただけないでしょうか? よろしくお願いいたします。 (1)添付のプログラム #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> int main () { FILE *fp; char a[50]; double b; char *p; if((fp = fopen("test1.csv", "r")) == NULL) return 0; while(fscanf(fp, "%s\n", &a) != EOF){ p = strtok( a, "," ); b = atof(a); printf("%lf ", b); while(p != NULL) { p=strtok(NULL, ","); if(p != NULL) { b = atof(p); printf("%lf\n", b); } getch(); } } fclose(fp); return 0; } (2)プログラムで使うCSVファイル -749.95,1.499894061 -749.9,2.371277071 -749.85,3.01070131 -749.8,-0.92298313 -749.75,3.111961134 -749.7,-1.642278763 -749.65,2.759562723 -749.6,0.869387239 -749.55,1.400240703 -749.5,-0.574988131 -749.45,-2.282041367 -749.4,-1.104953718 -749.35,2.45568825 -749.3,-1.391859875 -749.25,-1.600438736 -749.2,0.116074589 -749.15,2.973864166 -749.1,2.652719198 -749.05,1.584699094 -749,2.129474673 -748.95,1.847275561 -748.9,2.974398019 -748.85,1.561458246 -748.8,2.897905731 -748.75,2.655075544 -748.7,-2.677451989 -748.65,-0.871814301 -748.6,-3.098832888 -748.55,2.565297638 -748.5,-2.073626148 -748.45,-0.300440285 -748.4,0.515248274 -748.35,2.983715685 -748.3,-2.47909508

  • コンパイルエラーの原因がわからず困っています。

    こんばんは。 どなたか以下のプログラム(test4.c)が何故コンパイル出来ないのか教えて頂けませんか。行数は見やすいように一時的につけさせて頂きました。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<unistd.h> 5 #include<errno.h> 6 #include<signal.h> 7 #include<sys/types.h> 8 9 10 11 12 13 int main(){ 14 FILE *fp,*fp2; 15 char str[1024]; 16 char *tok; 17 char buf[256]; 18 fp = fopen("file.txt","r"); 19 int i = 0; 20 fp2 = fopen("out.txt","a"); 21 22 while((str = fgets(str,1024,fp)) == EOF){ 23 24 while(1){ 25 // 前文を取得 26 tok = strtok(str, "("); 27 printf("%s\n",tok); 28 strcat(buf, tok); 29 30 // 中文を取得 31 tok = strtok(NULL, ")"); 32 if(tok == NULL)break; 33 tok = strtok(NULL, ")"); 34 if(tok == NULL)break; 35 36 *(tok + 1) = '\0'; 37 tok = strtok(NULL, "CEUFRSAP.");//フラグをトークンの材料にする 38 strcat(buf,tok); 39 40 // 後文を取得 41 tok = strtok(NULL, "("); 42 tok = strtok(NULL, ")"); 43 strcat(buf,"tcp "); 44 strcat(buf,tok); 45 break; 46 } 47 printf("%s\n",buf); 48 printf("%d行目です/n",i++); 49 fputs(buf,fp2); 50 } 51 52 printf("合計%d行です\n",i); 53 fclose(fp); 54 fclose(fp2); 55 return 0; 56 } 以下がコンパイルエラーの全文です。 test4.c: In function ‘main’: test4.c:22: error: incompatible types in assignment どんな些細な意見でも結構です。アドバイスをして頂けないでしょうか。どうぞよろしくお願いします。

  • 再帰プログラム

    #include<stdio.h> int rstrlen(char*); int main(void) { char str[100]; printf("文字列を入力してください\n"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p){ p++; return 1+rstrlen(p); } else return 0; } 文字数を計算するプログラムです。 if(*p)の*pとはNULLを表しているのですか?

  • C言語でセグメンテーションエラー

    環境はUbuntu Feisty Fawn gcc 4.1.2 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 32 #define DEBUG struct node{ char *moji; struct node *left,*right; }; typedef struct node NODE; void error(char *msg){ fflush(stdout); fprintf(stderr, "%s\n", msg); exit(1); } NODE *createNode(char *x){ NODE *new; new = malloc(sizeof(NODE)); if(new == NULL){ error("メモリがありません。\n"); } new->moji = x; new->left = NULL; new->right = NULL; return new; } NODE *insertNode(NODE *p, char *x){ if(p == NULL){ p = createNode(x); }else if(strcmp(p->moji, x) == 0){ return NULL; }else if(strcmp(p->moji, x) > 0){ p->left = insertNode(p->left, x); }else{ p->right = insertNode(p->right, x); } return p; } void printTree(NODE *p){ if(p == NULL) return; printTree(p->left); printf("%s\n",p->moji); printTree(p->right); } int main(int argc, char *argv[]){ FILE *fp; char *buf = malloc(sizeof(char) * MAX); char *ans = malloc(sizeof(char) * MAX); NODE *p = malloc(sizeof(NODE)); if( argc > 2 ){ printf("ファイルの指定は一つだけです。\n"); return -1; }else if(argc == 1){ printf("ファイルを指定してください。\n"); return -1; } fp = fopen( argv[1] , "r" ); if( fp == NULL ){ printf("ファイル読み込みに失敗しました。\n"); return -1; } while(fscanf(fp,"%s",buf) == 1){ ans = strtok(buf," -,."); p = insertNode(p, ans); while(ans != NULL){ ans = strtok(NULL," -,."); if(ans != NULL){ p = insertNode(p, ans); } } } printTree(p); fclose(fp); return 0; } このファイルを読み込んで記憶させたいんです。 file.txt ここから下がファイルの中身 The Java programming language is a general-purpose, concurrent, class-based, object-oriented language. It is designed to be simple enough that many programmers can achieve fluency in the language. どこがいけないとおもいますか?

  • strtok

    strtokにて分解した文字を各変数に格納する場合 char *p; FILE *fp; char buf[1000]; if((fp = fopen("○","r"))==NULL){ return 0; } if(!fgets(buf,1000,fp)) return 0; strcpy(p, buf); number = strtok(p,","); class_type = strtok(NULL,","); name = strtok(NULL,","); subject = strtok(NULL,","); と一行の文字列を各変数に格納しています。 ファイルの一行は以下のような形式になっています。 1,A,山田,数学//番号,クラスタイプ,名前,得意教科 これで各値は変数に格納できています。 しかし このファイルはCSVファイルなのですが、空の欄があると 1,A,,数学というデータがbuf内に入っています。 この場合 number→1 class_type→A name→数学 と空欄の箇所が飛ばされてしまっています。 改善する方法がわからないのですが strtokを使わない方がいいのでしょうか?

  • Expression: nptr != NULL

    デバックではエラーが出なかったのですが、プログラムを走らせた所タイトルのような line:68 Expression: nptr != NULL のエラーが出ました。何が悪いのか分かりません。よろしければ、ご教示お願いします。 68行目もどこか書いておきました。 #include<stdio.h> #include<math.h> #include<string.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include "conio.h" FILE *input; char fname[30]; int keisan(void); int main(void){ char *ret,infname[60],csv[]=".csv"; loop: printf("読み込むファイル名を入力してください\n"); scanf("%s",&fname); ret=strstr(fname,csv); if(ret!=NULL){printf("拡張子[.csv]を入力しないでください\n");goto loop;} strcpy(infname,fname); strcat(infname,csv); input=fopen(infname,"r"); if(input==NULL){ printf( "%sファイルが開けません\n",infname); return -1; }else{ keisan(); } fclose(input); return 0; } int keisan(void){ FILE *output; char outfname[60]; char str[256]; char *n,*nouse; int k=0; double n1,n2,time=60,times; int start=2; int line=0; strcpy(outfname,fname); strcat(outfname,"1.csv");//出力ファイル形式 output=fopen(outfname,"w"); while(fgets(str,256,input)!=NULL){ line++; if(line>=start){ k++; times=(double)k/time; n=strtok(str, ",");//1行目 n=strtok(NULL,",");//2行目 n1=strtod(n,&nouse); n=strtok(NULL,",");//3行目 n=strtok(NULL,",");//4行目 n2=strtod(n,&nouse);   ←←←68行目 printf("%d,%lf,%2.2lf,%2.1lf \n",k,times,n1,n2); fprintf(output,"%d,%lf,%2.2lf,%2.1lf \n",k,times,n1,n2); } } fclose(output); return 0; }

  • 指定した文字列を探して・・・

        第1引数の文字列中に第2引数で指定した文字がある場合に、その     文字のあるアドレス(ポインタ)を返す関数doko()作成し、     プログラムを完成させよ。     指定した文字がない場合はNULL(ヌルポインタ)を返すものとする。     配列の[](カギカッコ)を利用しないで作る事     main内は変えないこと いろいろと模索したのですが、strcpyなどは使うのでしょうか? 参考サイトを見たりしたり、ほかの質問などを見たのですが なかなか理解できずに現在にいたってます 以下のコードのdokoは沢山やりすぎたので一番シンプルな間違い方をしています 何かご指摘あればお願いします #include <stdio.h> #define MAX 128 char* doko(char *,char); int main() { char buf[MAX]; char *p = "abcdef12345"; char *r; r = doko(p, 'f'); if (r == NULL) { printf("mojiretsu ni f toiu moji ha arimasen\n"); return 0; } printf("%s (= f12345)\n", r); scanf("%s", buf); r = doko(buf, 'x'); if (r == NULL) { printf("mojiretsu ni x toiu moji ha arimasen\n"); return 0; } printf("%s\n", r); return 0; } char* doko(char *p,char a) { while(*p){ if(*p == a){ return p; } if(*p != a){ return NULL; } ++p; } }