質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • C

    3962questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Raspberry Pi

    888questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • GCC

    144questions

    GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

ラズパイでのgccコマンド

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 975

syo000

score 3

/*
 * scanir.c
 */

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>
#include <lcd.h>

int readable = 1;       // 非同期でイベントが発生した場合、コールバックにより0に設定される
int read_pin = 7;       // 入力ピン番号(wiringpiの番号)
int interval = 10;      // 継続時間判定の間隔(us)
int max_wait = 5000;// 最大継続時間(us)
int hp = 101; //HP
int fd;
char *GameOver = "aplay GameOver.wav";

void signalCallBackHandler(int sig)
{
    readable = 0;
}

double getMoment()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return ((double)(tv.tv_sec) * 1000000 + (double)(tv.tv_usec));
}

int main(int argc, char *argv[])
{
    int result;



    fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);

    // スキャンデータを書きだすファイルのポインタを取得
    FILE *fp;
    char *fileName = "ir.data";
    if(argc >= 2){ fileName = argv[1]; }
    if((fp = fopen(fileName, "w")) == NULL){
        printf("can't open file : %s\n", fileName);
        exit(1);
    }
    printf("write file: %s\n", fileName);


    // signal関数は、シグナル(非同期イベント)が発生したときに、
    // そのシグナルを受信して、シグナル特有の処理を行うシグナル処理関数(シグナルハンドラ)を登録します。
    if(signal(SIGINT, signalCallBackHandler) == SIG_ERR){
        printf("can't set signal\n");
        exit(1);
    }

    // wiringpiのセットアップ
    if(wiringPiSetup() == -1){
        printf("error wiringPi setup\n");
        exit(1);
    }


    max_hp();



    // 読み取りピン番号
    if(argc >= 3){
        read_pin = atoi(argv[2]);
    }
    pinMode(read_pin, INPUT);
    printf("scaning pin: %d (wiringpi)\n", read_pin);


    // 最大継続時間
    if(argc >= 4){
        max_wait = atoi(argv[3]) * 1000;
    }
    printf("max keep time: %d(ms)\n", max_wait/1000);


    // 準備完了argcarg
    printf("Infrared LED scanning start.\n");
    printf("Pressed Ctrl+C, this program will exit.\n");

    while(1){
    // スキャン開始
    result = scan(fp);

    fclose(fp);
    if(result || !readable){
        printf("\n\n!!! could not scanning. quit.\n\n");
    } else {
        printf("\nScanning has been done.\n\n");
    }

    if(hp == 0){break;}


    }


    return 0;
}

int scan(FILE *fp)
{


    system(GameOver);




    // 受光モジュールは受光するとLOWになる
    if(!digitalRead(read_pin)){ return 1; }

    int on, off;
    int p = 0;

    while(hp >= 1){

    // 送信が開始されるまで待機
    while( readable && digitalRead(read_pin) ){}

    // 解析開始
    while( readable ){
        on = getTime(0);
        off = getTime(1);
        fprintf(fp, "%6d %6d\n", on, off);
    printf("%d\n",on);
    //printf("%s\n", off);


    lcddisplay();

     break;
    }

    }
        //最大継時間同じ状態が続いたら送信は終了していると判断
        //if(off > max_wait){ break; }




    return 0;
}

int getTime(int status)
{
    int count = 0;
    int max = max_wait / interval;
    double start, end;

    start = getMoment();
    while( digitalRead(read_pin) == status )
    {
        delayMicroseconds(interval);
        count++;
        //最大継続時間同じ状態が続いたら送信は終了していると判断
        if(count > max){ break; }
    }
    end = getMoment();

    return getInterval(start, end);
}

int getInterval(double t1, double t2)
{
    return (int)(t2-t1);
}



int lcddisplay(int fd) {
    int p;

    lcdClear(fd);
    lcdPuts(fd,"HP    /100");

    if(hp >= 100){
        p = 3;
        }if(hp >= 11){
            p = 4;
            }else{p = 5;}
    lcdPosition(fd,p,0);
    char sNum[100];
    hp -= 10;
    sprintf(sNum,"%d",hp);
    lcdPuts(fd,sNum);

    lcdPosition(fd,0,1);
    lcdPuts(fd,"BULLET [       ]");



}


int max_hp(int fd) {
    int p;




    lcdClear(fd);
    lcdPuts(fd,"HP 100/100");



    lcdPosition(fd,0,1);
    lcdPuts(fd,"BULLET [       ]");

}

こちらを
sudo gcc scanir.c -o scanir -l wiringPi
というコマンドでコンパイルしようとしたのですが
/tmp/ccSiaCr5.o: 関数 main' 内: scanir.c:(.text+0xec): lcdInit' に対する定義されていない参照です
/tmp/ccSiaCr5.o: 関数 lcddisplay' 内: scanir.c:(.text+0x53c): lcdClear' に対する定義されていない参照です
scanir.c:(.text+0x548): lcdPuts' に対する定義されていない参照です scanir.c:(.text+0x594): lcdPosition' に対する定義されていない参照です
scanir.c:(.text+0x5d4): lcdPuts' に対する定義されていない参照です scanir.c:(.text+0x5e4): lcdPosition' に対する定義されていない参照です
scanir.c:(.text+0x5f0): lcdPuts' に対する定義されていない参照です /tmp/ccSiaCr5.o: 関数 max_hp' 内:
scanir.c:(.text+0x624): lcdClear' に対する定義されていない参照です scanir.c:(.text+0x630): lcdPuts' に対する定義されていない参照です
scanir.c:(.text+0x640): lcdPosition' に対する定義されていない参照です scanir.c:(.text+0x64c): lcdPuts' に対する定義されていない参照です
collect2: error: ld returned 1 exit status

このように表示されてうまくいきません。
何が悪いのかわかりません。。すいません教えていただけないでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

ただのリンクエラーに見えますが、lcdInit()などを含むライブラリをリンクし忘れているだけではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    3962questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Raspberry Pi

    888questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • GCC

    144questions

    GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。