Ir ao conteúdo
  • Cadastre-se

C++ O que é "Error ld returned 1 exit status"


Davi Lobo

Posts recomendados

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int maior (int v1, int v2, int v3){

	if ((v1>v2) &&(v1>v3))
		return (v1);
	else if((v2>v1)&&(v2>v3))
		return (v2);
	else
	return (v3);		
}
int main() {
	int v1, v2, v3;
printf("informe o valor das notas");
scanf("%d", &v1);
scanf("%d", &v2);
scanf("%d", &v3);
printf("%d", aior (v1, v2, v3));

	return 0;
}

Please help me !!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Davi Lobo.

 

Só complementando. Segue sugestões/dicas:

 

1) INDENTAÇÃO DE CÓDIGO

Sempre mantenha o código indentando. Pelo as experiências e feedbacks que tive, a melhor sugestão seria desativar a tabulação, ou seja, ao pressionar tab, fazer o "editor de texto" inserir espaços... Abaixo, para exemplo, segue código reindentando.

#include <stdio.h>
#include <stdlib.h>

int maior (int v1, int v2, int v3) {
    if ((v1>v2) &&(v1>v3))
        return (v1);
    else if ((v2>v1)&&(v2>v3))
        return (v2);
    else
        return (v3);		
}

int main() {
    int v1, v2, v3;
    printf("informe o valor das notas");
    scanf("%d", &v1);
    scanf("%d", &v2);
    scanf("%d", &v3);
    printf("%d", maior(v1, v2, v3));
    return 0;
}

Perceba a diferença no alinhamento. Dessa forma, já visualmente dá para entender a estrutura do algoritmo.

 

Uma técnica muito comum também é deixar, em alguns casos, instruções na mesma linha, ex.:

int maior (int v1, int v2, int v3) {
    if ((v1>v2) &&(v1>v3))     return (v1);
    else if ((v2>v1)&&(v2>v3)) return (v2);
    else                       return (v3);		
}

 

 

 

2) SOBRE O ERRO CITADO

Em 19/03/2018 às 14:47, Davi Lobo disse:

O que é "Error ld returned 1 exit status"

Tente inicialmente analisar os erros apresentados no console, geralmente aponta as linhas.

 

Ao compilar seu código, deu o seguinte erro:

...Untitled1.cpp In function 'int main()':
21 30 ...Untitled1.cpp [Error] 'aior' was not declared in this scope

Ou seja, na linha 21, coluna 30, o "aior" não foi declarada neste escopo, ou seja, o compilador não sabe o que é isso. Analisando o contexto, observaria o o citado por @Math.Pi. O correto seria "maior".

 

 

 

3) INTERAÇÃO COM O USUÁRIO

Seria interessante ajustar essas mensagens na tela. Por exemplo, ao digitar a primeira nota, o número está ficando colando a palavra "notas"... ou daria um espaço, ou desceria uma linha.

 

Na hora de exibir o maior, também seria interessante indicar o que é aquele número que surgiu... algo como... "Maior número: XX". Etc.

 

 

***

 

No aguardo.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Então, atualmente o código poderia ficar assim:

#include <stdio.h>
#include <stdlib.h>

int maior(int v1, int v2, int v3) {
    return (v1 > v2 && v1 > v3) ? v1 : (v2 > v1 && v2 > v3) ? v2 : v3;
}

int main() {
    int v1, v2, v3;
    printf("informe o valor das notas: \n");
    scanf("%d", &v1);
    scanf("%d", &v2);
    scanf("%d", &v3);
    printf("%d", maior(v1, v2, v3));
    return 0;
}

 

Como a base dessa alternativa dada @cyer foi baseada no código anterior, está com um mesmo probleminha.., ou seja, para alguns casos o programa não está funcionando.

 

Para ver isso, a sugestão é fazer um "teste de mesa" com todas as possibilidades... mas para adiantar, já informo que a falha está quando usar "dois números iguais e maiores para os dois primeiros". Ex.

 

tela.jpg

Deveria dar 5!

 

@Davi Lobo, o filho é teu!

 

PS: por favor, após corrigir, poste seu o código completo para analisarmos.

 

 

No aguardo.

  • Curtir 1
  • Confuso 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas não tinha percebido esse erro, código com o erro corrigido:

#include <stdio.h>
#include <Windows.h>

int maior(int v1, int v2, int v3) 
{
    return (v1 >= v2 && v1 > v3) ? v1 : (v2 > v1 && v2 > v3) ? v2 : v3;
}

