2016-12-02 30 views
-1

私は自分でstrtod()関数を作成しました。警告: "割り当てはポインタのターゲットタイプから 'const'修飾子を捨てます"

私はコンソールでprintfをすることができますが、それを実行するとき、それは、このような警告与えている:

myStrTod.c|29|warning: "assignment discards 'const' qualifier from pointer target type"|


#include<stdio.h> 
float myStrTod(const char * nPtr, char ** endPtr); 
int rakamMi(int c); 

int main() 
{ 
    float d; 
    const char *string = "51.2% kabul edildi"; 
    char *stringPtr; 

    d = myStrTod(string,&stringPtr); 
    printf("%.3f %s\n",d,stringPtr); 
    return 0; 
} 

float myStrTod(const char * nPtr, char ** endPtr) 
{ 
    char s1[20],s2[50]; 
    int i,j,k = 0,pnt,y = 1,num1 = 0,num2= 0; 
    float f1,f2; 
    for(i = 0; nPtr[i]; i++){ 
     if(rakamMi(nPtr[i]) || nPtr[i] == '.') 
      s1[i] = nPtr[i]; 
     else break; 
    } 
    j = i; 
    for(; nPtr[i]; i++) 
     endPtr[i - j] = nPtr + i; 

    for(i = 0; s1[i]; i++) 
     if(s1[i] == '.'){ 
      pnt = i; 
      break; 
     } 

    for (i = 0; s1[i]; i++) 
    { 
     if(i < pnt) num1 = num1 * 10 + (s1[i] - 48); 
     else if (i == pnt) continue; 
     else{ 
      num2 = num2 * 10 + (s1[i] - 48); 
      ++k; 
     } 
    } 
    for(i = 1; i <= k; i++) 
     y = y * 10; 

    f1 = num2/(float) y; 
    f2 = num1 + f1; 
    // endPtr = s2; 
    return f2; 
} 

int rakamMi(int c) 
{ 
    if(c >= 48 && c <= 57) 
     return 1; 
    else 
     return 0; 
} 
+0

コンパイラからのエラーメッセージまたは警告メッセージ全体を投稿してください。 –

+1

人よ、少なくとも試してみてください。あなたの場所の検索エンジンにアクセスできないのですか?これはあなたのエラーメッセージからの最初の結果です:(http://stackoverflow.com/questions/3479770/warning-assignment-discards-qualifiers-from-pointer-target-type) – KevinDTimm

+0

それは答えではありません。私はそれについて心配しましたが、const charをcharに変更しても、それでもエラーが出ます。 –

答えて

1

をあなたがするタイプへのポインタのconst char型の値を代入しようとしていますchar型へのポインタ型の変数あなたの出力はのconst char型へのポインタになるように、あなたはmyStrTodの署名を変更することができます:

float myStrTod(const char *nPtr, const char **endPtr); 

を次にGCCは異なるエラーを報告します:

40937624.c: In function ‘main’: 
40937624.c:11:25: warning: passing argument 2 of ‘myStrTod’ from incompatible pointer type [-Wincompatible-pointer-types] 
    d = myStrTod(string,&stringPtr); 
         ^
40937624.c:2:7: note: expected ‘const char **’ but argument is of type ‘char **’ 

これはポインタとしてstringPtrを宣言することによって固定することができます。 CONSTへ:

const char *stringPtr; 

あなたが*stringPtrの内容に書き込むことはありませんので、これはその後、十分です。

0

Program given the result but after that program.exe has stopped working!

その理由はこれです:あなたは関数に1つだけchar *stringPtrのアドレスを渡している

j = i; 
    for(; nPtr[i]; i++) 
     endPtr[i - j] = nPtr + i; 

が、char *の配列があったかのようにパラメータendPtrを使用し、 stringPtrのストレージの後ろのメモリを上書きします。上のすべてを次のように変更してください:

*endPtr = nPtr + i; 
関連する問題