Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucasseribeiro

Deprecated conversion II: a saga

Recommended Posts

Olá,

 

no post anterior sobre esse warning, marcado como resolvido, eu concluí que tratava-se da plataforma e coloquei um Debian. Perfeito, rápido, firmão, sem conflitos internos. E continuei meus códigos que funcionaram perfeitamente...

 

Tive dificuldades, parei tudo, e fiz o seguinte código que, resolvido, me permitiria continuar o codigão que deixei de lado. Eis:

#include <iostream>
#include <cstdio>

using namespace std;

void funcao ( char string[] ) {
    cin >> string;
    cout << string; }

int main(){
    funcao("lorem ipsum_ ");
    return(0); }

Era pro código coutar "lorem ipsum_", mas quem coutou foi o g++ : deprecated conversion. Mas esse é só um warning desagradável, o pobrema é que não imprime a string inserida!

 

Tenho que pôr índice na string dentro da função?

/home/lucasribeiro/Produção/OFICINA/_DESKTOP/oficina.cpp: In function ‘int main()’:
/home/lucasribeiro/Produção/OFICINA/_DESKTOP/oficina.cpp:17:24: warning: deprecated conversion from string
constant to ‘char*’ [-Wwrite-strings]
  funcao("lorem ipsum_ ");
                        ^
/usr/bin/ofc: line 7: ./home/lucasribeiro/Produção/OFICINA/_DESKTOP/oficina: Arquivo ou diretório não
encontrado

Que sacanagem! Num dava pro g++ sugerir código? Os financiadores do projeto são corinthianos, perderam pro palmeiras, ficaram revoltados e apertaram nas verbas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, string é palavra reservada da linguagem (é uma classe em C++). Não use isso como nome de variável.
E por que você incluiu cstdio se não está usando nada dele?

 

Os três códigos a seguir funcionam perfeitamente p/ mim.

#include <iostream>
using namespace std;

void funcao(string s) {
  cout << s;
}

int main() {
  funcao("lorem ipsum_ ");
  return 0;
}
#include <iostream>
using namespaces std;

void funcao(char * s) {
  cout << s;
}

int main() {
  funcao("lorem ippsum_ ");
  return 0;
}
#include <iostream>
using namespaces std;

void funcao(char s[]) {
  cout << s;
}

int main() {
  funcao("lorem ippsum_ ");
  return 0;
}

Colei teu código e na execução ele dá falha de segmentação por causa da leitura. Mas repare que na saída do GCC existe um outro problema ali: arquivo ou diretório não encontrado. Resolva isso primeiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, Ísis...

 

eu não sabia que a classe string estava na iostream, grato.

E eu uso cstdio pois ainda não decidi o algoritmo inteiro, não sei quando vou usar fopen() & cia.

Ísis, olha minha saída de console para cada um dos três modos respectivamente:

 

string s

# echo ""; g++ standby.cpp -o standby -Wall; ./standby; echo ""; echo ""

lorem ipsum_

* Ponteiro

# g++ standby.cpp -o standby -Wall; ./standby;
standby.cpp:2:7: error: expected nested-name-specifier before ‘namespaces’
 using namespaces std;
       ^
standby.cpp: In function ‘void funcao(char*)’:
standby.cpp:5:3: error: ‘cout’ was not declared in this scope
   cout << s;
   ^
standby.cpp:5:3: note: suggested alternative:
In file included from standby.cpp:1:0:
/usr/include/c++/4.9/iostream:61:18: note:   ‘std::cout’
   extern ostream cout;  /// Linked to standard output
                  ^
standby.cpp: In function ‘int main()’:
standby.cpp:9:33: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
   funcao("\n\tlorem ippsum_\n\n");
                                 ^

lorem ipsum_

vetor

# echo ""; g++ standby.cpp -o standby -Wall; ./standby; echo ""; echo ""

standby.cpp:2:7: error: expected nested-name-specifier before ‘namespaces’
 using namespaces std;
       ^
standby.cpp: In function ‘void funcao(char*)’:
standby.cpp:5:3: error: ‘cout’ was not declared in this scope
   cout << s;
   ^
standby.cpp:5:3: note: suggested alternative:
In file included from standby.cpp:1:0:
/usr/include/c++/4.9/iostream:61:18: note:   ‘std::cout’
   extern ostream cout;  /// Linked to standard output
                  ^