int main()
{
    int v1, v2, v3;
    printf("informe o valor das notas: \n");
    scanf("%d", &v1);
    scanf("%d", &v2);
    scanf("%d", &v3);
    printf("%d\n", maior(v1, v2, v3));

    system("pause");
    return 0;
}

 

Saída primeiro teste:

informe o valor das notas:
5
5
3
5
Pressione qualquer tecla para continuar. . .

 

Saída segundo teste:

informe o valor das notas:
5
7
7
7

 

Saída terceiro teste:

informe o valor das notas:
7
8
9
9
Pressione qualquer tecla para continuar. . .

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Citação

Albert Einstein: Tudo deve ser feito tão simples quanto possível ...

 

 

Caras... Se não é prescrito que a função deve ter 3x Parâmetros, então use 2x Parâmetros.

Na dica de @cyer  Temos também.

inline int Maior_de_( int x, int y )
	{  return( x > y? x:y );  }

 

Para saber o maior de 3:

int Maior_de_3_( int x, int y, int z )
	{  return( Maior_de_( x, Maior_de_( y, z ) );  }

 

Para saber o maior de 4:

int Maior_de_4_( int x, int y, int z, int gama )
	{  return( Maior_de_( x, Maior_de_3_( y, z, gama ) );  }

 

Pata saber o maior de 5:

...

Por tanto:

#include<stdio.h> /*!< Incluir as rotinas que fazem Entra e Saída (E/S). */
inline maior( int x, int y) { return( x > y? x:y ); }
int main( void ){
   int v1, v2, v3;
   printf("informe o valor das notas: \n");
    scanf( "%d", &v1 );
    scanf( "%d", &v2 );
    scanf( "%d", &v3 );
   printf( "%d\n", maior( v1, maior( v2, v3 )));
  return( 0x0 );
  }

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

2 horas atrás, Mauro Britivaldo disse:

printf( "%d\n", maior( v1, maior( v2, v3 )));

Interessante essa lógica...

 

 

Pelo que eu entendi dela, invocaria assim:

printf( "%d\n", maior(maior(v1,v2),v3));

Tem o mesmo resultado, apenas que imagino que faz mais sentido ir comparando da esquerda para direita... rs

 

 

 

 

Sobre:

2 horas atrás, Mauro Britivaldo disse:

inline maior( int x, int y) { return( x > y? x:y ); }

 

Não conhecia esse tal de inline... parece interessante, mas acho que não tem utilidade para o contexto... (tirando a questão didática, é claro :)).

 

 

mas o "correto" não seria assim?

inline int maior( int x, int y) { return( x > y? x:y ); }

 

Tá! Pelo que vi, o C++ aceita não definir o retorno.. O seu código seria análogo a:

maior( int x, int y) { return( x > y? x:y ); }

Apenas que no caso "aproveitando" do recurso do inline, correto?

 

Mas porque não definir o retorno funciona? tem alguma diferença ou consequência  em não definir?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 horas atrás, Simon Viegas disse:

aceita não definir o retorno

Quais são as chances para declaração return?

/*!< Você acha que vai retorna o que? int ou long long double :p rsrs
return( x > y? x:y ); 

Quando não explicito o tipo por padrão é int.

 

 

6 horas atrás, Simon Viegas disse:

Tem o mesmo resultado, apenas que imagino que faz mais sentido ir comparando da esquerda para direita... rs

 

6 horas atrás, Simon Viegas disse:

mas o "correto" não seria assim?

printf( "%d\n", maior(maior(v1,v2),v3));

( que um :tw_cookie:).

Se não tem influência na rapidez de execução então é refinamento. Mais ficou bonitinho :3

Já se é correto ou ~correto é subjetivo.

 

 

 

6 horas atrás, Simon Viegas disse:

Não conhecia esse tal de inline... parece interessante, mas acho que não tem utilidade para o contexto...

inline faz para C++, o que os macros fazem para C ANSI no quesito função. No mesmo quesito  otimiza o código em tempo de compilação... assim sendo não preciso de licença para fazer otimização.E fiz assim porque "parecia a coisa certa a ser feita". 

 

 

 

~~ / ~~

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Mauro Britivaldo hoje em dia uso de funções inline é extremamente desnecessário, até porque o próprio compilador quando achar que é uma boa ideia deixar essa função como inline ele mesmo define ela como inline sem nem você colocar o inline, se o compilador achar que não compensa(não estou dizendo que nesse exemplo seu está errado ou algo do tipo) ele não deixa a função ser inlinearizada mesmo que você tenha colocado a inline(embora tenha como você forçar essa inlinearização usando a __forceinline em vez de inline), ele simplesmente ignora isso. Quando eu digo que é desnecessário é porque o custo de chamada de uma função é minimo, para o processador isso ai seria o mesmo de somar 1 + 0, para você ter uma ideia quando você faz uma chamada de função, o processador vai demorar menos de 1 milissegundo para chamar essa função. Nesse caso como é uma função extremamente pequena e simples o compilador automaticamente vai colocar o inline na frente embora você não consiga ver. A dica que eu do é que apenas deixe o compilador escolher se a função vai ser inline ou não pois é muito difícil um programador saber mais que o compilador quando é uma boa ideia uma função ser inlinearizada ou não. Nem mesmo na maioria das vezes um programador super experiente consegue saber mais que o compilador nesse quesito.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, cyer disse:

Nem mesmo na maioria das vezes um programador super experiente consegue saber mais que o compilador nesse quesito.

tá e daí! Eu preciso ser super experiente para converse quem, você é e um compilador! Me aprensente um Programador super experiente. Eu eu escuto o que ele tem a dizer. 

 

adicionado 2 minutos depois

O que fiz foi agregar eficiência, simplicidade e fluidez a um código que já é por si simples de mais.

Praticamente um milagre diante de tantas tentativas de fazer do fácil difícil.

adicionado 22 minutos depois
20 minutos atrás, cyer disse:

Quando eu digo que é desnecessário é porque o custo de chamada de uma função é minimo, para o processador isso ai seria o mesmo de somar 1 + 0,

Você não pode dizer isso para todos os controladores e chips do mundo apenas para processador do seu PC..

Link para o comentário
Compartilhar em outros sites

@Mauro Britivaldo Bom foi só uma dica, mas se você se ofendeu desculpe, não falei que você não é um programador super experiente ou que eu era, até porque não conheço você, não preciso apresentar para você um programador super experiente, falei apenas isso para alertar você pois como eu falei sobre o __forceinline achei uma boa ideia dar essa dica para evitar problemas no seu código caso você deseje um dia forçar essa otimização, posso lhe mostrar varias fontes falando sobre isso. Fora que eu não falei que quando você define uma função como inline vai aumentar o tamanho do executável mais do que devia(Acredito que você já deva saber disso) e também aumenta o tempo de compilação. Agora imagine o uso de inline em milhares de funções de um projeto extremamente grande, como um jogo por exemplo, imagine o tamanho enorme do executável do jogo ou do tempo que vai demorar para compilar esse projeto, tudo isso por causa de alguns milissegundos a menos.

 

https://pt.stackoverflow.com/questions/110886/qual-é-a-finalidade-do-uso-de-funções-inline-na-linguagem-c

Leia as partes abaixo:  

"O compilador costuma ser muito esperto quanto a isto. É raro o programador saber quando fazer inline melhor que o compilador sabe."

 

"Se o programador forçar onde não deve, não só pode perder performance, principalmente por encher o cache mais facilmente, como também pode ter alguns problemas nem sempre fáceis de perceber."

 

Link em inglês:

https://stackoverflow.com/questions/151919/when-should-i-use-forceinline-instead-of-inline

 

Esse link é apenas um tópico da Microsoft falando um pouco mais sobre funções embutidas:

https://msdn.microsoft.com/pt-br/library/bw1hbe6y.aspx

 

Se você quiser mais, existe muito mais conteúdo na internet sobre isso(infelizmente a maioria é inglês) estou com preguiça de procurar outras fontes mas caso se interesse recomendo que olhe.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Não mudou nada, mesmo que inline seja feito pelo compilador , ou não ignorado pelo mesmo. A situação pede para tal otimização.

   

Poderia ter feito como pensara desdo do começo:

#define maior( x, y ) ((x) > (y)? (x):(y))

Resultado teria mesmo efeito de inline. Observe abaixo.

Compare os arquivos de ambos Os projetos, inclusive diga qual apresenta maior performance ou se são iguaizinhos.

inline.

	.file	"forum.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
LC0:
	.ascii "informe o valor das notas: \0"
LC1:
	.ascii "%d\0"
LC2:
	.ascii "%d\12\0"
	.section	.text.unlikely,"x"
LCOLDB3:
	.section	.text.startup,"x"
LHOTB3:
	.p2align 4,,15
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	andl	$-16, %esp
	subl	$32, %esp
	call	___main
	movl	$LC0, (%esp)
	call	_puts
	leal	20(%esp), %eax
	movl	$LC1, (%esp)
	movl	%eax, 4(%esp)
	call	_scanf
	leal	24(%esp), %eax
	movl	$LC1, (%esp)
	movl	%eax, 4(%esp)
	call	_scanf
	leal	28(%esp), %eax
	movl	$LC1, (%esp)
	movl	%eax, 4(%esp)
	call	_scanf
	movl	28(%esp), %eax
	cmpl	%eax, 24(%esp)
	cmovge	24(%esp), %eax
	movl	20(%esp), %edx
	movl	$LC2, (%esp)
	cmpl	%edx, %eax
	cmovl	%edx, %eax
	movl	%eax, 4(%esp)
	call	_printf
	xorl	%eax, %eax
	leave
	ret
	.section	.text.unlikely,"x"
LCOLDE3:
	.section	.text.startup,"x"
LHOTE3:
	.ident	"GCC: (tdm-1) 4.9.2"
	.def	_puts;	.scl	2;	.type	32;	.endef
	.def	_scanf;	.scl	2;	.type	32;	.endef
	.def	_printf;	.scl	2;	.type	32;	.endef

~inline

	.file	"forum.c"
	.section	.text.unlikely,"x"
LCOLDB0:
	.text
LHOTB0:
	.p2align 4,,15
	.globl	_maior
	.def	_maior;	.scl	2;	.type	32;	.endef
_maior:
	movl	4(%esp), %edx
	movl	8(%esp), %eax
	cmpl	%edx, %eax
	cmovl	%edx, %eax
	ret
	.section	.text.unlikely,"x"
LCOLDE0:
	.text
LHOTE0:
	.def	___main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
LC1:
	.ascii "informe o valor das notas: \0"
LC2:
	.ascii "%d\0"
LC3:
	.ascii "%f\12\0"
	.section	.text.unlikely,"x"
LCOLDB4:
	.section	.text.startup,"x"
LHOTB4:
	.p2align 4,,15
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	andl	$-16, %esp
	subl	$32, %esp
	call	___main
	movl	$LC1, (%esp)
	call	_puts
	leal	20(%esp), %eax
	movl	$LC2, (%esp)
	movl	%eax, 4(%esp)
	call	_scanf
	leal	24(%esp), %eax
	movl	$LC2, (%esp)
	movl	%eax, 4(%esp)
	call	_scanf
	leal	28(%esp), %eax
	movl	$LC2, (%esp)
	movl	%eax, 4(%esp)
	call	_scanf
	movl	28(%esp), %eax
	cmpl	%eax, 24(%esp)
	cmovge	24(%esp), %eax
	movl	20(%esp), %edx
	movl	$LC3, (%esp)
	cmpl	%edx, %eax
	cmovl	%edx, %eax
	movl	%eax, 4(%esp)
	call	_printf
	xorl	%eax, %eax
	leave
	ret
	.section	.text.unlikely,"x"
LCOLDE4:
	.section	.text.startup,"x"
LHOTE4:
	.ident	"GCC: (tdm-1) 4.9.2"
	.def	_puts;	.scl	2;	.type	32;	.endef
	.def	_scanf;	.scl	2;	.type	32;	.endef
	.def	_printf;	.scl	2;	.type	32;	.endef

 

 

São diferentes, porém o tempo das tarefas são iguais, no mínimo não a perdas.

 

~~ / ~~

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Davi Lobo disse:

Return (v1 >= v2 && v1 > v3) ? v1 : (v2 > v1 && v2 > v3) ? v2 : v3

O que esse "?", corresponde ?

 

É uma interrogação. 

Você vai usar assim:

int main() {
	int v1, v2, v3;
printf("informe o valor das notas");
scanf("%d", &v1);
scanf("%d", &v2);
scanf("%d", &v3);
printf("%d", ?aior (v1, v2, v3));

:tw_grin::tw_heart:

Link para o comentário
Compartilhar em outros sites

@Mauro Britivaldo realmente o código assembly vai ser igual tanto usando inline como macros pois ambos fazem basicamente a mesma coisa, ambos vão apenas substituir a chamada pelo código ((x) > (y)? (x):(y)), então com certeza vai ser igual(pode até mudar um pouco como foi esse caso, mas não vai ter grande diferenças assim, tanto no código como no resultado)

Link para o comentário
Compartilhar em outros sites

@Davi Lobo inline é uma palavra chave para dar a dica do compilador para sempre que a função for chamada substituir a chamada(call) pelo código de dentro da função. Com isso você evitaria o custo de chamada de uma função(embora minimo) podendo ganhar mais desempenho na sua aplicação.


Exemplo(sem inline):

void Ola()
{
    printf("Ola!\n");
}

int main()
{
    // Iria demorar cerca de ~ 1 millisegundo para chamar essa função sem inline, obvio que depende do processador, alguns mais lento seria aproximadamente entre 2 ou 3 millisegundos
    Ola();        
    return 0;
}


Exemplo(com inline):

inline void Ola()
{
    printf("Ola!\n");
}

int main()
{
    // Não vai demorar nenhum milisegundo para chamar essa função, pois quando ela é uma função inline, o compilador em tempo de compilação, simplesmente troca o Ola() pelo código de dentro da função(printf("Ola!\n"))
    Ola(); // Seria a mesma coisa de apenas escrever: printf("Ola!\n");
    return 0;
}

 

Tudo na computação não é apenas de ganhos, sempre vai ter perdas, nesse caso você vai ganhar desempenho, mas vai aumentar o tamanho do arquivo(obvio que vai depender de quantas vezes a função Ola for chamada no seu projeto e de quantas linhas tem essa função), e vai demorar mais tempo para compilar o seu projeto(em projetos pequenos isso não faz muita diferença, agora em projetos grandes, já vi casos que demorava cerca de 20 minutos para compilar o projeto inteiro, obvio que não era apenas por conta dos inlines mas sim por conta do grande número de códigos que tinha no projeto e de funções).

 

Links falando mais sobre funções inlines(de forma mais completa e melhor explicado):

http://www.tiexpert.net/programacao/c/funcoes-inline.php

https://pt.stackoverflow.com/questions/110886/qual-é-a-finalidade-do-uso-de-funções-inline-na-linguagem-c

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@cyer,

 

Resumindo:

 

Isso:

13 horas atrás, cyer disse:

inline void Ola() {
    printf("Ola!\n");
}

int main() {
    Ola();
    return 0;
}

 

 

É exatamente igual a isso:

int main() {
    printf("Ola!\n");
    return 0;
}

 

Ou seja, só muda a interface para o programador... usando o inline, você consegue separar o trecho do código. É mais fácil para organizar e fica mais elegante, mas ao compilar, o compilador faz a reestruturação.

 

Correto @cyer e @Mauro Britivaldo ?

 

Se for isso, o código do aplicativo é exatamente igual mesmo, ou tem alguma diferença?

 

 

 

@Davi Lobo, só para frisar: esse comando inline não faz a menor diferença para o seu contexto!!! É apenas um recurso relacionado ao DESEMPENHO! Não tem nada a ver com a lógica!!!

 

obs.: em relação as algumas postagens mais recentes, eu as ocultei pois se tratava de um novo problema. Aqui, a orientação é só tratar do algoritmo maior e sobre esse tema relacionado que surgiu do inline. Caso contrário, vai acabar misturando os conceitos, já que no seu novo código, está utilizando uma lógica diferente e precisa de uma atenção específica.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

 

1 hora atrás, Simon Viegas disse:

Ou seja, só muda a interface para o programador... usando o inline, você consegue separar o trecho do código. É mais fácil para organizar e fica mais elegante, mas ao compilar, o compilador faz a reestruturação.

É isso aí. A Chamada heurística faz o exame é dar o veredito, assim é mais seguro que #define no contexto mais global.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, Simon Viegas disse:

@cyer,

 

Resumindo:

 

Isso:

 

É exatamente igual a isso:


int main() {
    printf("Ola!\n");
    return 0;
}

 

Ou seja, só muda a interface para o programador... usando o inline, você consegue separar o trecho do código. É mais fácil para organizar e fica mais elegante, mas ao compilar, o compilador faz a reestruturação.

 

Correto @cyer e @Mauro Britivaldo ?

 

Se for isso, o código do aplicativo é exatamente igual mesmo, ou tem alguma diferença?

 

 

 

@Davi Lobo, só para frisar: esse comando inline não faz a menor diferença para o seu contexto!!! É apenas um recurso relacionado ao DESEMPENHO! Não tem nada a ver com a lógica!!!

 

obs.: em relação as algumas postagens mais recentes, eu as ocultei pois se tratava de um novo problema. Aqui, a orientação é só tratar do algoritmo maior e sobre esse tema relacionado que surgiu do inline. Caso contrário, vai acabar misturando os conceitos, já que no seu novo código, está utilizando uma lógica diferente e precisa de uma atenção específica.

 

Exatamente, apenas troca a chamada da função pelo código que está dentro da função(embora você não consiga ver isso no compilador), se você for olhar o código gerado pelo compilador, vai ver que não existe a chamada para tal função, mas sim o código que fica dentro da função que está inline. 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...