Lista em C++ dando erro na hora de chamar as funções

Galera o que eu to fazendo de errado?

struct Lista{ char info; Lista *prox; }; struct Lista *aloca(){ return (Lista*)malloc(sizeof (Lista)); }
Funções:Lista imprimir (Lista *l){ Lista *l2; l2=l; if (l2==NULL) cout<<"Lista Vazia"; else { Lista *aux=l; cout<<"["; while (aux != NULL){ cout<<aux->info; aux = aux-> prox; } cout<<"]"; } }
Main:[code]int main(int argc, char *argv[])
{
Lista lista;
int pos;
char elem;
char op;
cout<<“informe a operacao?\n”;
cout<<“a.Imprimir elementos\n”;
cout<<" b.Inserir elemento\n";
cout<<" c. Remover elemento na posicao\n";
cout<<“s. Sair”;
cin>>op;
switch(op){
case ‘a’:
imprimir(lista);
break;

           }while(op!='s');

}[/code]
ta dando o seguinte erro:
cannot convert Lista' toLista*’ for argument 1' toLista imprimir(Lista*)’

O que pode ser?

detalhe eu nao coloquei as outras funções mas elas tao dando o mesmo erro da primeira ai, acho queé na chamada… o compilador nao acusa erro nas funções

ps: to usando compilador dev C++, 4.9.9.2

Obrigado

Bom, não conheço muito C++ e não consegui ver os erros, mas se eu não estiver enganado:

Ainda se usa malloc :?: não seria [color=blue]new[/color].

Dev C++, 4.9.9.2 está descontinuado.

:thumbup:

o Malloc funciona normalmente…

eu nao sei resolver é o erro em si…

parece que da erro na hora da chamada da função

edit:

Quando você chama a função imprimir(), na função main, você tem que passar o endereço da lista: imprimir(&lista);

RESOLVIDO

Não estou dizendo que o erro está no malloc, só estava tirando uma dúvida pessoal em relação ao seu uso. :smiley:

