• ベストアンサー

#defineについて

#define STATIC_ASSERT(expr) { \ char __STATIC_ASSERTION[(expr) ? 1 : -1]; \ (void)__STATIC_ASSERTION; \ } /* 符号付き整数の右シフトが算術シフトかどうか */ #define SHIFT_LEFT_SINGNED_USES_SAL \ (((signed int)0xffffffff >> 1) == 0xffffffff) /* 符号無し整数の右シフトが論理シフトかどうか */ #define SHIFT_LEFT_UNSIGNED_USES_SHL \ (((unsigned int)0xffffffff >> 1) == 0x7fffffff) とは一体どういう意味なのでしょうか? なぜ、ブロックの中にchar型が宣言されているのでしょうか? なぜ、(void)とキャストされているのでしょうか? できたらわかりやすくご教授よろしくお願いします。

  • 79562
  • お礼率68% (164/239)

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

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

> とは一体どういう意味なのでしょうか? ・コンパイル時にエラーという形でAssertionを起こすためのマクロ ・実装定義である負の値を右シフトした場合の挙動を調べるマクロ x 2 です。 > なぜ、ブロックの中にchar型が宣言されているのでしょうか? char型の宣言ではなく,char型を要素とする配列型の宣言であることが重要です。 exprが真の場合, STATIC_ASSERTは { char _STATIC_ASSERTION[1]; (void)_STATIC_ASSERTION; } となり,コンパイルを通ります。 しかし,exprが負の場合, STATIC_ASSERTは { char _STATIC_ASSERTION[-1]; // 要素数が負であることは許されないのでエラー (void)_STATIC_ASSERTION; } となり,コンパイルを通りません。 通常,expr部分には「コンパイル時に真であるはずの式」を記述しておきます。 たとえば,intが4バイト以上あることを前提としたプログラムであるならば, STATIC_ASSERT(sizeof(int) >= 4) と書いておきます。 > なぜ、ブロックの中にchar型が宣言されているのでしょうか? スコープを作るためです。 一つのスコープに同じ名前を二度定義することはできません。 このため,ブロックを作らなかった場合,一つのブロックにで,STATIC_ASSERTは一回しか使えなくなってしまいます。 > なぜ、(void)とキャストされているのでしょうか? この文が,_STATIC_ASSERTIONを使わないことを明示するためです。 これをしなかった場合,警告をあげるコンパイラがあるためです。

79562
質問者

お礼

回答ありがとうございます。わかりやすい説明ありがとうございました。ついでにもう1つ質問したいのですが、(void)を抜いてやっても警告が出なかったのですが、これはやはり処理系依存ということでしょうか。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

世の中には, 「定義したけど使っていない変数」や「副作用のない式文」に対して警告を出す処理系があります. そのような処理系に対処するために (void) をつけている, はず. 蛇足: 「完全な可搬性」という点では #define SHIFT_RIGHT_SIGNED_USES_SHL ((~0 >> 1) > 0) でもびみょ~に危険な気がしました>#4. 「1の補数」が意外と強敵で, 規格上は ・「すべてのビットが 1 のときにトラップ表現とする」 (この場合 ~0 の振る舞いは未定義) ・「負の 0 は許すんだけど負の 0 が出てくるような演算では (普通の) 0 になる」 (この場合もちろん ~0 は 0 になる) という処理系も考えられます. ということで, #define SHIFT_RIGHT_SIGNED_USES_SHL ((-2 >> 1) > 0) とする方がより安全なのかもしれない. もちろんこれですらダメな処理系も「全くあり得ない」とは言い切れないだろうけど, そこまで驚異的に変態な処理系は使いたくない.

79562
質問者

お礼

回答ありがとうございます。この文を読んでまだまだ勉強不足だということがわかりました。ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> #define STATIC_ASSERT(expr) { \ > char __STATIC_ASSERTION[(expr) ? 1 : -1]; \ > (void)__STATIC_ASSERTION; \ > } やっていることは既に回答が出ているとおりですが、いくつか問題点があります。 1. __STATIC_ASSERTIONが予約済み識別子であり、これを使うと未定義の動作になる。 2. 関数の外で使えない。 3. 余計なオブジェクトを作ってしまう。 普通は、 #define STATIC_ASSERT(expr) extern char static_assert_[(expr) ? +1 : -1] のようにするか、 #define STATIC_ASSERT(expr) extern void static_assert_func_(char [(expr) ? +1 : -1]) のようにします。 > #define SHIFT_LEFT_SINGNED_USES_SAL \ > (((signed int)0xffffffff >> 1) == 0xffffffff) これも既に指摘されているように、マクロ名が間違っていますし、int型が32ビット以下の場合しか使えません。 また、符号付き整数型へのキャストで元の値を表現できない場合(今回もそうです)には、処理系定義のシグナルが発生するか、処理系定義の値になるため、移植性がありません。 なお、算術シフトの判定を行うには、負の値の内部表現が符号ビットと絶対値の場合も考慮しなければなりません。 そのため、 #define SHIFT_RIGHT_SIGNED_USES_SHL ((~0 >> 1) > 0) でよいかと思います。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

こうしたかったのかな /* 符号付き整数の右シフトが論理シフトかどうか */ #define SHIFT_RIGHT_SIGNED_USES_SHL \ ((~0 >> 1) != ~0)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そことは別に, 下のシフトのやつも正確ではないですね. int が 32ビット (以下) じゃないとうまく動かないし, そもそもマクロの名前が間違ってる. #define SHIFT_RIGHT_SIGNED_USES_SAR \ ((~0 >> 1) == ~0) の方が, 多分より正しい.... あれ? 最後のマクロって無意味じゃない? これ, int が 32ビット以上であれば必ず 1 のような気がするし, それ以前に「符号なし整数の右シフト」は必ず論理シフトのはず....

関連するQ&A

  • secが・・確認お願いできませんか?

    秒数が出ないのですがどこが違うのでしょうか? #define TCNT0 (*(volatile unsigned int *)0xffff68) #define GRA0 (*(volatile unsigned int *)0xffff6a) #define GRB0 (*(volatile unsigned int *)0xffff6c) #define TCR0 (*(volatile unsigned char *)0xffff64) #define TIOR0 (*(volatile unsigned char *)0xffff65) #define TIER0 (*(volatile unsigned char *)0xffff66) #define TSR0 (*(volatile unsigned char *)0xffff67) #define TSTR (*(volatile unsigned char *)0xffff60) #define ITU_CLOCK8 3 #define ITU_CLEAR_GRA 32 #define ITU_IE_IMFA 1 #define DI asm( "orc.b #0xc0,ccr" ) #define EI asm( "andc.b #0x3f,ccr" ) void start_itu0(); void int_imia0(void) __attribute__ ((interrupt_handler)); int cnt = 0, sec = 0, min = 0, hour = 0; char str[] = "timer 00:00:00"; int main(void) { lcd_init(); lcd_puts(str); start_itu0(); EI; for(;;) { if (cnt >=100) { cnt = 0; sec++; if (sec >=60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) hour = 0; } str[6] = '0' + hour /10; str[7] = '0' + hour %10; str[9] = '0' + min /10; str[10] = '0' + min %10; str[12] = '0' + sec /10; str[13] = '0' + sec %10; lcd_home(); lcd_puts(str); } } } return 0; }

  • 分割コンパイルの#defineについて

    分割コンパイルで ファイル1 #include <stdio.h> #define number 10 char string[number]; int main(void){ string[0]='a'; string[1]='b'; file_to(); return 0; } ファイル2 #include <stdio.h> #define number 10 extern char string[number]; void file_to(void){ /***何かの処理をする*****/ } って感じなんですけども、配列string の中身の値をdefineによって指定しているのですが、片方のdefineの値を変更する時、もう一つのdefineも手動で変更しています。関係するファイル数が多くなってくると大変なので、どれかのdefineの値を変化させたら自動的に他のdefineの値も変更するプログラムの組み方はありませんか? 質問がわかりにくいかも知れませんがよろしくお願いします。

  • 3次元配列でのポインタ

    唐突ですみません。 サイズが640*480の画像を180枚読み込むプログラムをポインタを使って作成しようと考えています。 以下で示すプログラムは画像を読み込むための作成したものですが、エラーが出てしまい実行することができません。 間違えている箇所があればご指摘お願いします。 また、そのほかに効率の良いやり方などがありましたらご教授願います。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define xsize 640 #define ysize 480 #define round 180 #include "Input.h" void Input_task(unsigned char ***In); void main() {   static unsigned char ***In;   int i,j;   In=(unsigned char***)malloc(sizeof(unsigned char)*round);   for(i=0;i<round;i++)   {     In[i]=(unsigned char**)malloc(sizeof(unsigned char)*ysize);     for(j=0;j<ysize;j++)     {       In[i][j]=(unsigned char*)malloc(sizeof(unsigned char)*xsize);     }   }   Input_task(In); } Input.hの中身 void Input_task(unsigned char ***In) {   char filename[30];   int i,j,k;   FILE *fp;   for(i=0;i<round;i++)   {     sprintf(filename,"b20_%04d.raw",i);     fp=fopen(filename,"rb");    for(j=0;j<ysize;j++)     {       for(k=0;k<xsize;k++)       {         *(*(*(In+i)+j)+k)=(unsigned char)getc(fp);       }     }    fclose(fp);   } }

  • 課題でつまってます・・・

    閲覧ありがとうございます。 main内のkr_sortの部分と、kr_sortのswapがおかしいのですが、どうやっても「警告: 互換性のないポインタ型からの引数 1 個の `swap' を渡しますです」という風になってしまいます。どなたかご指摘お願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUMERIC 1 #define DECR 2 #define LINES 100 #define MAXLEN 1000 #define ALLOCSIZE 10000 #define MAXLINES 5000 int numcmp(char *s1, char *s2); int readlines(char *lineptr[], int maxlines); int getline (char s[], int lim); void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)); void writelines(char *lineptr[], int nlines, int decr); char *lineptr[MAXLINES]; char linestor[20]; char *alloc(int n); static char option = 0; static char allocbuf[ALLOCSIZE]; static char *allocp = allocbuf; main(int argc, char *argv[]) { char *lineptr[LINES]; int nlines; int c, rc = 0; while (--argc > 0 && (*++argv)[0] == '-') while (c = *++argv[0]) switch (c) { case 'n': option |= NUMERIC; break; case 'r': option |= DECR; break; default: printf("sort: illegal option %c\n", c); argc = 1; rc = -1; break; } if (argc) printf("Usage: sort -nr \n"); else if ((nlines = readlines(lineptr, LINES)) > 0) { if (option & NUMERIC) kr_qsort((void **) lineptr, 0, nlines-1, (int (*) (void *, void *)) numcmp); else kr_qsort((void **) lineptr, 0, nlines-1, (int (*) (void *, void *)) strcmp); writelines(lineptr, nlines, option & DECR); } else { printf("input too big to sort \n"); rc = -1; } return rc; } int numcmp(char *s1, char *s2) { double v1, v2; v1 = atof(s1); v2 = atof(s2); if (v1 < v2) return -1; else if (v1 > v2) return 1; else return 0; } int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || (p = alloc(len)) == NULL) return -1; else { line[len-1] = '\0'; strcpy(p, line); lineptr[nlines++] = p; } return nlines; } char *alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; } void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(void *v[], int i, int j); if (left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) swap(v, ++last, i); swap(v, left, last); kr_qsort(v, left, last-1, comp); kr_qsort(v, last+1, right, comp); } void writelines(char *lineptr[], int nlines, int decr) { int i; if (decr) for (i = nlines-1; i >= 0; i--) printf("%s\n", lineptr[i]); else for (i = 0; i < nlines; i++) printf("%s\n", lineptr[i]); } void swap(char *v[], int i, int j) { char *temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } int getline (char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; }

  • どういった計算をしてるのか知りたい

    以下のコードはある特殊なファイルのCRCを算出するものですが、算出できてもこのコードのプログラムだと算出だけでCRCをうまく合わせられるように変更ができないので、計算してバイナリ上で変更できるように計算公式が知りたいです。 ☆CRC.cpp Hidden Block (10 post(s) are required, you have 32): #ifndef _CCRC32_CPP #define _CCRC32_CPP #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include "CRC.H" void CCRC32::Initialize(void) { memset(&this->ulTable, 0, sizeof(this->ulTable)); // 256 values representing ASCII character codes. for(int iCodes = 0; iCodes <= 0xFF; iCodes++) { this->ulTable[iCodes] = this->Reflect(iCodes, 8) << 24; for(int iPos = 0; iPos < 8; iPos++) { this->ulTable[iCodes] = (this->ulTable[iCodes] << 1) ^ (this->ulTable[iCodes] & (1 << 31) ? CRC32_POLYNOMIAL : 0); } this->ulTable[iCodes] = this->Reflect(this->ulTable[iCodes], 32); } } // Reflection is a requirement for the official CRC-32 standard. // You can create CRCs without it, but they won't conform to the standard. unsigned long CCRC32::Reflect(unsigned long ulReflect, char cChar) { unsigned long ulValue = 0; // Swap bit 0 for bit 7 bit 1 For bit 6, etc.... for(int iPos = 1; iPos < (cChar + 1); iPos++) { if(ulReflect & 1) ulValue |= 1 << (cChar - iPos); ulReflect >>= 1; } return ulValue; } unsigned long CCRC32::FileCRC(const char *sFileName) { unsigned long ulCRC = 0xffffffff; FILE *fSource = NULL; unsigned char sBuf[CRC32BUFSZ]; int iBytesRead = 0; if( (fSource = fopen(sFileName, "rb")) == NULL) { return 0xffffffff; } do{ iBytesRead = fread(sBuf, sizeof(char), CRC32BUFSZ, fSource); this->PartialCRC(&ulCRC, sBuf, iBytesRead); }while(iBytesRead == CRC32BUFSZ); fclose(fSource); return(ulCRC ^ 0xffffffff); } unsigned long CCRC32::FullCRC(unsigned char *sData, unsigned long ulLength) { unsigned long ulCRC = 0xffffffff; this->PartialCRC(&ulCRC, sData, ulLength); return ulCRC ^ 0xffffffff; } //For Example usage example, see FileCRC(). void CCRC32::PartialCRC(unsigned long *ulInCRC, unsigned char *sData, unsigned long ulLength) { while(ulLength--) { *ulInCRC = (*ulInCRC >> 8) ^ this->ulTable[(*ulInCRC & 0xFF) ^ *sData++]; } } #endif ☆CRC.h Hidden Block (10 post(s) are required, you have 32): #ifndef _CCRC32_H #define _CCRC32_H // This is the official polynomial used by CRC-32 in PKZip, WinZip and Ethernet. #define CRC32_POLYNOMIAL 0x04c11db7 #define CRC32BUFSZ 1024 //Used for FileCRC() class CCRC32{ public: void Initialize(void); unsigned long FileCRC(const char *sFileName); unsigned long FullCRC(unsigned char *sData, unsigned long ulLength); void PartialCRC(unsigned long *ulInCRC, unsigned char *sData, unsigned long ulLength); private: unsigned long Reflect(unsigned long ulReflect, char cChar); unsigned long ulTable[256]; // CRC lookup table array. }; #endif わかる方よければ教えてください。

  • PIC12F683を用いたCapture実験

    いま、PIC12F683を用いてCCPモジュールのCapture機能の実験をしています。一応、ビルドはできたので書き込んで動かしてみましたが、思ったとおり(スイッチを押したときにLEDを点灯させる)に動作しませんでした 動作はとしては、押しボタンスイッチを押したときにキャプチャーして LEDを点灯させるという簡単なものです。 下に使用しているプログラムを掲載しますので、どうしたらいいか教えてください。 // CaptureTest.c #include <pic.h> #include "delay.h" #include "CCP.h" __CONFIG( FCMDIS & IESODIS & BORDIS & WDTDIS & UNPROTECT & UNPROTECT & MCLRDIS & PWRTEN & INTIO); __IDLOC(0x00); unsigned char temp; ioport(); main(void) { //ポートの初期化、入出力設定など     ioport(); //Captureモード、立ち上がりエッジに設定 setCcpMode(CCP_CAPUTURE_PGE);      //フラグ(CCP1IF)を「0」にセット ResetCcpFlag();      //CCP割り込み許可 setCcpEnable(ENABLED); //TIMER1のプリスケーラを「1/8」に設定      T1CKPS1=1; T1CKPS0=1;     //外部回路を動作させない T1OSCEN=0;     //TIMER1を同期モードにセット T1SYNC=0;     //TIMER1のクロックは内部クロックを使用 TMR1CS=0;     //全割り込み、周辺割り込み許可 GIE=1; PEIE=1;      //TIMER1をリセット(0セット) ResetTMR1(); //TIMER1スタート     T1_START();      //CCP割り込みフラグが立つまでチェック while(ChkCcpFlag()==0);     //CCP割り込みフラグクリア ResetCcpFlag();     //GP3をハイレベルに設定してLEDを点灯 temp=1; GPIO3=temp; } ioport() { ANSEL=0x00; TRISIO=0x04; } //CCP.c #include <pic.h> void setCcpMode(unsigned char mode) { CCP1CON= mode; } void setPwmPeriod(unsigned char T) { PR2=(T-1); } void setPwmDuty(unsigned int duty) { DC1B0 = 0x01&duty; DC1B1 = 0x02&duty; CCPR1L = 0xFC &duty; } void setCcpEnable(unsigned char flag) { CCP1IE=flag; } void ResetCcpFlag(void) { CCP1IF=0; } unsigned char ChkCcpFlag(void) { unsigned char ret=0; if(CCP1IF==1) return ret=1; return ret; } void ResetTMR1(void) { TMR1H=0x00; TMR1L=0x00; } void T1_START(void) { TMR1ON=1; } void T1_STOP(void) { TMR1ON=0; } //CCP.h #define ENABLED 1 #define DISABLED 0 #define CCP_OFF 0x00 #define CCP_CAPUTURE_NGE 0x04 #define CCP_CAPUTURE_PGE 0x05 #define CCP_CAPUTURE_4th_PGE 0x06 #define CCP_CAPUTURE_16th_PGE 0x07 #define CCP_COMPARE_SET_ON_MATCH 0x08 #define CCP_COMPARE_CLR_ON_MATCH 0x09 #define CCP_COMPARE_INT 0x0A #define CCP_COMPARE_RESET_TIMER 0x0B #define CCP_PWM 0x0C extern void setCcpMode(unsigned char); extern void setPwmPeriod(unsigned char); extern void setPwmDuty(unsigned int); extern void setCcpEnable(unsigned char); extern void ResetCcpFlag(void); extern unsigned char ChkCcpFlag(void); extern void ResetTMR1(void); extern void T1_START(void); extern void T1_STOP(void);

  • 暗黙的型変換

    C の文法書を読んでいると、 汎整数型拡張: int より小さな汎整数型が式中に現れる場合は、暗黙的に int 型に変換される。 算術変換: 二項演算子で二つのオペランドの型が違う場合は、演算前により大きな方の型に暗黙的に変換される。 とあります。 例えば int 型 = unsigned short 型 - unsigned char 型; はどのように暗黙的な型変換が行われるのでしょう。 int 型 = (int)unsigned short 型 - (int)unsigned char 型; でしょうか。あるいは、 int 型 = (int) ( unsigned short 型 - (unsigned short)unsigned char 型); でしょうか。

  • PWM を使ったSine波の生成について

    今、以前に投降した正弦波発振器とは別に、PIC16F88のPWMを使って正弦波を発生する小型の回路を作ろうと考えています。 以下のようなプログラムを作りました。 コンパイルは通るのですが、「error: (1250) could not find space (128 bytes) for variable F994」と「could not find space (128 bytes) for variable _data」というエラーメッセージがでてビルドができません。 どの個所が悪いのでしょうか教えてください。 また、開発環境については、MPLAB X IDE(バージョン3.20)でコンパイラーはXC8(バージョン3.60)を使用しています。 ///////////////////////////以下プログラム///////////////////////////////////////// #include <pic.h> #define _XTAL_FREQ 4000000 //CONFIGは省略 void ioport(void); void setCcpMode(unsigned char); void setPwmPeriod(unsigned char); void setPwmDuty(unsigned int); void ConfigTMR2(unsigned char set); void main(void) { unsigned int cnt; unsigned char data[128]={128,134,140,146,152,159,165,171,176,182,188,193,199,204,209,213,218,222,226,230,234,237,240,243,246,248,250,252,253,254,255,255,256,255,255,254,253,252,250,248,246,243,240,237,234,230,226,222,218,213,209,204,199,193,188,182,176,171,165,159,152,146,140,134,128,121,115,109,103,96,90,84,79,73,67,62,56,51,46,42,37,33,29,25,21,18,15,12,9,7,5,3,2,1,0,0,0,0,0,1,2,3,5,7,9,12,15,18,21,25,29,33,37,42,46,51,56,62,67,73,79,84,90,96,103,109,115,121}; ioport(); setCcpMode(CCP_PWM_ACTIVE_HIGH);//CCP1CONに0b00001100をセット setPwmPeriod(255);//PR2に255をセット setPwmDuty(0); ConfigTMR2(TMR2_DIV4_ON);//TMR2のプリスケーラーを4倍に、そしてTMR2をON while(1){ //duty=adconv(0); for(cnt=0;cnt<128;cnt++){ setPwmDuty(data[cnt]); } } } void ioport(void){ OSCCON=0x60; CMCON=0x07; TRISA=0x00; ANSEL=0x00; PORTA=0x00; TRISB=0x00; PORTB=0x00; } void setCcpMode(unsigned char mode) { CCP1CON= mode; } void setPwmPeriod(unsigned char T) { PR2=T; } void setPwmDuty(unsigned int duty) { unsigned char tmp; tmp=(unsigned char)((duty & 3)<<4); CCP1CON |=tmp; tmp=(unsigned char)(duty>>2); CCPR1L=tmp; } void ConfigTMR2(unsigned char set) { T2CON=set; }

  • PIC18F1320でwarningがでる

    PIC18F1320で MPLAB X IDE v3.26 XC 8です warningがでる warningがでてもプログラムは動く warningがでなくしたい LCD液晶表示装置を使うので8ビット符号なし整数型がいい 0から255の8ビット符号なし整数型しか使わない キャラクターコードをLATB(PORTB)に送るため プログラムで-1や256になったりしないよう制御してある #include <xc.h> CONFIG 省略 ほとんど省略 // EQU unsigned char TMRA=1; unsigned char TMRB=1;//など void main(void) { TMRA = TMRA - 20; TMRB = TMR+1;//など } newmain.c: warning: (xxx) conversion to shorter data type よろしくお願いします。

  • PICのプログラムについて質問です

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

専門家に質問してみよう