alphasil Posted November 7, 2011 at 07:26 PM Report #419289 Posted November 7, 2011 at 07:26 PM Olá ppl; Estou a fazer um programa que deve trabalhar com arrays mas está me sempre a dar erros estranhos, não percebo. /* * main.c * * Created on: 7 de Nov de 2011 * Author: Gil */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char nomes[6] = {"Gil", "Ana", "Joao", "Gregorio", "Bianca", "Violeta" }; int idade[6] = { 10, 9, 8, 7, 6, 13 }; int telefone[6] = { 916892321, 916892322, 916892324, 916892353, 914567821, 9178654321 }; int op; printf("Escolha uma das seguintes opções.\n"); printf("1 - Ler dados de uma pessoa.\n"); printf("2 - Calcular média de idades.\n"); printf("3 - Listar todas as pessoas.\n"); printf("4 - Mostar o nome da pessoa mais nova.\n"); printf("5 - Listar dados das 3 pessoas mais velhas.\n"); scanf("%d", &op); switch (op) { case 1: printf("Insira o nome desejado\n", nomes); break; case 2: printf("A média é:", idade); break; case 3: printf("A listagem dos nomes é a seguinte: \n", telefone); break; case '4': printf("A pessoa mais nova é: \n", idade); break; case 5: printf("Listagem dos 3 mais velhos", nomes); break; } system("pause"); return 0; } Os erros são esses **** Build of configuration Debug for project trabalho **** **** Internal Builder is used for build **** gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o ..\main.c ..\main.c: In function 'main': ..\main.c:12:2: error: excess elements in char array initializer ..\main.c:12:2: error: (near initialization for 'nomes') ..\main.c:12:2: error: excess elements in char array initializer ..\main.c:12:2: error: (near initialization for 'nomes') ..\main.c:12:2: error: excess elements in char array initializer ..\main.c:12:2: error: (near initialization for 'nomes') ..\main.c:12:2: error: excess elements in char array initializer ..\main.c:12:2: error: (near initialization for 'nomes') ..\main.c:12:2: error: excess elements in char array initializer ..\main.c:12:2: error: (near initialization for 'nomes') ..\main.c:12:18: warning: initializer-string for array of chars is too long ..\main.c:14:2: warning: overflow in implicit constant conversion ..\main.c:26:3: warning: too many arguments for format ..\main.c:29:3: warning: too many arguments for format ..\main.c:32:3: warning: too many arguments for format ..\main.c:35:3: warning: too many arguments for format ..\main.c:38:3: warning: too many arguments for format Build error occurred, build is stopped Time consumed: 583 ms. Alguma dica? Obrigado gmc11
HappyHippyHippo Posted November 7, 2011 at 07:33 PM Report #419296 Posted November 7, 2011 at 07:33 PM primeiro erro : char nomes[6] = {"Gil", "Ana", "Joao", "Gregorio", "Bianca", "Violeta" }; estas a declarar um array de caracteres e não um array de "strings", deverias ter algo como: char * nomes[6] = {"Gil", "Ana", "Joao", "Gregorio", "Bianca", "Violeta" }; segundo: printf("Insira o nome desejado\n", nomes); nos printf's tens de dizer o que queres escrever e onde. para apresentares a lista de nomes terás de fazer um ciclo para cada nome ou tudo numa linha: printf("Insira o nome desejado\n", nomes); for(i = 0; i < 6; i++) printf("\t%s\n", nomes[i]); também tens de alterar os outros printf's para apresentar os valores printf("A média é: %d", idade); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted November 7, 2011 at 07:47 PM Author Report #419307 Posted November 7, 2011 at 07:47 PM Oi Obrigado pela ajuda mas continuo com problemas /* * main.c * * Created on: 7 de Nov de 2011 * Author: Gil */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char * nomes[6] = {"Gil", "Ana", "Joao", "Gregorio", "Bianca", "Violeta" }; int idade[6] = { 10, 9, 8, 7, 6, 13 }; int tel[6] = { 916892321, 916892322, 916892324, 916892353, 914567821, 9178654321 }; int op, i; printf("Escolha uma das seguintes opções.\n"); printf("1 - Ler dados de uma pessoa.\n"); printf("2 - Calcular média de idades.\n"); printf("3 - Listar todas as pessoas.\n"); printf("4 - Mostar o nome da pessoa mais nova.\n"); printf("5 - Listar dados das 3 pessoas mais velhas.\n"); scanf("%d", &op); switch (op) { case 1: break; case 2: printf("Listagem dos numeros\n", nomes); for(i = 0; i < 6; i++) printf("\t[b]%d[/b]\n", idade[i]); break; case 3: printf("Listagem dos nomes\n", nomes); for(i = 0; i < 6; i++) printf("\t[b]%s[/b]\n", nomes[i]); break; case '4': break; case 5: break; } system("pause"); return 0; } Os erros: **** Build of configuration Debug for project trabalho **** **** Internal Builder is used for build **** gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o ..\main.c ..\main.c: In function 'main': ..\main.c:14:2: warning: overflow in implicit constant conversion - int tel[6] = { 916892321, 916892322, 916892324, 916892353, 914567821, 9178654321 }; ..\main.c:26:5: warning: too many arguments for format printf("Listagem dos telefones\n", tel); ..\main.c:31:3: warning: too many arguments for format printf("Listagem dos numeros\n", nomes); ..\main.c:36:6: warning: too many arguments for format printf("Listagem dos nomes\n", nomes); gcc -o trabalho.exe main.o c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: cannot open output file trabalho.exe: Permission denied collect2: ld returned 1 exit status Build error occurred, build is stopped Time consumed: 1594 ms. Estou perdido.... gmc11
HappyHippyHippo Posted November 7, 2011 at 07:52 PM Report #419311 Posted November 7, 2011 at 07:52 PM int tel[6] = { 916892321, 916892322, 916892324, 916892353, 914567821, 9178654321 }; lembra-te que os números inteiros têm um limite superior, tenta unsigned long long. todos os outros error dos printf's foi erro meu ... mau copy-paste : printf("Listagem dos numeros\n"); // removes o ", nomes" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pedrosorio Posted November 7, 2011 at 08:05 PM Report #419320 Posted November 7, 2011 at 08:05 PM Se calhar tens que começar a olhar para os nomes dos erros e tentar perceber o que se passa em vez de te limitares a copiar código. ..\main.c:14:2: warning: overflow in implicit constant conversion - int tel[6] = { 916892321, 916892322, 916892324, 916892353, 914567821, 9178654321 }; Um overflow ocorre quando tentas guardar numa variável numérica um valor superior à sua capacidade. Se estiveres a compilar esse código num computador pessoal um int terá 32bit, como se trata de um signed int, o valor máximo que lá podes colocar é 2^31 - 1 = 2 147 483 647. Este é maior do que qualquer número de telemóvel, mas como te enganaste e escreveste o último número do array com 10 algarismos, um int de 32bit não tem capacidade para armazenar esse valor, daí o warning. ..\main.c:26:5: warning: too many arguments for format printf("Listagem dos telefones\n", tel); Quando fazes printf existe um formato que te permite incluir variáveis no output. Se a variável x fosse um int poderias fazer: printf("Valor da variavel x: %d \n",x); Em que %d indica que naquele local deve ser inserido o valor de uma variável e o argumento seguinte (x), indica à função printf que variável é essa. Podes incluir mais do que uma variável no mesmo printf. Podes usar %f para floats, %c para caracteres e %s para strings. Se na string que passas à função printf não aparecer nenhum formato destes( como estás a fazer) a função assume que não queres incluir variáveis no input, e tens um warning na compilação se passares variáveis à função. Para além disso, repara que no teu caso, tel é um array, e como já te foi explicado num post anterior, a função printf não envia para o output todos os valores de um array automaticamente. Para isso terás que fazer um ciclo que escreva cada um dos números de telemóvel. ..\main.c:31:3: warning: too many arguments for format printf("Listagem dos numeros\n", nomes); Presumo que quisesses dizer "Listagem das idades\n", de qualquer forma está mal pela mesma razão, a variável nomes não está aí a fazer nada. printf("Listagem dos numeros\n", nomes); ..\main.c:36:6: warning: too many arguments for format Aqui o erro é precisamente o mesmo e revela que te limitaste a copiar o que foi dito sem tentares perceber. O HappyHippyHippo incluiu na sua explicação por engano a tua linha de código errada antes do seu código. P.S.: Convinha que o código que colocas no post fosse o código que tentaste compilar e cujos erros estás a mostrar. Não respondo a dúvidas por mensagem.
alphasil Posted November 7, 2011 at 08:19 PM Author Report #419323 Posted November 7, 2011 at 08:19 PM Obrigado; O erro está aqui em cada case: printf("Listagem dos nomes %c \n", nomes); Description Resource Path Location Type format '%c' expects type 'int', but argument 2 has type 'char **' main.c /trabalho line 36 C/C++ Problem printf("Listagem dos numeros %d:", idade); Description Resource Path Location Type format '%d' expects type 'int', but argument 2 has type 'int *' main.c /trabalho line 26 C/C++ Problem são warnings... Cumps gmc11
HappyHippyHippo Posted November 7, 2011 at 08:22 PM Report #419328 Posted November 7, 2011 at 08:22 PM acho que o melhor e leres algum tipo de documentação da função printf: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
pedrosorio Posted November 7, 2011 at 08:27 PM Report #419329 Posted November 7, 2011 at 08:27 PM @alphasil Porque é que estás a ignorar as nossas respostas? És capaz de me explicar o que é que achas que devia aparecer no output quando escreves esta linha? printf("Listagem dos numeros %d:", idade); Não respondo a dúvidas por mensagem.
alphasil Posted November 7, 2011 at 08:53 PM Author Report #419342 Posted November 7, 2011 at 08:53 PM Oi Já não dá erro mas o estranho é que só me aparece o menu quando ponho terminar no eclipse... /* * main.c * * Created on: 7 de Nov de 2011 * Author: Gil */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char * nomes[6] = {"Gil", "Ana", "Joao", "Gregorio", "Bianca", "Violeta" }; int idade[6] = { 10, 9, 8, 7, 6, 13 }; int tel[6] = { 916892321, 916892322, 916892324, 916892353, 914567821, 917865432 }; int op, i; printf("Escolha uma das seguintes opções.\n"); printf("1 - Ler dados de uma pessoa.\n"); printf("2 - Calcular média de idades.\n"); printf("3 - Listar todas as pessoas.\n"); printf("4 - Mostar o nome da pessoa mais nova.\n"); printf("5 - Listar dados das 3 pessoas mais velhas.\n"); scanf("%d", &op); switch (op) { case 1: printf("Listagem dos telefones: \n"); for(i = 0; i < 6; i++) printf("%d", tel[i]); break; case 2: printf("Listagem dos numeros: \n"); for(i = 0; i < 6; i++) printf("\t[b]%d[/b]\n", idade[i]); break; case 3: printf("Listagem dos nomes: \n"); for(i = 0; i < 6; i++) printf("%s\n", nomes[i]); break; case '4': break; case 5: break; } system("pause"); return 0; } gmc11
HappyHippyHippo Posted November 7, 2011 at 08:56 PM Report #419343 Posted November 7, 2011 at 08:56 PM podes tentar colocar logo após o último printf do menu: fflush(stdout) PS : pode não resolver devido aos buffers de entrada/saída IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted November 7, 2011 at 09:02 PM Author Report #419345 Posted November 7, 2011 at 09:02 PM Oi Não dá...é estranho gmc11
HappyHippyHippo Posted November 7, 2011 at 09:07 PM Report #419349 Posted November 7, 2011 at 09:07 PM tenta isto: em vez de correr normalmente, corre como fosses fazer debug ... dessa forma deve aparecer uma janela de consola e ai aparecer o menu IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted November 7, 2011 at 09:34 PM Author Report #419356 Posted November 7, 2011 at 09:34 PM Aparece isso Description Resource Path Location Type cannot open output file trabalho.exe: Permission denied gmc11
HappyHippyHippo Posted November 7, 2011 at 10:47 PM Report #419376 Posted November 7, 2011 at 10:47 PM tens de fechar a aplicação antes de compilar novamente e correr ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
mundo Posted November 8, 2011 at 09:58 AM Report #419400 Posted November 8, 2011 at 09:58 AM Em vez do fflush(stdin), aconselho a começar a estudar validações, pois são muito melhores que o fflush
pmg Posted November 8, 2011 at 10:08 AM Report #419402 Posted November 8, 2011 at 10:08 AM Em vez do fflush(stdin), aconselho a começar a estudar validações, pois são muito melhores que o fflush Além do que, o fflush() quando aplicado a streams de input (ou streams de input/output depois duma operação de input), não tem comportamente definido pela linguagem C. Se estás em Windows (que define o comportamento de fflush(stdin), com uma nota escondida que não é comportamento Standard), podes usá-lo, mas tornas o teu programa impossível de correr noutros Sistemas Operativos. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now