alphasil Posted July 10, 2012 at 08:55 PM Report #468240 Posted July 10, 2012 at 08:55 PM (edited) Olà Pedem-me para ordenar esta estrutura pelo titulo. Estrutura typedef struct liv { char isbn[20], titulos[100]; char autores[10][100]; double preco; }LIVRO; Função criada por mim. int orderByTitle(LIVRO livros[]) { int i, j; LIVRO aux; for(i=0;i<MAX;i++) { for(j=0; j<MAX-1; j++) { if(strcmp(livros[j].titulos, livros[j+1].titulos)>0) { aux =livros[j]; livros[j]=livros[j+1]; livros[j+1]= aux; } } } return 0; } Está correta? Agora tive problemas porque costumo criar funçoes de odenação usando um array auxiliar e usar a função strcpy. Aqui não pude usar, alguém me consegue explicar porquê?? Obrigado Edited July 10, 2012 at 09:07 PM by pmg GeSHi adicionada ao segundo bloco de codigo gmc11
brunoais Posted July 10, 2012 at 09:09 PM Report #468242 Posted July 10, 2012 at 09:09 PM Está correta? Depende da relação entre o numero de elementos usados em livros e do valor em MAX Agora tive problemas porque costumo criar funçoes de odenação usando um array auxiliar e usar a função strcpy. Aqui não pude usar, alguém me consegue explicar porquê?? Fácil! LIVRO não é um char array. "[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31 Life is a genetically transmitted disease, induced by sex, with death rate of 100%.
pmg Posted July 10, 2012 at 09:10 PM Report #468243 Posted July 10, 2012 at 09:10 PM A variavel aux ja contem o array auxiliar. De facto contem 3 arrays auxiliares e eles sao inteiramente copiados com as atribuicoes, substituindo o strcpy. 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!
alphasil Posted July 10, 2012 at 09:25 PM Author Report #468246 Posted July 10, 2012 at 09:25 PM Então quer dizer que pondo este código (atenção que é feito a mão e não no pc) estaria certo. Depende do número de elementos?? Bem o max é 1400, mas por acaso só pus 4. Vou para o próximo exercício...recursividade de se n<=7, seq(n)=10 se n>7, seq(n)= 3*n+seq(n-1)-21 A minha dúvida é a seguinte, se o n introduzido for menor que 7, assume-se que é 10, certo? gmc11
Flinger Posted July 11, 2012 at 08:27 AM Report #468273 Posted July 11, 2012 at 08:27 AM Não está correcto... LIVRO é uma estrutura não um apontador para estrutura, logo não podes simplesmente fazer aux=livro[j]. Ou copias campo a campo ou usas algo como o memcpy para te copiar o conteúdo inteiro.
alphasil Posted July 11, 2012 at 09:33 AM Author Report #468281 Posted July 11, 2012 at 09:33 AM Oi Mas se ponho com strcpy: int i, j; char aux[199]; //Declaro outra estrutura igual for(i=0;i<MAX;i++) { for(j=0; j<MAX-1; j++) { if(strcmp(livros[j].titulos, livros[j+1].titulos)>0) { strcpy(aux,livros[j]); strcpy(livros[j],livros[j+1]); strcpy(livros[j+1],aux); } } } Dá-me issto: error: incompatible type for argument 2 of 'strcpy'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\string.h|45|note: expected 'const char *' but argument is of type 'LIVRO'| D:\2012\c_exe\Pergunta 1 exame 09_06\main.c|85|error: incompatible type for argument 1 of 'strcpy'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\string.h|45|note: expected 'char *' but argument is of type 'LIVRO'| D:\2012\c_exe\Pergunta 1 exame 09_06\main.c|85|error: incompatible type for argument 2 of 'strcpy'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\string.h|45|note: expected 'const char *' but argument is of type 'LIVRO'| D:\2012\c_exe\Pergunta 1 exame 09_06\main.c|86|error: incompatible type for argument 1 of 'strcpy'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\string.h|45|note: expected 'char *' but argument is of type 'LIVRO'| Isto com o srcpy gmc11
Flinger Posted July 11, 2012 at 09:39 AM Report #468283 Posted July 11, 2012 at 09:39 AM o strcpy copia strings, não estruturas. Ou usas o strcpy para copiar campo a campo: strcpy(aux.isbn,livros[j].isbn); strcpy(aux.titulo,livros[j].titulo); ... Ou usas o memcpy para te copiar a estrutura inteira.
alphasil Posted July 11, 2012 at 09:51 AM Author Report #468290 Posted July 11, 2012 at 09:51 AM (edited) Oi Só preciso de ordenar o titulo por isso pus assim. int orderByTitle1(LIVRO livros[]) { int i, j; LIVRO aux; //Declaro outra estrutura igual for(i=0;i<MAX;i++) { for(j=0; j<MAX-1; j++) { if(strcmp(livros[j].titulos, livros[j+1].titulos)>0) { strcpy(aux.titulos,livros[j].titulos); strcpy(livros[j].titulos,livros[j+1].titulos); strcpy(livros[j+1].titulos,aux.titulos); } } } return 0; } Então deixa ver se percebi uma coisa, se tiver uma estrutura e quiser ordenar um campo tenho de usar o que me disseste? Edited July 11, 2012 at 09:51 AM by alphasil gmc11
HappyHippyHippo Posted July 11, 2012 at 09:53 AM Report #468291 Posted July 11, 2012 at 09:53 AM sim, os títulos trocam de lugar, e os isbn's ??? e os preços ??? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted July 11, 2012 at 09:57 AM Author Report #468294 Posted July 11, 2012 at 09:57 AM Oi HHH, então tenho de fazer para todos?? Por isso valia 4 valores 🙂 Já vou fazer... Obrigado gmc11
HappyHippyHippo Posted July 11, 2012 at 10:08 AM Report #468302 Posted July 11, 2012 at 10:08 AM usa o memcpy como te disseram o strcpy copia strings, não estruturas. Ou usas o strcpy para copiar campo a campo: Ou usas o memcpy para te copiar a estrutura inteira. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted July 11, 2012 at 10:13 AM Author Report #468304 Posted July 11, 2012 at 10:13 AM (edited) HHH, nunca usei o memcpym, já vi o que o flinger pôs mas fiquei meio cego a ver aquilo lol Já alterei, ficou assim: { strcpy(aux.isbn,livros[j].isbn); strcpy(aux.titulos,livros[j].titulos); strcpy((char*)aux.autores,(char*)livros[j].autores); aux.preco=livros[j].preco; strcpy(livros[j].isbn,livros[j+1].isbn); strcpy(livros[j].titulos,livros[j+1].titulos); strcpy((char*)livros[j].autores,(char*)livros[j+1].autores); livros[j].preco=livros[j+1].preco; strcpy(livros[j+1].isbn,aux.isbn); strcpy(livros[j+1].titulos,aux.titulos); strcpy((char*)livros[j+1].autores,(char*)aux.autores); livros[j+1].preco=aux.preco; } Está correto? Agora o que se passa é que não me imprime nada chamo a função, faço um print para ver se passa, e passa, mas não imprime nada. writeBooks(livros,valor); //envia a função estes parametros orderByTitle1(livros); printf("passei"); //Imprime esta linha for(i=0;i<2;i++) { printf("%s", livros->titulos); //Não imprime nada } Edited July 11, 2012 at 10:14 AM by alphasil gmc11
Flinger Posted July 11, 2012 at 10:25 AM Report #468307 Posted July 11, 2012 at 10:25 AM { strcpy(aux.isbn,livros[j].isbn); strcpy(aux.titulos,livros[j].titulos); strcpy((char*)aux.autores,(char*)livros[j].autores); aux.preco=livros[j].preco; strcpy(livros[j].isbn,livros[j+1].isbn); strcpy(livros[j].titulos,livros[j+1].titulos); strcpy((char*)livros[j].autores,(char*)livros[j+1].autores); livros[j].preco=livros[j+1].preco; strcpy(livros[j+1].isbn,aux.isbn); strcpy(livros[j+1].titulos,aux.titulos); strcpy((char*)livros[j+1].autores,(char*)aux.autores); livros[j+1].preco=aux.preco; } Está correto? Ainda não 😄 Não te adianta fazer um cast da matriz autores para char *... não é assim que deixa de ser uma matriz e passa a ser uma string... o strcpy apena copia strings, por isso, para copiares o campo autores tens de copiar posição a posição também. A outra hipótese é usar o memcpy como te disse. O memcpy copia-te um bloco de memória integralmente de um sítio para o outro. void *memcpy(void *dest, const void *src, size_t n); dest, é para onde queres copiar, neste caso (aux=livros[j]), o endereço da tua variável aux. src, é o endereço de onde tu queres copiar, neste caso o endereço do livro que queres copiar. n é a quantidade de bytes que tu queres copiar. Como queres copiar uma estrutura LIVRO, é o tamanho dessa tua estrutura (dica: sizeof)
pmg Posted July 11, 2012 at 10:27 AM Report #468308 Posted July 11, 2012 at 10:27 AM Para copiar uma estrutura completa (atenção aos ponteiros! -- irrelevante neste caso especifico) podes usar atribuicoes normais struct liv a = {0}, b = {0}, tmp; /* change a and b */ tmp = a; a = b; b = tmp; Não é preciso andar a fazer strcpy ou memcpy membro a membro. 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!
Flinger Posted July 11, 2012 at 10:49 AM Report #468311 Posted July 11, 2012 at 10:49 AM Para copiar uma estrutura completa (atenção aos ponteiros! -- irrelevante neste caso especifico) podes usar atribuicoes normais struct liv a = {0}, b = {0}, tmp; /* change a and b */ tmp = a; a = b; b = tmp; Não é preciso andar a fazer strcpy ou memcpy membro a membro. oi!!! 😕 acho que me perdi... De facto fui confirmar e é possível mas não percebi como... Andei a minha vida todo enganado nisto :S
alphasil Posted July 11, 2012 at 10:57 AM Author Report #468313 Posted July 11, 2012 at 10:57 AM Bem se tu está perdido, então imagina eu...lool Então voltamos ao que pus inicialmente...o que o PMG foi examente o que fiz aux =livros[j]; livros[j]=livros[j+1]; livros[j+1]= aux; gmc11
Flinger Posted July 11, 2012 at 11:08 AM Report #468315 Posted July 11, 2012 at 11:08 AM Pois... aux=vect[4]; 0x0804850a <main+214>: lea -0x78(%ebp),%ecx 0x0804850d <main+217>: lea -0xec(%ebp),%edx 0x08048513 <main+223>: mov $0x70,%eax 0x08048518 <main+228>: mov %eax,0x8(%esp) 0x0804851c <main+232>: mov %edx,0x4(%esp) 0x08048520 <main+236>: mov %ecx,(%esp) 0x08048523 <main+239>: call 0x804837c <memcpy@plt> Resumindo, o próprio compilador faz aquilo que eu te disse para fazer 😄 Isto não esteve sempre assim, pois não png?
alphasil Posted July 11, 2012 at 11:13 AM Author Report #468316 Posted July 11, 2012 at 11:13 AM Fizeste como Flinger? gmc11
pmg Posted July 11, 2012 at 11:14 AM Report #468317 Posted July 11, 2012 at 11:14 AM (edited) Isto não esteve sempre assim, pois não png? Sim, pelo menos desde 1989, desde a primeira versao do Standard 🙂 E suspeito que já era assim muito antes, talvez até desde 1972, a primeira versão do compilador 😄 Edited July 11, 2012 at 11:15 AM by pmg 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!
Flinger Posted July 11, 2012 at 11:27 AM Report #468321 Posted July 11, 2012 at 11:27 AM (edited) Gostava de saber como consegui andar 15 anos enganado a este respeito... @alphasil Na primeira linha do código tens a instrução, nas seguintes tens o assembly que é gerado pelo compilador para essa instrução. Basicamente ele carrega os 2 endereços das estruturas para 2 registos do processador (as 2 instruções "lea"), depois carrega o tamanho da estrutura para outro registo (1.º mov), de seguida carrega os valores desses 3 registos para a stack de execução (os 3 movs seguintes) e chama a função memcpy, que vai usar os valores carregados na stack como argumentos. Só não percebi é porque é que se está a borrifar para o __attribute__((packed)) que coloquei na estrutura, mas provavelmente é porque as variáveis não estão alinhadas. Será que isto se aplica para arm? Edited July 11, 2012 at 11:28 AM by Flinger
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