2017-01-14 1 views
0

を初期化されずに使用されている:変数「pminutesは」私は、このエラーメッセージが出続ける

変数「pminutesは、」初期化されずに使用されています。

これは私のコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

void ConvertMinutesToHM(int time_minutes, int *phours, int *pminutes); 

void main() 
{ 
    int min, *phours, *pminutes; 
    printf("Enter a number of minutes:\n"); 
    scanf("%d", &min); 
    ConvertMinutesToHM(min, phours, pminutes); 
    printf("Hours=%d", phours); 
    printf("Minutes=%d", pminutes); 
} 

void ConvertMinutesToHM (int time_minutes, int *phours, int *pminutes) 
{ 
    int hours, minutes; 
    *phours = time_minutes/60; 
    *pminutes = time_minutes % 60 * 60; 

} 
+0

私はあなたに尋ねる理由を理解できません。エラーメッセージを理解していますか?変数を初期化することが何を意味するのか知っていますか? –

+0

初期化されていないポインタを使用しています。静的記憶域を持つポインタは、NULLポインタで初期化されます。自動記憶期間を持つポインタは初期化されません。 –

+0

あなたの質問は、投稿されたコードに1つの問題がありますが、いくつかの問題があります。 – user3629249

答えて

2

あなたはConvertMinutesToHM()関数に渡す前にmainpminutesを初期化していないので。関数に渡す前にすべてのパラメータを初期化する必要があることを忘れないでください。

mainでは、あなたが本当にただintを通常必要とする必要があり、それらを適切に初期化:

int min = 0, phours = 0, pminutes = 0; 

ConvertMinutesToHM()を呼び出すときに、あなたは、対応する変数のアドレスを渡すことができます。

ConvertMinutesToHM(min, &phours, &pminutes); 

編集:他の間違いもありましたが、ConvertMinutesToHM()機能:ローカルhours, minutesは完全に必要ではなく、pminutesの計算は意味をなさない。

サンプルの修正:C言語で

void ConvertMinutesToHM(int time_minutes, int *phours, int *pminutes); 

int main() 
{ 
    int min = 0, phours = 0, pminutes = 0; 
    printf("Enter a number of minutes:\n"); 
    scanf("%d",&min); 
    ConvertMinutesToHM(min,&phours,&pminutes); 
    printf("Hours=%d\n",phours); 
    printf("Minutes=%d\n",pminutes); 
} 

void ConvertMinutesToHM (int time_minutes, int *phours, int *pminutes) 
{ 
    *phours=time_minutes/60; 
    *pminutes=time_minutes%60; 
} 
+0

はい、プログラムはちょうど分を取得し、数分から数時間に分を変更するようにします。すなわち、197分は3時間28分です。 ポインタを初期化せずに関数を呼び出すにはどうすればよいですか? –

+0

@danielsable私はもう少しあなたのコードを見ています。いいえ、あなたはまだ 'main'にポインタを必要とせず、他の間違いもあります - 編集されています。 – artm

2

、グローバルまたは静的または明示的にプログラマが初期化されていない変数はすべてで初期化し、それらを読んでいないが、未定義の動作を引き起こします。

ポインタを逆参照する関数に渡しています。初期化されていないため、ポインタが保持している値がどこにも定義されていないため、関数はメモリ内の未定義の場所から読み込みます。これは、ポインタが値を保持していないことを意味するわけではありません。つまり、値はアドレスとして使用できないランダムなガーベッジ値ですが、注意しないと逆参照してもかまいません。

あなたはもちろんのこの

int minutes; 
int *pminutes = &minutes; 

のように、あなたは、単に直接&minutesを渡すことができ、それがスタックに割り当てられる実際の変数を指して、それが有効なメモリを指して作ることによって、それを初期化することができますしかし、この方法では、pminutesポインタはスタック変数minutesのアドレスを保持していますが、これは適切に割り当てられていますが、初期化されていません。

minutes変数は、pminutesが指している値に格納されている値の記憶域として使用されるため、初期化する必要はありません。

この問題は、pminutesがポインタであり、初期化していないと、プログラムが保持しているアドレスを読み込もうとすると、未定義の動作が発生します。

ほとんどの変数を明示的に初期化することは良い習慣ですが、どこかで初期化されることが確実である場合には実行しないことをお勧めします。明示的な初期化を追加することは意味がありません。わかる。

0

あなたは初期化されていないポインタを使用しています。静的記憶域を持つポインタは、ヌルポインタで初期化されます。自動記憶期間を持つポインタは初期化されません。 C89規格から

C89 §3.5.7 Initialization

静的記憶域期間を持つオブジェクトを明示的に初期化されていない場合は算術型を持つすべての部材はすべて0とを割り当てられたかのように、それは暗黙的に初期化されますポインタ型を持つメンバにはヌルポインタ定数が割り当てられました。自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。自動記憶域期間を持つオブジェクトが明示的に初期化されていない場合

は、その値は不定 です:

はまた、ISO C 99 6.7.8.10を参照してください。静的記憶域期間を持つオブジェクトは、明示的に初期化されていない場合、 次いで:

  • がポインタ型を有する場合、それはヌルポインタに初期化されます。あなたはint *pminutesを定義し、その値は不定であり、それは、その不定の場所にアクセスすると、未定義の動作が発生する*pminutes = time_minutes%60*60試みを行った後、それを初期化していない

0

次のコード

  1. はきれい
  2. がのOPにコメントが

に質問し、現在のコード組み込ん所望の動作を実行するコンパイル

#include <stdio.h> // printf(), scanf(), perror() 
#include <stdlib.h> // exit(), EXIT_FAILURE 
//#include <math.h> 

void ConvertMinutesToHM(int time_minutes, int *phours, int *pminutes); 

int main (void) 
{ 
    int min; 
    int hours; 
    int minutes; 

    printf("Enter a number of minutes:\n"); 
    if(1 != scanf("%d", &min)) 
    { 
     perror("scanf failed to read the minutes from the user"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, scanf successful 

    ConvertMinutesToHM(min, &hours, &minutes); 

    printf("Hours=%d\n", hours); 
    printf("Minutes=%d\n", minutes); 
} // end function: main 


void ConvertMinutesToHM (int time_minutes, int *phours, int *pminutes) 
{ 
    //int hours, minutes; 
    *phours = time_minutes/60; 
    *pminutes = time_minutes % 60; 
} // end function: ConvertMinutestoHM 

そして彼端末に表示される結果は次のとおりです。

Enter a number of minutes: 
100 
Hours=1 
Minutes=40 
関連する問題