2016-12-02 8 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

Вы пытаетесь присвоить значение типа указатель на сопзЬ-полукокса в переменная типа pointer-to-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 char *stringPtr; 

Поскольку вы никогда не писать на содержание *stringPtr, это то достаточно.

0

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

Причина этого заключается в следующем:

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

Вы передавая адрес только одного char *stringPtr функции, но использовать параметр endPtr как если бы массив char *, тем самым перезаписывая память за память stringPtr. Измените все вышесказанное на:

*endPtr = nPtr + i; 

 Смежные вопросы

  • Нет связанных вопросов^_^