Jump to content

[OSX + GCC] Programa super básico crasha.


Palmeira
 Share

Recommended Posts

Boas, tava por aqui a fazer umas brincadeiras no meu hackintosh, e resolvi experimentar codificar em C uma solução para o problema :

 

  -> Ordene um vector de N inteiros. O programa de ler o valor N do utilizador, ler os respectivos N valores para o vector, e de seguida apresentá-los de forma ordenada.

#include <stdio.h>

int main() {
    
    int n,i;
    int vec[n];
    
    printf("Escreva o numero de posicoes do array vec: "); scanf("%d", &n);
    i=0;
    if (n==0) {
        printf("Erro, o array nao possui posicoes");
    } else {
            do {
                printf("Escreva um valor: "); scanf("%d", &vec[i]);
                i++;
            } while (i!=n);
     for (i=0; i<=n; i++) {
        printf("%d \t", vec[i]);
     }
    }
}
o output é este:
Citação
new-host:C Rui$ gcc -o revisoes revisoes.c

new-host:C Rui$ ./revisoes

Escreva o numero de posicoes do array vec: 10

Escreva um valor: 1

Escreva um valor: 2

Escreva um valor: 3

Escreva um valor: 5

Escreva um valor: 4

Escreva um valor: 256

Escreva um valor: 51

Escreva um valor: 50

Escreva um valor: 515

Escreva um valor: 5416

Escreva um valor: 51651

Escreva um valor: 51

61

561469191

^C

^C

^C

Bus error

no entanto, se definir o vector apenas com 2 posições, o output é este:

Citação
new-host:C Rui$ ./revisoes

Escreva o numero de posicoes do array vec: 2

Escreva um valor: 20

Escreva um valor: 30

20 30 -1073742920 new-host:C Rui

?

para escrever o código tou a usar o Smultron, um programa free, com syntax highlight, etc e para compilar o GCC...

alguém me pode dizer pq tou a ter este problema/erro?? sei que dá para resolver o problema usando apontadores, mas não quis complicar muito, e resolvi usar a solução em cima.

PS : o fórum deixou de suportar 2 quotes seguidos ? :|

Link to comment
Share on other sites

Não podes alocar um vector com N posições durante a execução como estás a fazer. Para o fazeres tens de usar memória dinâmica, ou então definines o número máximo de elementos do vector e sempre esse valor.

PS: não estás a ordenar os valores.

XX SINFO - Semana Informática

Link to comment
Share on other sites

O que o Diutsu disse. A linha com erro é "int vec[n];" - visto que 'n' não está definido nessa altura.

Já agora, falta-te o return da main. Usa o argumento -Wall do GCC que te dá mais avisos.

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

@Diutsu a ordenação aqui é secundária, porque eu se não consigo sequer resolver isto sem pointers, a ordenação só iria ofuscar o erro que foi cometido.

experimentei uma coisa do género, mas com nº de posições do array fixas. continua a ser estranho o output do programa no terminal do OSX :|

#include <stdio.h>
int main () {
   int array[10], i,j,c;
   printf("Programa que recebe 10 valores do user, insere em array e ordena por ordem crescente este mesmo array\n\n\n");
   for(i=0;i<=10;i++) {
        printf("Introduza um valor"); scanf("%d", &array[i]);
   }
   for (i=0;i<10;i++) {
        for (j=0;j<10;j++) {
            
            if (array[i]<array[j]) {
                c = array[j];
                array[j]=array[i];
                array[i]=c;
            }
        }
   }
   
   for (i=0;i<10;i++) {
        printf("| %d | \t", array[i]);
   }
} 

Output correcto

--

new-host:C Rui$ ./testeA

Programa que recebe 10 valores do user, insere em array e ordena por ordem crescente este mesmo array

Introduza um valor10

Introduza um valor9

Introduza um valor8

Introduza um valor7

Introduza um valor6

Introduza um valor5

Introduza um valor4

Introduza um valor3

Introduza um valor2

Introduza um valor1

Introduza um valor10

| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 |

--

Output Estranho/Incorrecto

--

new-host:C Rui$ ./testeA

Programa que recebe 10 valores do user, insere em array e ordena por ordem crescente este mesmo array

Introduza um valor10

Introduza um valor9

Introduza um valor8

Introduza um valor7

Introduza um valor6

Introduza um valor5

Introduza um valor4

Introduza um valor3

Introduza um valor2

Introduza um valor1

Introduza um valor3

Introduza um valor10

