iagoac / mc202

Disciplina MC202 - Estruturas de Dados
GNU General Public License v3.0
17 stars 13 forks source link

Sobre a disciplina #4

Closed ScottCarrara closed 3 years ago

ScottCarrara commented 4 years ago

Bom dia,

teve alguma atualização em como vai se dar prosseguimento na disciplina depois das resoluções liberadas pela reitoria?

RafaelAllves commented 4 years ago

Já saiu algum lab?

iagoac commented 4 years ago

Os labs ainda estão sendo desenvolvidos. Estamos trabalhando para liberar o primeiro lab nas próximas duas semanas

ianloron00 commented 4 years ago

Boa tarde, Estou com dúvida na aula 3, sobre concatenacao. No primeiro exercício da aula tres (inverter uma palavra), criei a seguinte funcao para testar:

include

include

int tamanho(char string[]){ int i; for (i = 0; string[i] != '\0'; i++); return i; }

void inverso(const char string[], int size){ char mirror[size]; int i; for (i = (size - 1); i <= 0; i--){ strcat(mirror, string[i]);
} printf("mirror: %s\n", mirror); }

int main () { int t = tamanho("MC202"); printf("%d\n", t); inverso("MC202", t); return 0; }

Estou com problemas com o void. Em primeiro lugar, vi que a concatenacao por "+" nao funciona. pesquisei a biblioteca "string.h". Porém, recebi o seguinte aviso: "3class.c:14:18: error: passing argument 2 of ‘strcat’ makes pointer from integer without a cast [-Werror=int-conversion] strcat(mirror, string[i]); ^~ In file included from 3class.c:2:0: /usr/include/string.h:129:14: note: expected ‘const char restrict’ but argument is of type ‘char’ extern char strcat (char restrict dest, const char restrict src) " obs: Tentei escrevei as variáveis mirror e string[i] como const char mas o programa ignorou. Quanto ao string[i], näo sei porque ele näo reconhece como concatenável. A funcao "tamanho" funcionou perfeitamente, com uma lógica similar.

Atte,

carlosecb commented 4 years ago

Boa tarde, Não querendo intrometer, no intuito de ajudar: Penso que você esta usando a função strcat de forma errada. Ela concatena duas strings e retorna uma nova string, mas essa nova string não está sendo atribuída a nenhuma variável. Se entendi bem o que você pretendia fazer com a função, me parece que apenas igualar mirror[size-i] = string[i] resolveria o problema

iagoac commented 4 years ago

@ianloron00 a função strcat espera receber dois vetores de char, ou seja, char string1[] e char string2[]. Entretanto, em seu caso, você está passando um vetor de char (mirror) e um único char (string[i]). Desta forma, realmente, o código não funciona.

@carlos-ecb tirando isto, a função strcat está correta. Você pode ver um exemplo da utilização desta função aqui.

E uma observação: esta é uma dúvida nova. Por favor, quando o assunto for não relacionado com o assunto inicial da Issue (no caso, esta era sobre a existência ou não de laboratórios), por favor, abra uma Issue nova. Desta forma, conseguiremos manter a organização deste ambiente

carlosecb commented 4 years ago

Aliás, aparentemente a variável string pode ser do tipo const char[], mas a variável mirror não, porque ela vai ser alterada dentro da função

carlosecb commented 4 years ago

@iagoac desculpe por ter comentado novamente na issue, não tinha atualizado a página e visto o comentário

ianloron00 commented 4 years ago

Obrigado Iago e Carlos! Peco desculpas, ainda näo sei usar o github... Estou vendo essa mensagem no e-mail porque nem sei onde foi parar haha. Mas ainda näo entendi por completo... Qual é a diferenca de se ter um vetor do tipo char e apenas um char? Todo char näo é um vetor? E como eu posso concatenar letra a letra em um "for", já que näo tenho dois char prontos?

Atte,

Em sáb., 28 de mar. de 2020 às 16:40, carlos-ecb notifications@github.com escreveu:

Boa tarde, Não querendo intrometer, no intuito de ajudar: Penso que você esta usando a função strcat de forma errada. Ela concatena duas strings e retorna uma nova string, mas essa nova string não está sendo atribuída a nenhuma variável. Se entendi bem o que você pretendia fazer com a função, me parece que apenas igualar mirror[size-i] = string[i] resolveria o problema

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/iagoac/mc202/issues/4#issuecomment-605509137, or unsubscribe https://github.com/notifications/unsubscribe-auth/AOZQSST5FNT632OE3XACA5DRJZHDNANCNFSM4LSUJ3BA .

iagoac commented 4 years ago

@ianloron00 a diferença é um pouco difícil de entender (tem a ver com passagem de parâmetros por cópia ou por referência), mas vamos lá.

Em uma chamada de função em C, todas as variáveis que são passadas como argumentos são, por padrão, passadas por cópia. Isto significa que, literalmente, a variável é duplicada na memória do seu computador e todas as alterações no valor dessa variável não serão refletidas fora da função.
Entretanto, sempre que você manda um vetor (como no exemplo, um char mirror[]), a variável é passada por referência, isto é, a função recebe o endereço onde seu vetor está localizado na memória do computador.

Na definição da função strcat (char *strcat(char *dest, const char *src)), podemos observar que ela espera receber a posição de memória de dois vetores e não um vetor e um char.


Quanto a como concatenar ambas as strings, sugiro primeiro você fazer de outra forma. Dê uma olhada neste link que existem diversas formas para realizar este exercício. Para o nível que estamos na disciplina agora, acredito que a forma mais interessante seja a String reversal without strrev function.

ianloron00 commented 4 years ago

Hmm entendi. Creio que veremos esse conceito mais vezes durante o curso de Computacäo, pra pegar o jeito, näo? obrigado pelo link! Acabei descobrindo outra maneira de fazer também haha.

Atte,

Em qua., 1 de abr. de 2020 às 18:30, Iago Augusto de Carvalho < notifications@github.com> escreveu:

@ianloron00 https://github.com/ianloron00 a diferença é um pouco difícil de entender (tem a ver com passagem de parâmetros por cópia ou por referência), mas vamos lá.

Em uma chamada de função em C, todas as variáveis que são passadas como argumentos são, por padrão, passadas por cópia. Isto significa que, literalmente, a variável é duplicada na memória do seu computador e todas as alterações no valor dessa variável não serão refletidas fora da função. Entretanto, sempre que você manda um vetor (como no exemplo, um char mirror[]), a variável é passada por referência, isto é, a função recebe o endereço onde seu vetor está localizado na memória do computador.

Na definição da função strcat (char strcat(char dest, const char *src)), podemos observar que ela espera receber a posição de memória de dois vetores e não um vetor e um char.

Quanto a como concatenar ambas as strings, sugiro primeiro você fazer de outra forma. Dê uma olhada neste link https://www.programmingsimplified.com/c-program-reverse-string que existem diversas formas para realizar este exercício. Para o nível que estamos na disciplina agora, acredito que a forma mais interessante seja a String reversal without strrev function.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/iagoac/mc202/issues/4#issuecomment-607499764, or unsubscribe https://github.com/notifications/unsubscribe-auth/AOZQSSSKLSUPWPY3B473QQ3RKOW7ZANCNFSM4LSUJ3BA .