【问题标题】:warning: "assignment discards 'const' qualifier from pointer target type"警告:“赋值从指针目标类型中丢弃 'const' 限定符”
【发布时间】:2016-12-02 17:15:57
【问题描述】:

我创建了自己的strtod() 函数。

我可以在控制台中printf,但它在运行时会发出这样的警告:

myStrTod.c|29|警告:“赋值丢弃 'const' 限定符 指针目标类型"|


#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;
}

【问题讨论】:

  • 请从编译器发布整个错误/警告消息。
  • 来吧,人们,至少尝试一下。您无法访问您所在位置的搜索引擎吗?这是您的错误消息的第一个结果:(stackoverflow.com/questions/3479770/…)
  • 这不是答案。我很担心,但是当我将 const char 更改为 char 时,它仍然会出错。
  • 你应该说新的错误是什么,很明显。
  • 这是运行时错误,而不是构建错误。

标签: c strtod


【解决方案1】:

您正在尝试将指针到常量字符类型的值分配给指针字符类型的变量。您可以更改myStrTod 的签名,以便您的输出指向指向 const char 的指针:

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的内容,这就足够了。

【讨论】:

    【解决方案2】:

    程序给出了结果,但在 program.exe 停止工作之后!

    原因是这样的:

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

    您只将单个char *stringPtr 的地址传递给函数,但使用参数endPtr 就像有一个char * 数组一样,从而覆盖stringPtr 存储后面的内存。将以上所有内容更改为:

        *endPtr = nPtr + i;
    

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多