standby.cpp: In function ‘int main()’:
standby.cpp:9:26: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
   funcao("lorem ippsum_ ");
                          ^
lorem ipsum_ 

Mostrei o console mais por você mesmo. Decidi pela a classe string.

Achei que o problema. na verdade, era que eu tinha mais de uma versão do g++ instalada;

"conversão depreciada" parece sintaxe que não vale mais pra versão atual. Mas

não adiantou, será que tem que reiniciar o ambiente ou o pc??

 

Ísis, você sempre me ajuda! Então, obrigado mesmo...

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em C++, a não ser que você esteja estudando alocação de memória ou precise otimizar o código em termos de espaço utilizado (e saiba o que está fazendo), é melhor usar a classe string p/ textos.

 

Mas se você quer mesmo se livrar do warning (e entrar naqueles detalhes "sórdidos" da linguagem):
1- Literais como "lorem ipsum" são tidos como const char * (http://en.cppreference.com/w/cpp/language/string_literal)

2- Como você passa um const char * p/ uma função que recebe um char *, a opção -Wwrite-strings (veja ali na mensagem do compilador) produz o warning.

 

Da página do manual do GCC:

 

 

-Wwrite-strings

When compiling C, give string constants the type "const char[length]" so that copying the address of one into a non-"const" "char *" pointer produces a warning. These warnings help you find at compile time code that can try to write into a string constant, but only if you have been very careful about using "const" in declarations and prototypes. Otherwise, it is just a nuisance. This is why we did not make -Wall request these warnings.
When compiling C++, warn about the deprecated conversion from string literals to "char *". This warning is enabled by default for C++ programs.

 

Detalhe:

"Attempting to modify a string literal results in undefined behavior"

 

Veja que mesmo com esse warning (const char * -> char *, sem a escrita) o programa funcionou p/ mim (sem a escrita no const char *)

 

Atenção p/ o que você escreveu: é namespace, sem o 's' no final (por isso que não encontra cout nem nada)

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu pus o "s"? kkk, vivo fazendo isso...

 

É queu to desenvolvendo no bloco de notas "pluma", do mate-desktop, só que ainda não tem intelisense e depuração. Mas, pessoalmente, não me dei bem com as ides... ah pô! quanto mais virtude, mais defeito!

 

o teu funcionou mesmo com o comportamento indefinido, né

 

tenho que estudar a referência do cpp, a começar por aí

 

Eu tô criando um sisteminha tipo agenda, pra faculdade, mas que tbm suporte relatório e diário. Começando em console. Mas por uma questão de tempo, estou apertando o algoritmo ao mesmo tempo da escrita; então decido parte por parte. Se eu não tivesse em aprendizado seria o dobro mais rápido...

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

o teu funcionou mesmo com o comportamento indefinido, né

Não. Deu falha de segmentação. O warning não é relativo ao comportamento indefinido. A escrita num const char * é o comportamento indefinido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então eu não interpretei corretamente, preciso analisar a referência no site.

 

"Attempting to modify a string literal results in undefined behavior"

 

Você pareceu se referir ao modo, de resolver o código que mostrei, em que você usa o ponteiro "char *", sem o "const"...

# g++ standby.cpp -o standby -Wall; ./standby;
standby.cpp:2:7: error: expected nested-name-specifier before ‘namespaces’
 using namespaces std;
       ^
standby.cpp: In function ‘void funcao(char*)’:
standby.cpp:5:3: error: ‘cout’ was not declared in this scope
   cout << s;
   ^
standby.cpp:5:3: note: suggested alternative:
In file included from standby.cpp:1:0:
/usr/include/c++/4.9/iostream:61:18: note:   ‘std::cout’
   extern ostream cout;  /// Linked to standard output
                  ^
standby.cpp: In function ‘int main()’:
standby.cpp:9:33: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
   funcao("\n\tlorem ippsum_\n\n");
                                 ^

lorem ipsum_

Que, mesmo com notes, warnings e errors, ainda assim funcionou!

 

tá valendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. O undefined behavior é p/ o teu cin >> string. Se estamos usando a mesma versão do GCC, você também vai ter uma falha de segmentação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se gostar da ideia de trabalhar com Makefile, tenho um padrão que mantenho no github.

 

https://github.com/GBeckerRS/makefilePadrao

 

Ao executar o make, compila os arquivos de objeto na pasta obj e o executavel na pasta bin.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.