Introduza um valor20

Introduza um valor30

Introduza um valor40

Introduza um valors

Introduza um valorIntroduza um valor| 1 | | 2 | | 7 | | 8 | | 9 | | 10 | | 10 | | 20 | | 30 | | 40 |

-----

Se repararem no primeiro, termino a inserção de valores com um valor igual ao 1º introduzido, mas o programa não deveria terminar aquando da introdução do 10º valor ?

Será mesmo o OSX que é fraquinho para estas coisas ? eu não uso isto para mais do que meras brincadeiras, e sei que os comandos do gcc são iguais para outros SO's Unix Based, mas se inclui a porra do GCC, porque é que o comportamento do programa depois de compilado é tão estranho em comparação com outros sistemas ?

Obrigado pelo feedback 😁

Edit : testei o 1º código outra vez,  e fiquei com sérias dúvidas se aquilo que fiz é de todo incorrecto. para valores de N<10, o programa recebe os valores, passa-os para o array e imprime-os como desejado. no entanto se o array for > 10 o programa retorna "Bus Error" e não faz nada  :wallbash:

Link to comment
Share on other sites

O elo mais fraco, geralmente é o programador.

Ou o erro entre o monitor e a cadeira... LOL

como foi dito, retira o "="  daqui:

for(i=0;i<=10;i++)

O que acho estranho é que não utilizaste o '=' para ordenar o vector. Foi lapso?

Será mesmo o OSX que é fraquinho para estas coisas ?

Se fosse fraquinho para fazer uns printfs e ordenar vectores, certamente que não fazia muitas das outras coisas que faz sem problemas, não achas?

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

O que vocês estão a dizer está errado. Desde o C99 que existem os VLA que permitem definir o tamanho de um array em tempo de execução. Tem é de se compilar com a flag -std=c99.

Ops, por acaso não tinha percebido que era isso que o Diutsu estava a dizer. O que eu queria dizer é que o 'n' não tinha valor naquela altura de execução - ele teria que mudar o scanf() para antes da alocação do array.

❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Link to comment
Share on other sites

O que vocês estão a dizer está errado. Desde o C99 que existem os VLA que permitem definir o tamanho de um array em tempo de execução. Tem é de se compilar com a flag -std=c99.

Devia de saber isso na altura que o meu professor deu memória dinâmica 🙂

Eu utilizaria memória dinâmica para este exercício.

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

não sei porque é que vocês se espumam todos por ter um <= em vez de um < ... tá errado tudo bem, fazer pouco disso, é mesmo de canalhada de secundário.

obrigado pelas correcções e opiniões construtivas que foram surgindo entretanto.

edit: @bubulindo não copiei o código se é isso que estás a sugerir 🙂 estou a aprender, mas não sou tão burro quanto isso

Link to comment
Share on other sites

não sei porque é que vocês se espumam todos por ter um <= em vez de um < ... tá errado tudo bem, fazer pouco disso, é mesmo de canalhada de secundário.

obrigado pelas correcções e opiniões construtivas que foram surgindo entretanto.

edit: @bubulindo não copiei o código se é isso que estás a sugerir 🙂 estou a aprender, mas não sou tão burro quanto isso

Não vi aqui ninguém a se espumar por teres-te enganado com o <= em vez de <. É perfeitamente normal haverem erros destes para quem está a começar.

XX SINFO - Semana Informática

Link to comment
Share on other sites

não sei porque é que vocês se espumam todos por ter um <= em vez de um < ... tá errado tudo bem, fazer pouco disso, é mesmo de canalhada de secundário.

obrigado pelas correcções e opiniões construtivas que foram surgindo entretanto.

edit: @bubulindo não copiei o código se é isso que estás a sugerir 🙂 estou a aprender, mas não sou tão burro quanto isso

Mas eu por acaso insultei-te?

Indiquei-te o erro, sugeri uma possibilidade de correcção. Podia ter sugerido umas quantas mais.

Apenas achei estranho teres feito correctamente em dois ciclos posteriores e não teres reparado naquele.

Conheces-me? Por acaso sugeri que o código tinha sido copiado? Se pensasse que o código tinha sido copiado nem sequer o lia para reparar que apenas te enganaste num ciclo for.

Se não sabes aceitar críticas ou conselhos num fórum público e assumes logo que te estão a perseguir ou insultar, mais vale não te dares ao trabalho. E ainda assim não percebo onde é que eu disse algo que te pudesse insultar tanto. Importas-te de explicar?

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.