switch(op){  
               case 'a':  
                    imprimir(&lista);  
               break;  

Pelo erro acho q eh ali:
cannot convert Lista' toLista*’ for argument 1' toLista imprimir(Lista*)'
pq não tava passando o ponteiro.

bem,
Este erro é pq vc espera um ponteiro da Lista, então troque sua chamada adicionando o & antes:
imprimir(&lista);

Mesmo assim seu código não ta funfando… tem alguns bugs…

EDITADO: Ops… o tsprates mandou o erro enquanto eu editava!

[quote=tsprates] switch(op){ case 'a': imprimir(&lista); break;

Pelo erro acho q eh ali:
cannot convert Lista' toLista*’ for argument 1' toLista imprimir(Lista*)'
pq não tava passando o ponteiro.
[/quote]
é isso mesmo cara, consegui aqui…

os bugs era que eu tava fazendo corrido… mas acho que consertei já

Isso que vocês estão escrevendo se chama “linguagem c” e não c++. C++ é orientado a objetos e já possui todas essas estruturas de dados na stl:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

 

main()

{
   vector<string> SS;
 

   SS.push_back("The number is 10");
   SS.push_back("The number is 20");
   SS.push_back("The number is 30");

   cout << "Loop by index:" << endl;
 

   int ii;

   for(ii=0; ii < SS.size(); ii++)

   {

      cout << SS[ii] << endl;

   }

 
   cout << endl << "Constant Iterator:" << endl;
 

   vector<string>::const_iterator cii;

   for(cii=SS.begin(); cii!=SS.end(); cii++)

   {

      cout << *cii << endl;
   }

   cout << endl << "Reverse Iterator:" << endl;

   vector<string>::reverse_iterator rii;

   for(rii=SS.rbegin(); rii!=SS.rend(); ++rii)

   {

      cout << *rii << endl;

   }

   cout << endl << "Sample Output:" << endl;

   cout << SS.size() << endl;

   cout << SS[2] << endl;

   swap(SS[0], SS[2]);

   cout << SS[2] << endl;

}

http://www.cplusplus.com/reference/stl/list/
http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html

Discordo… ele pode estar programando de forma procedural, pois diferente do Java onde tudo é classe, no C++ é possível programar desta forma.
Ser procedural não significa não ser C++.

Tente compilar este código com um compilador C e verás que não consegue, só conseguirá com um compilador C++.

Agora se a Lista já existe pronta, ou não deveria ser feita assim, já é outra história.

Abs

[quote=jmmenezes][quote]
Isso que vocês estão escrevendo se chama “linguagem c” e não c++. C++ é orientado a objetos e já possui todas essas estruturas de dados na stl:
[/quote]

Discordo… ele pode estar programando de forma procedural, pois diferente do Java onde tudo é classe, no C++ é possível programar desta forma.
Ser procedural não significa não ser C++.

Tente compilar este código com um compilador C e verás que não consegue, só conseguirá com um compilador C++.

Agora se a Lista já existe pronta, ou não deveria ser feita assim, já é outra história.

Abs[/quote]

depende cara, ali só não compila em C por causa dos comandos cout e cin, só trocar por printf e scanf

se eu pegar um programa em C mudar apenas 1 printf por 1 cout, eu não posso chamar de c++, claro vou ter que salvar com .cpp etc… mas falando em poucos detalhes

o que eu considero(minha opinião) um programa minimo em C++, é que tenha 1 classe, essa classe possua métodos e atributos, e ela seja inicializada. sem uso de structs, ou qualquer método que ja tenha sido substituido por um novo na linguagem C++.

Ok… realmente é isso… mas indo por esta linha seria a mesma coisa que falar que um programa Java que só tenha uma unica classe com método Main, não é um programa Java.
Não faz sentido usar C++ para escrever algo assim… poderia usar C diretamente com printf, foi o que eu falei… se a Lista já existe pronta, ou não deveria ser feita assim já é outra história…

Realmente eu nunca usaria C++ para escrever algo assim, da mesma forma que dificilmente usaria Java para escrever um programa com uma unica classe e unico método Main.

Abs

[quote=jmmenezes][quote]
Isso que vocês estão escrevendo se chama “linguagem c” e não c++. C++ é orientado a objetos e já possui todas essas estruturas de dados na stl:
[/quote]

Discordo… ele pode estar programando de forma procedural, pois diferente do Java onde tudo é classe, no C++ é possível programar desta forma.
Ser procedural não significa não ser C++.

Tente compilar este código com um compilador C e verás que não consegue, só conseguirá com um compilador C++.

Agora se a Lista já existe pronta, ou não deveria ser feita assim, já é outra história.

Abs[/quote]

jmenezes, c++ é um superset da linguagem c, assim como vala e objective c. É claro que você consegue usar classes da c++ em um programa c e printf em um programa c++, mas é prática ruim.

A stl já possui todas as estruturas de dados necessárias. Usar um apontador char* string é no mínimo andar para tráz quando se almeja escrever um programa em c++, já que se possui a classe std::string

[quote=jmmenezes][quote]
depende cara, ali só não compila em C por causa dos comandos cout e cin, só trocar por printf e scanf

se eu pegar um programa em C mudar apenas 1 printf por 1 cout, eu não posso chamar de c++, claro vou ter que salvar com .cpp etc… mas falando em poucos detalhes

o que eu considero(minha opinião) um programa minimo em C++, é que tenha 1 classe, essa classe possua métodos e atributos, e ela seja inicializada. sem uso de structs, ou qualquer método que ja tenha sido substituido por um novo na linguagem C++.
[/quote]

Ok… realmente é isso… mas indo por esta linha seria a mesma coisa que falar que um programa Java que só tenha uma unica classe com método Main, não é um programa Java.
Não faz sentido usar C++ para escrever algo assim… poderia usar C diretamente com printf, foi o que eu falei… se a Lista já existe pronta, ou não deveria ser feita assim já é outra história…

Realmente eu nunca usaria C++ para escrever algo assim, da mesma forma que dificilmente usaria Java para escrever um programa com uma unica classe e unico método Main.

Abs

[/quote]

A idéia é diferente. Usar a libc(escrever usando linguagem c) é útil quando você quer o mínimo de dependências do sistema(para escrever drivers, kernels ou programas extremamente pequenos). Se você compilar um programa em c usando a biblioteca stdio seu programa vai linkar no máximo com um 10kb. Essas bibliotecas são de médio nível e bem próximas do assembly. Por exemplo alocar um string é alocar um vetor de bytes(char tem 8 bits). Isso é bem próximo da máquina :

c++ é um set de alto nível e orientado a objetos, mas totalmente compatível com a linguagem c. Isso não quer dizer que sejam a mesma linguagem. Dizer “c/c++” é errado.

Amigo… eu sei de tudo isso que você ta falando… programo em C e C++ desde 1996…
Já criei alguns joguinhos em C também… os primeiros ainda na época do MS-DOS!!!
Tive um BBS em RemoteAccess e depois um em PCBoard… naquela época programava em PPLC também…
Da mesma forma que\ trabalhei com bastante C++ em Windows… também trabalhei com MFC… com ATL…

Dizer que C/C++ é errado quando se refere a apenas uma coisa OK, quando se refere a coisas separadamente não vejo problemas, por exemplo dizer que programa em C/C++/Java. Mas com certeza não existe a linguagem C/C++ existe a linguagem C e a linguagem C++, tanto que há compiladores diferentes em alguns casos (como no gcc, que tem também o g++);

Claro que não faz sentido usar c++ para ficar usando funções de C … sua explicação esta corretissima!
Como falei… boas praticas devem sim ser aplicadas… mas no momento que tenho um código por mais lixo que seja e ele precisa compilar em C++ não deixa de ser C++… por mais tosco que seja, tendo apenas um cout…

Foi como falei… um programa todo tosco em Java, não deixa de ser Java, mesmo que seja todo feito 100% em JSP onde somente trocar os comandos pelos do ASP ou PHP seja suficiente para rodar em outra tecnologia (e olha que já vi migrações assim, tanto de php para jsp, qto asp para jsp, com inclusive o acesso ao banco de dados dentro da jsp, simplesmente trocando a sintaxe do sistema antigo).

Mas deixa pra la… vamos ajudar o pessoal com outras dúvidas… seus comentários agregaram bastante para quem mais ler o fórum!

ABS

PS: Há casos onde char NÃO TEM 8 BITS!!! Mas geralmente são em hardwares bem especificos…

[quote=jmmenezes]Amigo… eu sei de tudo isso que você ta falando… programo em C e C++ desde 1996…
Já criei alguns joguinhos em C também… os primeiros ainda na época do MS-DOS!!!
Tive um BBS em RemoteAccess e depois um em PCBoard… naquela época programava em PPLC também…
Da mesma forma que\ trabalhei com bastante C++ em Windows… também trabalhei com MFC… com ATL…

Dizer que C/C++ é errado quando se refere a apenas uma coisa OK, quando se refere a coisas separadamente não vejo problemas, por exemplo dizer que programa em C/C++/Java. Mas com certeza não existe a linguagem C/C++ existe a linguagem C e a linguagem C++, tanto que há compiladores diferentes em alguns casos (como no gcc, que tem também o g++);

Claro que não faz sentido usar c++ para ficar usando funções de C … sua explicação esta corretissima!
Como falei… boas praticas devem sim ser aplicadas… mas no momento que tenho um código por mais lixo que seja e ele precisa compilar em C++ não deixa de ser C++… por mais tosco que seja, tendo apenas um cout…

Foi como falei… um programa todo tosco em Java, não deixa de ser Java, mesmo que seja todo feito 100% em JSP onde somente trocar os comandos pelos do ASP ou PHP seja suficiente para rodar em outra tecnologia (e olha que já vi migrações assim, tanto de php para jsp, qto asp para jsp, com inclusive o acesso ao banco de dados dentro da jsp, simplesmente trocando a sintaxe do sistema antigo).

Mas deixa pra la… vamos ajudar o pessoal com outras dúvidas… seus comentários agregaram bastante para quem mais ler o fórum!

ABS

PS: Há casos onde char NÃO TEM 8 BITS!!! Mas geralmente são em hardwares bem especificos…
[/quote]

jmmenezes, me desculpe se eu dei a entender que duvidava do seu conhecimento. Não é isso não.

eu ainda reforço o que eu disse que c++ é uma coisa e c é outra, embora o g++ seja completamente compatível com a linguagem c(se misturar não há problema). O c++ tem uma quantidade enorme de práticas que devem ser seguidas, inclusive essas práticas já se modificaram novamente com a inclusão do c++11 no final do ano passado. c++11 é uma linguagem tão moderna como c#. Por exemplo, incluíram na sintaxe a palavra chave auto e funções lambda.

No caso do char:
O tipo char só iria mudar em compiladores que não seguem a especificação ansi. Eu nunca vi em “c”, mas o do java tem 16 para suportar a codificação utf8, assim como outros tipos do c++ como widechar, etc.

Ok… sem crise… com certeza C++ é uma coisa e C é outra… e reforço novamente também que boas praticas devem sempre ser seguidas… no caso do programa dele era só o cout mesmo… mas enfim, ser uma tecnologia não é depender exclusivamente de boas praticas, essa é minha opnião… o fato de compilar num e não funcionar no outro mesmo que seja um cout… mas enfim… não sei até que ponto também estou totalmente certo… (será que um caminhão com motor de carro pode ser chamado de caminhão) ?

eu to um pouco longe de programação c++ desde 2008, quando o ultimo programa que fiz foi um instalador de certificados digitais nos navegadores IE e Firefox em ambiente windows. Desde então somente fiz coisas pequenas para uso pessoal em casa. Fazem 4 anos que venho atuando somente com Java (embore tenha começado com java em 99 fiquei um bom tempo longe de java). E de 2 anos para cá confesso que tenho programado muito pouco… voltei a programar forte nos ultimos 3 meses, por falta de recursos na equipe então to “pegando no tranco” novamente.

ABS

No caso do C++, eu concordo com o Julio. O que ele fez é C, e não C++.
A evolução dos últimos 10 anos na linguagem se deu nas práticas de programação, e na STL, não tanto na presença/ausência de comandos ou na estrutura sintática.

Se hoje em dia você não tem idéia do que seja RAII, nem use os recursos que a linguagem oferece, você não está programando em C++.
No caso do Java, também dizemos que fazer tudo no main, e usar todos os métodos static não é programar exatamente em Java.

Mas entendo seu ponto de vista e concordo com você que é uma definição subjetiva. Se o cara pegar uma ferrari esportiva, mas dirigir a 40km/h sem passar nunca da terceira marcha, estará ele pode sair aos quatro ventos dizendo que sabe o que é pilotar uma Ferrari?

Eu sou da opinião que não. :slight_smile:

Ok… Concordo…
acho que o mais certo a dizer então é:
Ele não esta programando em C++ embora esteja criando um programa com C++
Ou… ele não esta programando em Java embora esteja criando um programa que precisa da máquina Java para rodar…

Ta bom vou concordar com vocês… acho que minha opnião levava muito em conta o resultado final e não o código fonte.
Acho que realmente é importante separar a forma de programação que deve ser utilizada na tecnologia do “resultado final”…

mas que isso é muito subjetivo com certeza é…

[quote=jmmenezes][quote]
jmmenezes, me desculpe se eu dei a entender que duvidava do seu conhecimento. Não é isso não.

eu ainda reforço o que eu disse que c++ é uma coisa e c é outra, embora o g++ seja completamente compatível com a linguagem c(se misturar não há problema). O c++ tem uma quantidade enorme de práticas que devem ser seguidas, inclusive essas práticas já se modificaram novamente com a inclusão do c++11 no final do ano passado. c++11 é uma linguagem tão moderna como c#. Por exemplo, incluíram na sintaxe a palavra chave auto e funções lambda.

No caso do char:
O tipo char só iria mudar em compiladores que não seguem a especificação ansi. Eu nunca vi em “c”, mas o do java tem 16 para suportar a codificação utf8, assim como outros tipos do c++ como widechar, etc.
[/quote]

Ok… sem crise… com certeza C++ é uma coisa e C é outra… e reforço novamente também que boas praticas devem sempre ser seguidas… no caso do programa dele era só o cout mesmo… mas enfim, ser uma tecnologia não é depender exclusivamente de boas praticas, essa é minha opnião… o fato de compilar num e não funcionar no outro mesmo que seja um cout… mas enfim… não sei até que ponto também estou totalmente certo… (será que um caminhão com motor de carro pode ser chamado de caminhão) ?

eu to um pouco longe de programação c++ desde 2008, quando o ultimo programa que fiz foi um instalador de certificados digitais nos navegadores IE e Firefox em ambiente windows. Desde então somente fiz coisas pequenas para uso pessoal em casa. Fazem 4 anos que venho atuando somente com Java (embore tenha começado com java em 99 fiquei um bom tempo longe de java). E de 2 anos para cá confesso que tenho programado muito pouco… voltei a programar forte nos ultimos 3 meses, por falta de recursos na equipe então to “pegando no tranco” novamente.

ABS
[/quote]

c++ hoje para mim é somente hobby. No meu profissional usam java para o alto nível e linguagem c para microcontroladores. Na minha casa existe um desktop linux com as ferramentas do qt instaladas, então implemento vários algoritmos(relacionados com ia e processamento de imagens) somente por gosto mesmo(adoro usar c++). O time da canonical adotou o qt como oficial para as aplicações do ubuntu(por ser multiplataforma também).

[quote=jmmenezes]Ok… Concordo…
acho que o mais certo a dizer então é:
Ele não esta programando em C++ embora esteja criando um programa com C++
Ou… ele não esta programando em Java embora esteja criando um programa que precisa da máquina Java para rodar…

Ta bom vou concordar com vocês… acho que minha opnião levava muito em conta o resultado final e não o código fonte.
Acho que realmente é importante separar a forma de programação que deve ser utilizada na tecnologia do “resultado final”…

mas que isso é muito subjetivo com certeza é…

[/quote]

Tanto é subjetivo que o compilador processa ambos os códigos. Eu só levei em conta a questão do código como estava escrito. O resultado final é igual para qualquer uma das duas.