1

DOS ビデオ メモリを使用して文字列を出力しようとしていますが、関数を呼び出すprint_Id ();(*old)(); これらの警告が表示され、コードが実行されませんが、これらの関数がなくてもすべて正常に動作します。

print_idプロトタイプなしで関数を呼び出す

プロトタイプなしで関数を呼び出す

この関数を一番上に書きましたが、すべて無駄でした。

以下のコードを確認してください。BORLANDCコンパイラを使用しています。

#include<stdio.h>
#include<BIOS.H>
#include<DOS.H>
#include<conio.h>
        int j;

void interrupt (*old)();
void interrupt print_name();
void interrupt print_Id();
char st[80] ={"Bilal Maqsood$"};
char id[20]={"BC110403231$"};
char far *scr=(char far* ) 0xb8000f3C;

int main( )
{
    clrscr();

    old=getvect(0x08);
    setvect(0x08,print_name); //corrected
    return 0;
}


void interrupt print_name(){

  int i=0;
  int j=0;

while(st[i]!='$'){
    *(scr+j)=st[i];
      *(scr+j+1)=0x72;
    i++;
    j+=2;
 }
print_Id ();
}

void interrupt print_Id ( )
{
    int i=0;
  int j=0;

while(id[i]!='$'){
*(scr+j)=id[i];
    *(scr+j+1)=0x17;
  i++;
  j+=2;
 }

(*old)();
}
4

2 に答える 2

5

次の 3 つの宣言について、コンパイラの警告が表示されるはずです。

void interrupt (*old)();
void interrupt print_name();
void interrupt print_Id();

これらは、1 つの関数ポインターと 2 つの関数を宣言します。これらはいずれも C のプロトタイプを定義していません。後者の 2 つは、関数の存在と、戻り値の型が存在することを宣言しますvoid(そしてinterrupt、Borland 固有または DOS 固有のノイズ ワードです)。ただし、空の括弧は、「引数リストは、可変引数関数ではないことを除いて未定義です。したがって...、実際の引数リストには省略記号はありません」という意味です。

それらをプロトタイプにするには、関数が引数を取らないことを明示的に指定する必要があります。

void interrupt (*old)(void);
void interrupt print_name(void);
void interrupt print_Id(void);

これは、空の括弧が「引数なし」を意味する C++ とは異なります。プロトタイプは C89/C90 標準の前に C の一部ではなく、すべての既存のコードは空の括弧を使用して「関数は存在するが、関数について何も知らない」ことを意味する必要があったため、C が標準化されたときに違いが必要でした。引数」であり、既存の C コードがすべて壊れていたら、標準は失敗していたでしょう。

2 つの呼び出しに対してのみ警告が表示される理由は、関数名または関数ポインターを使用して関数を呼び出すときに警告が生成されるためです。関数名が関数ポインタとして使用されている場合ではありません。3 つすべてを修正する必要があります。

ちなみに、私は宣言と定義に一貫性を持たせたいので、関数定義でも常に明示的なvoid引数リストを使用します。関数定義がスタンドアロンの場合でも、プロトタイプを提供することが保証されます。

于 2015-11-22T15:51:27.467 に答える
3

の大文字と小文字が異なるため、宣言void interrupt print_Id();が異なります。print_id()i

そのため、print_id()呼び出し前に宣言または定義せずに呼び出すと、コンパイラは警告を発します。

print_id(ただし、投稿されたコードには、呼び出しを含むno が表示されます...)

于 2015-11-22T14:39:00.073 に答える