JASON HIRSCHHORN: Welcome a A5, todos. Temos uma semana emocionante à frente de nós, principalmente porque há tantos novos enfrenta nesta sala. É maravilhoso. Muitos de vocês estão aqui por acaso, o que é ainda melhor. Portanto, esperamos que você vai continuar se juntar a nós. Esta semana estamos indo para gastar a maior parte da secção preparando para o quiz. Então por nossa agenda, vamos falar um pouco sobre os recursos para a classe, , mas também para o teste e, em seguida, novamente, passar a maior parte da classe falar sobre as perguntas. Uma vez que estamos a fazer responder a sua perguntas, ou se as suas perguntas naturalmente nos levar a alguma codificação, eu tem problemas de amostra midterms passado que vai codificar ao vivo na seção juntos que também trazer algum outro bons temas para cobrir. Então, primeiro, como nós passamos para o duas últimas semanas para lembrá-lo caras, há uma tonelada de recursos disponíveis para este curso. Muitos deles vão ser extremamente útil para você como você continuar a estudar para concurso 0, porque é terça-feira à tarde. Então, todos vocês têm sido estudar um pouco. Há notas de aula e fonte código que você deve definitivamente check-out. Assista os calções. Confira study.cs50.net. E, em seguida, listados abaixo, um número de outros recursos. Mais uma vez, quiz 0 é amanhã à 1 hora. Se você não tiver feito isso, verifique Sobre o documento quiz 0 no página inicial do curso para descobrir onde você está tomando o quiz. O concurso começa às 1:10 e termina 70 minutos mais tarde. Então, se você mostrar-se após 1:10, você está vai ter que muitos menos minutos de 70 para fazer o teste. Portanto, verifique se você está lá na hora. Se você é um estudante de extensão ou ter algumas outras considerações de teste, isto pode não ser a 1:00 de amanhã. Mas, novamente, verifique a 0 sobre Quiz documentar para se certificar de que você saiba quando você está tomando o quiz. Escrevi 75 minutos aqui. Eu acho que é isso mesmo, não 70. Ela abrange todo o material a partir de uma semana 0 a palestra da semana passada na quarta-feira. E, novamente, para este teste, por que documento, você recebe um de dois lados e 8 1/2 por 11 folha de papel que você obtenha para usar como notas durante o quiz. Muitas pessoas, se não a maioria das pessoas, tem descobriu que a única forma mais útil para estudar para o teste é fazer uma folha de estudo, uma one-sider, da sua própria. Então olhe para os últimos se você já viu os últimos. Chegar aos amigos para ver o que eles estão colocando em suas. Mas as mãos para baixo, a melhor maneira que você puder estudo é que passar por tudo e talhar-lo para o que devem ou não pertence a essa folha de papel, porque isso é apenas um realmente maneira útil para que você tenha certeza você está passando por tudo e ter alguma familiaridade com ele. A maioria das pessoas, encontramos, ainda que ter a folha de papel sentado ao lado deles no questionário, não ligue para isso, uma vez que, de novo, que muito processo de ir através da informação ajudou a aprender. Alguém tem alguma dúvida sobre questionário 0? Tem todos - Eu não vou fazer um show de mãos. Nunca mente. Eu ia perguntar quem começou a estudar. Mas eu não quero fazer você tudo não levantem suas mãos. Então, como eu disse - sim, Avi, vá em frente. AVI: O que seria uma coisa útil para colocar no one-pager? ALUNO: Isso é com você. JASON HIRSCHHORN: Você começa para usar o seu julgamento. Coisas úteis para colocar no one-pager, se você está confuso sobre o grande O tempo de execução de diferentes tipos de pesquisas e tipo, colocar isso lá em um gráfico dandy acessível. Dessa forma, se você é pedido que na questionário, você não precisa tentar e figura lo ou razão pela execução. Você pode simplesmente copiá-lo para baixo. Se você olhar para quizzes passado, uma série de vezes, não está correndo questões de tempo. Assim que seria um exemplo de um bom coisa para colocar no seu one-pager. Outras coisas boas de colocar, se você estiver confusos sobre como declarar um função ou quais as diferentes partes a declaração da função é, escrever que lá, uma versão genérica e, em seguida, talvez um exemplo. Se você está confuso sobre ponteiros, um diagrama de como ponteiros trabalho é provavelmente realmente útil. Se você está confuso sobre recursão, um provar função recursiva lá também pode vir a ser muito útil. Será que isso lhe dar algumas idéias? AVI: Você precisa entender a todo o processo de compilação, como como isso tudo funciona? JASON HIRSCHHORN: Tudo que foi coberto podia aparecer no quiz. Perguntas - mas, novamente, algumas coisas vão ser ponderados fortemente do que outros. Algumas coisas vêm-se novamente e novamente em sala de aula, em palestra e seção. Outras coisas que não tem surgem com freqüência. Nós conversamos muito sobre # include e -L alguma coisa e que aqueles significam em o processo de compilação. Nós conversamos muito sobre o GDB, se agarram, essas bandeiras diferentes que usamos quando compilamos algo, eo que make15, por exemplo, realmente significa e realmente faz. Nós não falar tanto sobre cada passo em o processo de compilação. Nós ainda falamos sobre isso. Por isso, ainda é algo que você deve estar familiarizado. Mas, novamente, não vamos ser - coisas que surgem com mais freqüência em sala de aula são mais propensos a chegar a mais e muitas vezes ser mais fortemente ponderados no quiz. Legal. Quaisquer outras perguntas sobre teste 0? OK, então eu coloquei uma lista de tópicos sobre a placa. Eu atravessei o programa. Eu atravessei a seção de revisão de ontem à noite e os slides para chegar com uma lista não exaustiva de tópicos que nós cobrimos até agora em CS50 e coisas que podem aparecem no quiz. Então eu não vou passar por cada um único destes. Isso levaria muito mais tempo do que o que temos agora. Mas eu coloquei isso aqui à espera jog sua memória como a coisas que podem ou pode não ser tão familiar com você. E eu adoraria passar a maior parte do seção respondendo suas perguntas sobre estes temas, temas que não são aqui tratados. Nós podemos escrever um código pseudo. Nós podemos escrever o código real, para garantir que você - Eu posso responder a sua pergunta e ajudar todos fundamentalmente entender um Muitos desses temas de forma que você sente preparado e confortável indo para o amanhã quiz. Então leia sobre a lista. Você espero ter chegado a seção com algumas perguntas também. Quando estiver pronto, levante a mão e vamos começar. Tenha em mente, as perguntas que você tem, não há perguntas estúpidas. Ouvimos muito isso. E as perguntas que você tem, estou disposto apostar, muitas outras pessoas, tanto aqui sentado e assistindo on-line têm também. Assim, você só pode ajudar as pessoas fazendo perguntas. Marcus. MARCUS: entre a pilha e o pilha, há uma pré-alocado percentagem de memória que é definido como isto é para a pilha ou para o monte? Ou como é que isso funciona exatamente? JASON HIRSCHHORN: Ótima pergunta. Eu estou indo para trás traçar um pouco. Será que toda a gente - por favor, seja honesto aqui. Eu sei que eu estou pedindo para você aumentar a sua mão na frente de seus pares. Mas há pessoas que se sentem desconfortável com a pilha e pilha e gostaria de passar por cima desse eo que os significa? Levante a mão se - OK. Obrigado. Então, vamos passar por cima da pilha e a pilha muito rapidamente e, em seguida, mover-se em responder a sua pergunta. Então, se nós tirar uma caixa para representar memória em seu computador, o que são alguns coisas que vão nessa caixa? Main. A função principal. Onde o principal ir? Estudante: [inaudível]. JASON HIRSCHHORN: Então nós vamos colocar principal aqui. O que mais vai nessa caixa? ALUNO: As funções que você chama. JASON Hirschhorn: As funções que chamamos. E onde eles vão? ALUNO: Na pilha. JASON HIRSCHHORN: Eles ir na pilha. Então, vamos chamar isso de coisa aqui em baixo da pilha. E lá em cima, temos a heap. Assim, a memória não é uma caixa assim. Mas é realmente muito similar. Vai ser um monte de caixas ao longo do e mais, dependendo de como é grande o seu computador é ou o quão grande é a sua memória. Ao entre aspas "bottom" é a pilha. E há várias coisas que vão para a pilha. E aqueles dependem das funções você tem no seu código. Você sempre tem uma função em seu código chamado principal, por isso há sempre um seção aqui no empilhar dedicado à principal. Estas seções da pilha são chamados quadros de pilha. Quando você chamar outra função, dizer principal chama uma função de busca binária, vamos colocar outro quadro na pilha. Mais especificamente, nós vamos doar um pedaço de memória em nosso computador para armazenar binário busca de locais variáveis ​​e para executar o binário código de pesquisa. Então chamamos de busca binária. Neste pedaço de memória, nós vamos para armazenar suas variáveis ​​locais. Nós estamos indo para armazenar suas chamadas printf. Aconteça o que acontecer, essa função é vai ser armazenado ali. Pesquisa binária vai executar. Ele vai para concluir a execução. Qual é a palavra em C que significa uma função que deve completar a sua execução? ALUNO: Return. JASON HIRSCHHORN: Return. Assim, sempre que você vê uma instrução de retorno, as extremidades de função quando bate aquele. Então busca binária vai acertar seu retorno. Esta parte da memória será, essencialmente, ser liberada. E principal vai voltar para execução. Assim principal fará uma pausa sempre que era, chamada busca binária, obter algum valor de retorno, e continuar a execução. Este quadro de pilha vai embora. Se chamarmos uma função recursiva, que é uma função que chama a si mesmo ao longo do e mais, podemos chegar - dizer que fez busca binária recursiva. Podemos obter uma versão binária de pesquisa, busca binária dois, busca binária três, busca binária quatro, busca binária cinco. E então esta pesquisa binário final cinco vai bater o caso base, ea pilha quadros voltar e manter fechamento até chegarmos de volta à principal. Nós podemos passar por cima de recursão em um pouco. Mas tudo isso é para dizer que, se você estiver chamar várias funções ao mesmo tempo, haverá pilha múltipla quadros na pilha. A pilha, por outro lado, se aqui, não é para as funções, não para variáveis ​​locais. É para alocada dinamicamente variáveis. Então, essas são as variáveis ​​que podem ser inicializado no principal ou uma Função que principais chamadas. Em qualquer lugar no seu código, eles pode ser inicializado. E para inicializar um dinamicamente variável alocada. Qual a função em C que usamos? ALUNO: Malloc. JASON HIRSCHHORN: Malloc. Você chama malloc. Você ganha um espaço de memória. E que o espaço de memória está no heap. E esse espaço de memória permanece lá até que você ligue grátis. Então variáveis ​​alocadas dinamicamente em pilha vai existir por tanto tempo quanto você quer que eles existem, e eles não vão ir embora até que você explicitamente dizer-lhes para ir embora. Você pode criá-los em uma função. Aquela pilha de função quadro vai embora. Mas essa variável ainda existirá na pilha até que ele seja liberado, potencialmente pela função que chamou busca binária ou o que seja. Então, essas variáveis ​​heap ficar lá durante o tempo que você quiser eles para ficar lá. E eles se colocar aqui. E, em seguida, o próximo é colocado lá. Mantêm-se preenchido, e eles ficar lá até que você ligue grátis. E, essencialmente, a pilha ea pilha, ficando à pergunta de Marcus, crescem em direcção um ao outro. E se correr para o outro, você tem usou toda a memória do seu computador, e seu programa vai sair porque você não tem mais memória deixaram de usar. Entre eles, existem potencialmente outras coisas. Mas, para o escopo deste curso, você não precisa se preocupar com isso. Então essa foi a resposta à sua pergunta. Não se preocupe com isso. Mas essa era a resposta longa. Tudo o que você precisa saber é o pilha ea pilha vai - um começa na parte inferior. A pilha faz. A pilha está lá em cima. Eles irão crescer mais perto um do outro. E se tocar, isso é um problema. Você ficou sem memória. Mas também, além de saber onde eles estão, o que está armazenado em ambos os pilha e heap. Curtis. CURTIS: Quando eles colidem, é que um estouro de pilha? JASON HIRSCHHORN: Quando eles colidem, isso não é um estouro de pilha. Um estouro de pilha é uma área diferente que podemos passar por cima se você quiser. OK, vamos voltar a isso daqui a pouco. Estudante: Qual é a palavra chamada quando eles batem um no outro, o pilha e da pilha? JASON HIRSCHHORN: Por agora, não se preocupe. Só sei - Eu vou responder a essa pergunta depois da aula. Se eles correm para o outro, você correu para fora de memória, porque não há mais espaço ali. ESTUDANTE: Desculpe, mas o que é uma falha de seg? JASON HIRSCHHORN: Um segmento falha pode ser chamado para - depende por que chamou o culpa seg. Às vezes, o estouro de pilha, vai dizer seg falhas como o erro. ALUNO: E sobre dereferencing uma variável null? Isso é uma falha de seg? JASON HIRSCHHORN: Dereferencing um ponteiro nulo - OK, então se você tem um ponteiro que você definir igual a nulo, ponteiros, recall, endereços de memória loja como os seus valores. E um ponteiro nulo é essencialmente armazenamento de 0, o 0-th abordar nessa variável. Assim 0x, 0, 0, 0, 0, et cetera. Isso 0-th endereço na memória que não é em nossa imagem, que está lá em cima em algum lugar, que é reservado para o computador. Não temos permissão para tocá-lo. Assim, quando o programa está em execução, se algo está tentando ir para a memória endereço 0, ele sabe que que é um valor vazio. Ele não sabe nada deveria estar lá. Então, se você tentar usar alguma coisa lá e tratar algo como lá ou tentando ir para esse local, você está vai ter uma falha ou um erro seg. Isso responde a sua pergunta? E agora vamos voltar de estouro de pilha. As coisas na pilha, como vocês têm visto antes, em - vamos desenhar um close -se de um quadro de pilha. Todos podem ver isso? Então, nós temos o nosso quadro de pilha. Estamos salvando uma matriz como um local de variável nesta função. Então, dizer que a nossa matriz tem cinco pontos. Todos os cinco desses vai ser armazenado nesse quadro de pilha. Se começar a escrever para além do limites deste conjunto - por isso, se começar a escrever em, vamos dizer que é 0. Esses são os cinco índices da nossa matriz. Se começar a escrever em índice 5, que não temos quando temos uma matriz de tamanho 5, começamos a escrever em índice de 6, 7, 8, 9, podemos obter uma Stack Erro de estouro. Geralmente não é - você provavelmente vai ter problemas se você passar por cima por um. Mas, geralmente, você vai entrar no mais problemas, se você passar por cima de um monte e você ir tão longe mais que você escreve sobre o endereço de retorno que função, que está localizado no parte inferior do quadro de pilha. Porque, certo? You - no - desculpe. Não ", porque a direita." No quadro de pilha, você tem suas variáveis ​​locais. Na parte inferior da pilha quadro é o endereço de retorno. É aí que a função vai quando acabar. E se você substituir esse retorno endereço, em seguida, quando este quadro de pilha, quando você está indo através da pilha enquadrar e execução de cada linha, você está indo para ir para o seu novo endereço de retorno que está escrito lá em vez de o um real. E é assim que nós vimos algumas falhas de segurança pode acontecer com os computadores. Então estouro de pilha, em suma, é quando você substituir o papel na pilha você deveria usar, o local de variável que você deveria usar, e em especial, quando você começa a sobrescrever coisas importantes, como o endereço de retorno. E é aí que você vai ter um erro. Ou talvez até mesmo você pode começar mesmo escrevendo em - dizer de busca binária foi logo acima principal. Se você substituiu muito, você poderia escrever em principal. Mas, geralmente, você recebe um erro antes então, porque o computador sabe você está fazendo algo que você não deveria estar fazendo. É. Estudante: Qual é a diferença entre um estouro de pilha e um buffer overflow? JASON HIRSCHHORN: Buffer overflow é um tipo mais genérico de o que eu acabei de descrever. ALUNO: Então um estouro de pilha é um exemplo de um buffer overflow. JASON HIRSCHHORN: Exatamente. Esta é uma matriz que podemos pensar como buffer, um espaço para que as coisas vão dentro Este é um estouro de buffer de pilha. Poderíamos ter um estouro de buffer de pilha. Se houve um tampão, o qual muitas vezes existe é uma matriz da pilha, e nós overwrote desses limites, então nós ter um estouro de buffer de pilha. E além do escopo deste curso, eles são detectados um pouco diferente. O compilador tem especial meios de detecção de cada uma. Mas um buffer overflow é um mais genérico tipo do que eu descrevi, que foi um estouro de buffer de pilha. Será que isso responde sua pergunta? Doce. Havia outras questões relacionadas para a pilha ou a pilha? É. ALUNO: Eu sei que você tem que cordas livres porque eles estão no heap e você não quer vazar memória. Mas você tem que liberar as variáveis ​​globais e coisas assim? Ou eles são liberados automaticamente? JASON HIRSCHHORN: Boa pergunta. Assim, em CS50.H, criamos essa coisa para você chamou uma string. Uma corda é realmente o que? ALUNO: Char estrela. JASON HIRSCHHORN: Uma estrela char, um ponteiro a um personagem, um ponteiro para um conjunto de caracteres. Isso é o que a corda é. Então, precisamos libertá-la, porque getstring, que usamos muito - nome da seqüência é igual getstring - que mallocs para nós um pouco de memória no heap e retorna um ponteiro para a primeiro caractere que corda, uma estrela de char. Então, aparentemente, se você não tiver sido escrevendo livre em qualquer de suas cordas que você já chamou até agora, você tem foi vazando um pouco de memória. Claro que nós não falamos sobre lo, de modo que ninguém é chegado em problemas para fazê-lo. Mas daqui para frente, sim. Quando você chamar getstring, você está mallocing algum espaço no heap. E se você não chamar livre, mais tarde, que corda, você tem um vazamento de memória. Isso responde a sua pergunta? Sim Estudante: Então, para fazer isso, usamos direito livre antes do retorno? Como, no âmbito de, eu acho que se dizemos, como, int main, dentro do âmbito do código que está dentro daqueles chaves, bem antes - você sabe onde você gostaria costumo colocar retorno. Você coloca livre antes disso? JASON HIRSCHHORN: Então você pode colocar livre onde quer que você colocá-livre. Porque estes são alocados dinamicamente variáveis, porque eles podem viver para além do âmbito de uma determinada função, se você chamar malloc em um função separada, por exemplo, getstring, você pode ligar gratuitamente no principal. Você não precisa de chamá-lo na função específica onde malloc é chamado. Mas você precisa fazer para chamá-lo antes da volta principais. E isso realmente depende. Depende de qual você malloced que espaço, em primeiro lugar. Algumas pessoas vão chamar libertar muito rapidamente. Algumas pessoas não vão ligar gratuitamente até No final do seu programa. E eles vão passar por e livre de tudo. Depende de por que você chamou malloc. ALUNO: E o que você diria se você chamou uso getstring? Você diria que livre o quê? JASON HIRSCHHORN: Então a sintaxe de graça é simplesmente livre, parêntese aberto, perto paren, e o nome do ponteiro. Então, se você escrever iguais String nome getstring, você colocar o nome aqui. Esse é o nome do ponteiro. E ele sabe que para libertar memória. Estudante: Então, quando ele libera a memória, o ponteiro ainda aponta para aquele lugar na memória? Ou é o ponteiro também esvaziada de o endereço que ele aponta. JASON HIRSCHHORN: Devemos tentar isso. Devemos codificar isso. Vamos voltar quando chegarmos codificação, e vamos codificar isso. E se você quiser descobrir a resposta para isso, você também pode código que no mesmo período. Mas isso é uma grande questão. ALUNO: É possível algo livre cedo demais? Então, você ainda precisa para o seu programa, e você libertou esse espaço de memória? JASON HIRSCHHORN: sim. É possível, se algo livre e depois de usá-lo novamente, você vai deparar com um erro. Mas isso é para você, porque você libertou alguma coisa e, em seguida, chamou-lhe mais tarde. Então isso foi um erro do programador. Mas sim. Você pode escrever isso. Mais alguma pergunta sobre - Sim. Estudante: Então, se você é suposto a apenas libertá-lo, em geral antes da programa termina, isso significa que se o programa termina e você não liberá-lo, que a memória ainda é alocado? JASON HIRSCHHORN: Se o programa termina e você se esqueça de liberar alguma coisa, então que a memória foi alocada ao longo a vida útil do seu programa. Quando o programa se fecha completamente, que a memória não está acontecendo para ficar lá para sempre. O computador é inteligente o suficiente para saber que, quando o programa é fechado, ele deve se livrar de toda a memória que foi associado com o referido programa. No entanto, existem ferramentas que podem ser executados em um programa para detectar se, quando o programa terminar, você esqueceu para liberar memória. E para o seu próximo conjunto de problemas onde você estará usando malloc e usando ponteiros, você estará correndo este programa em seu programa para ver se, quando retorna principais, você teve algum coisas que foram deixadas não-liberto. Então, eles não vão ficar malloced para sempre em seu computador. Isso seria um desperdício, porque muito rapidamente, computadores iria ficar sem memória. Mas, se eles correm até o final do seu programar e eles não estão liberados e seu programa sai, isso ainda é um problema que esta ferramenta irá ajudá-lo a resolver. ALUNO: É isso Valgrind? JASON HIRSCHHORN: É chamado Valgrind. E você vai ser - ALUNO: Mas não temos de saber que, para o teste, embora? Quero dizer, foi falado um pouco na palestra. JASON HIRSCHHORN: Então Valgrind é o nome dessa ferramenta. Saber o que ele faz é suficiente para o quiz. Mas você não tê-lo usado ainda em seu conjunto de problemas, porque nós não tivemos uma conjunto de problemas que tem explicitamente tratado com malloc ou você está usando malloc. Então, você não usou Valgrind ainda. Mas você vai usá-lo, mais cedo em vez de mais tarde. ALUNO: Você pode repetir Valgrind que é? JASON HIRSCHHORN: Desculpe? ALUNO: Você pode repetir o que a finalidade de Valgring é? JASON HIRSCHHORN: Valgrind é o nome - como GDB ajuda a depurar o seu programa, Valgrind ajuda você a descobrir se as coisas não foram libertados quando o programa é fechado. Então você vai executá-lo em seu programa. E o seu programa sai, e ele vai dizer seu programa chamado malloc isso muitos vezes por isso muitos bytes, e você apenas chamado de livre isso muitas vezes. E assim você deixou esses muitos bytes sem ser libertados. Ou vai dizer que você libertou tudo. Bom trabalho. ALUNO: OK. E ele é chamado Valgring? Jason HIRSCHHORN: V-A-G-G-R-I-N-D. ALUNO: Uma pergunta sobre ponteiros. Então, digamos que você tenha n estrelar x é igual a alguma coisa. Isso equivale a, o que você está colocando lá, é que o que está sendo colocado dentro o que x está apontando para, ou o ponteiro de x? JASON HIRSCHHORN: Você pode repetir a pergunta? Podemos chamar a isso enquanto você diz isso? ALUNO: No questionário, na verdade, a aquele que você nos enviou, era como, char estrela verdade é igual a CS50 rochas, certo? Então, isso significa que esse CS50 rochas é o que a verdade está apontando para? JASON HIRSCHHORN: Então você está falando sobre uma estrela de caractere em uma string, como que funciona? É. OK. Vamos chamar isso aqui. [SIDE CONVERSA] JASON HIRSCHHORN: Então esta variável vai ser do tipo char estrela. Quão grande é uma variável do tipo char estrela? Quantos bytes? ESTUDANTES: quatro. JASON HIRSCHHORN: É quatro bytes. Quantos direitos é uma variável do tipo int estrela? ESTUDANTES: quatro. JASON HIRSCHHORN: Quatro bytes. Se for um ponteiro, então é sempre quatro bytes, pois os ponteiros, o seu valor é um endereço de memória. E os endereços de memória sobre o CS50 aparelho são quatro bytes. Então, quando nós chamamos getstring, ou quando nós digamos, Nomedestring iguais, e, em seguida, em aspas colocar uma corda, estamos colocando - bem, isso é um pouco diferente. Nós vamos fazer getString como o exemplo. Ou char estrela algo é igual à string. Desculpe, me dê o exemplo que você leu? ESTUDANTE: char estrela verdade é igual a "CS50 pedras" entre aspas duplas. JASON HIRSCHHORN: Então esta estrela, este vamos chamar esta variável x para o nosso propósitos genéricos. Nós criamos uma variável chamada x. É tipo char estrela. É um ponteiro para uma série de caracteres. Então, aqui em baixo - Portanto, esta é a forma como isso seria trabalho na memória. Isso iria armazenar um endereço de memória. Seria armazenar o endereço de memória o primeiro caractere na matriz. E então, quando você seguiu o ponteiro, você faria obter o primeiro caractere. E se você está lendo essa coisa como uma corda, o computador é inteligente o suficiente para saber, leia tudo isso até chegar a uma reação 0. Mas se você está lendo isso em um personagem um tempo, assim que você está interagindo através esta cadeia, então você só vai ler um caractere de cada vez até chegar ao barra invertida 0. Isso pode não responder à sua pergunta. ALUNO: Sim, mas você não tem malloced que o espaço Ainda para esse ponteiro. JASON HIRSCHHORN: Então, eu não tenho certeza exatamente o que você está olhando, porque eu não fiz que quiz. Isso era para ser um útil recurso de outro TF. Se você estiver criando uma corda no pilha ou como uma variável local, ele vai ser apenas matriz de cargas, em vez de geralmente uma estrela de char apontando para outra string. Mas eu não sei. Isso poderia ser um ponteiro para outro string na pilha também. É. ALUNO: Eu sei que você precisa alocar memória se o ponteiro estiver sendo declarada dentro de outra função. Você precisa fazer a mesma coisa, se é ser declarada dentro de principal, você está usando-o dentro do principal? JASON HIRSCHHORN: Então, sim. Você pode declarar um ponteiro para qualquer endereço de memória na memória. Ele pode ser o endereço de memória de um local de variável, embora, muitas vezes, as pessoas não declarar os endereços de memória a variáveis ​​locais, porque eles vão longe, uma vez que a função retorna, o que É por isso que geralmente malloc coisas. Mas sim, você poderia declarar um ponteiro a outra variável local. Não é apenas geralmente feito. Mas eu posso dar uma olhada no que coisa específica depois da aula. É. ALUNO: Eu acho que isso é uma espécie do que está sendo solicitado. Parece estranho para ser inicializado um ponteiro não como um endereço, mas como o parece ser um valor. Parece que o CS50 é o que está dentro a coisa que está sendo apontado e não o endereço real, certo? JASON HIRSCHHORN: Então é isso não é o caso, porém. Não é isso que está acontecendo. Quando você declara uma estrela char, é um endereço de memória. Os ponteiros são todos os endereços de memória apontando para algo mais. Que outra coisa poderia estar no pilha, mas é quase sempre sobre o amontoar na forma como vai vê-lo usado. Mas Nomedestring igual de aspas duplas "GetString", podemos ver isso e nós pode olhar por isso e codificar isso. getString cadeia não está sendo salvo em essa variável, ou o que a string nome não está sendo salvo na medida em que variável, não porque é assim que ponteiros funcionam. Será que isso faz sentido? ESTUDANTE: Yeah. JASON HIRSCHHORN: OK. Felizmente, isso não era confuso para qualquer um. Mas se fosse, nós podemos olhar para ele de novo daqui a pouco, porque na verdade estamos indo codificar algo que venha a trabalhar com cordas e ajudá-lo a sentir-se mais confortável com eles. Quaisquer outras questões relacionadas com estes tópicos ou outros tópicos que Vou colocar de volta? E - agora. Sim, Alden. ALDEN: Então isso é completamente alheios, mas podemos simplesmente passar por cima muito rapidamente o que precisa de saber sobre a diferença entre um 32 e Máquina de 64 bits? JASON HIRSCHHORN: sim. Assim, 32 bits é quantos bytes? ALDEN: É quatro bytes. JASON HIRSCHHORN: É quatro bytes. E 64 bits é quantos bytes? ALUNO: Oito. JASON HIRSCHHORN: Oito bytes. Então, novamente, oito bits é um byte. O seu aparelho é CS50 uma máquina de 32-bit. Assim, os endereços de memória são quatro bytes de comprimento. Existem 2 para o 32 endereços de memória. De 0 a 2 para o 32 menos 1. E eu não sou positivo, mas isso é provavelmente o escopo do que você precisa saber para uma máquina de 32 bits, que a memória endereços são, mais uma vez, quatro bytes de comprimento, e essa é a quantidade máxima de endereços de memória. Além disso, os tipos de dados - isso pode ser algo tão bem, isso é digno de nota. O tamanho de um tipo de dados depende a máquina que você está trabalhando. Assim, um char, um único personagem, é como muitos bytes em nosso aparelho CS50? Um byte. E é realmente um byte como bem em uma máquina de 64 bits. E a maioria dos tipos de dados são o mesmo número de bytes em ambas as máquinas. Mas alguns tipos de dados será diferente em ambas as máquinas. Assim que seria potencialmente única coisa que você precisa saber. Mas mesmo isso, eu acho, está além dos limites - Tenho quase certeza, se você olhar para trás em quizzes velhos, diz que, para assumir codificação problemas que você está usando uma máquina de 32-bit. Mas há, para ir junto com isso em Caso você esteja interessado, há tipos de dados que são os mesmos tamanho em todas as máquinas. Se você já viu algo parecido uint32_t, você pode ou não vi isso. Isso é um tipo de dados. Isso está dizendo, seja de 32 bits não importa o que esta máquina está ligada. Então, quando as pessoas estão escrevendo portátil código, eles provavelmente não vai usar ints. Eles em vez vou usar esses outros dados tipos que sabe que vai ser o mesmo tamanho em cada máquina individual. Madhu. MADHU: Eu tinha uma pergunta sobre o processo de compilação. Então, se você está escrevendo um programa que usa uma biblioteca como CS50 ou algo assim, eu sei que essa biblioteca tem que, em algum momento, ser compilado e ligado dentro Mas quanto do que acontece durante a compilação do seu programa? Que parte desse processo biblioteca ocorre quando você está compilar seu próprio programa? JASON HIRSCHHORN: Então vamos passar por cima em geral, os passos do presente processo. Você escreve seu arquivo c.. Em seu arquivo c., Você # include seu bibliotecas de cabeçalho, por exemplo, cs50.h. O que isso acentuada incluem linha de fazer para o seu programa? Akchar. AKCHAR: Acrescenta os protótipos de as funções a partir do cabeçalho arquivos das bibliotecas. JASON HIRSCHHORN: Exatamente. Acrescenta esses protótipos de função ao seu código. Então, quando seu código está sendo compilado em estágios iniciais, o compilador sabe que essas funções realmente existem, e que em algum lugar eles foram definidos. Os arquivos. H não incluem o definições para estas funções ou como eles realmente funcionam. Cs50.h apenas inclui algo que diz getstring é uma coisa real que pode acontecer. E standardio.h diz printf é uma coisa real que pode acontecer. Portanto, sua linguagem c com isso. Cabeçalho arquivo é transformado em alguns código de leitura óptica, que eventualmente se transformou em binário código, 0 e 1 do. E esse é o código que, em última instância é executado. A l-line CS50 - por exemplo, quando você está escrevendo Clang - e então você incluir-l CS50, que você digita dentro E você vê isso. Quando você escreve faz, você vai ver que line-up aqui. E vamos ver que em um segundo quando codificamos ou mais tarde, quando código. Mas a linha que CS50-l faz algo um pouco diferente do que o # include cs50.h. O que faz linha que-l CS50 fazer? Avi? AVI: Eu quero dizer que ele se vincula a biblioteca para a função chamar, como os arquivos. Ó. JASON HIRSCHHORN: Então muito perto, se não spot-on. A l-CS50 leva o arquivo binário e funde-se com o seu arquivo binário. Então cs50.h, não há ponto de viragem cs50.h da linguagem C para binário cada única hora que ele está sendo usado. Isso seria bobagem, porque isso seria um desperdício de tempo. Por isso, já foi compilado e se transformou em um executável. E agora ele vai ser fundidas com o seu arquivo no final. Portanto, aqueles 1 e 0 estão indo fundir-se com os seus entes e 0 no final. Então, agora você vai realmente ter o real 1 e 0 que definem como getstring, por exemplo, trabalha, ou como printf, por exemplo, funciona. E para mais informações, há uma compiladores curtas que Nate dá que você deve verificar que vai por estas etapas. Mas - Sim. ALUNO: eles estão sempre em arquivos S. quando estão na forma de biblioteca, pronto a ser incorporado, ligado - como eles estão no código binário? JASON HIRSCHHORN: OK. O que - ALUNO: É sempre o caso para as bibliotecas quando você ligá-los? JASON HIRSCHHORN: sim. Portanto, há arquivos, o que será é. S o código de máquina, que também será enigmática para você. Você não precisa se preocupar com esses. Mas, geralmente, sim, eles vão estar no formato. o arquivos prontos para ir. Estudante: Então, quando você enviar para uma biblioteca, não só enviamos o h. eo. o? Você não enviar o. C ou o. S. JASON HIRSCHHORN: So - e este é neste curto, bem como, se esta informação parece vir a pouco rapidamente. Mas o curto em compiladores fala sobre isso também. Quando você envia uma biblioteca, se você enviar o h., o arquivo de cabeçalho, os protótipos de função, ea 1 de e 0 de, isso é tudo que você precisa para dar. Você não precisa dar a forma como o função funciona, o arquivo c.. Porque o ponto de abstração, ou o apontar APIs, o ponto neste SPL, a biblioteca portátil de Stanford, é para você não se preocupar sobre como novo GRect funciona, ou como mover obras, ou como adicionar obras. Tudo o que você precisa saber é que add é uma função que você pode usar, e ele faz isso. Então, você realmente não precisa saber como é escrito em C. Você só precisa sabe, aqui são as funções, o que eles fazer, e aqui estão as de 1 e 0 quando você realmente quiser usá-los. Legal. Mais alguma pergunta sobre compiladores ou de outros tópicos sobre a placa? ALUNO: Eu tenho uma pergunta de implementação de funções recursivas. Uma pergunta sobre a recursividade. Eu tinha a sensação de que iria vir para cima. Então, vamos rapidamente passar por recursão com um específico exemplo, uma função fatorial. Porque este é um exemplo que muitas vezes surge ou é usado para ilustrar a recursividade. Assim, "4!" é lido como 4 fatorial. E o que 4 fatorial significa? O que isso faz? Como calcular 4 fatorial? 4 vezes 3 vezes 2 vezes 1. Assim, uma outra maneira de escrever 4 fatorial é escrever isso. 4 vezes 3 fatorial. Porque 3 fatorial é 3 vezes 2 vezes 1. SO 4 vezes 3 fatorial é 4 vezes 3 vezes 2 vezes 1. É por isso que fatorial é um grande candidato a recursão, porque é claro que não é algo que acontece mais e mais e mais em um menor número de coisas até você chegar ao fim. Quando você chegar a 1, 1 fatorial é 1. Você não pode ir muito mais longe. 0 fatorial também é definida como 1. Então, quando você começa a 1 ou 0, você está no final, e você pode começar a ir para cima. Então, se nós queria escrever uma recursiva função para calcular a fatorial, vamos escrever algum pseudocódigo para isso agora. Antes de escrever que pseudocódigo - Eu vou dar a vocês um par de minutos para escrever o código pseudo ou apenas pensar sobre isso - há duas coisas a cada função recursiva precisa. O que são essas duas coisas? JACK: Ele tem que se identificar. JASON HIRSCHHORN: Noah? Oh, Jack. Vá em frente. JACK: Ele tem que se identificar. JASON HIRSCHHORN: Então uma recursiva função precisa de uma chamada recursiva, uma chamar a si mesmo. Essa é uma. E qual é a outra coisa? JACK: Um caso base. JASON HIRSCHHORN: Um caso base. Um caso base é, aqui é quando paramos. Portanto, sua função é chamada. O caso base vem em primeiro lugar. Você quer saber se você está no final. E se você não está no fim, você fazer a sua chamada recursiva. E você passar por esta função novamente, verificar o seu caso base novamente. Se você não é o fim, você faz outra chamada recursiva, et cetera, et cetera. É por isso que funções recursivas sempre precisar desses casos base e aqueles chamadas recursivas. Se você não tem uma chamada recursiva, ele não seria uma função recursiva. Se você não tem um caso base, você iria para sempre e não haveria final. E o caso base sempre vem em primeiro lugar, porque você vai sempre querer verificar se você estiver no final primeiro. Então, antes de fazer algum pseudocódigo, por que você não dê um minuto para pensar sobre como uma função fatorial recursiva seria escrito? Além disso, como muitos como você está fazendo, escrita -lo em uma folha de papel é o que você vai ter que fazer sobre o teste de amanhã. Então, provavelmente, uma boa prática para fazer Certifique-se o código que você está escrevendo para baixo na folha de papel - ou você pode fazer isso. Você sabe onde as vírgulas são. Você se lembra da sintaxe. Porque você não está ser capaz de ter uma compilador dizer que você fez um erro. Além disso, ao longo destas linhas, amanhã, quando você tem problemas de codificação, se você está apressado para o tempo, ou se você estiver muito confuso a respeito de como você deveria escrever a coisa particular em c, é caberia a escrever pseudo-código ou escrever comentários no bem. Porque não há crédito parcial para um Muitas das perguntas sobre o quiz. Então você pode ser apressado, ou você só poderia ser confundido. Escrevendo em comentários ou pseudo-código são frequentemente formas que pode obter crédito parcial. Portanto, não deixe algo em branco no questionário. Não há penalidades para colocar as coisas dentro Na verdade, colocando em pseudo-código ou Comentários vai ajudar o aluno descobrir se você realmente sabe o que você está falando, e talvez prêmio lhe algum crédito parcial para isso. Também nesse sentido, escrever com clareza. Se nós não podemos realmente o que você está escrevendo, não vamos chamá-lo à meia-noite de amanhã a figura o que você escreveu. Nós apenas estamos indo para tirar pontos. Escreva de forma clara para que possamos ouvir, ou melhor, podemos ler o que você escreveu. E se ele diz duas frases, não escreva um parágrafo. Siga as instruções. Escrever de forma clara. E escrever nestes comentários ou pseudocódigo para questões que poderiam crédito parcial prêmio. OK, vamos ao fatorial. Portanto, temos uma função fatorial. Se eu fosse realmente escrever isso em C, o que eu preciso para colocar antes do nome da função? O tipo de retorno, o qual, neste caso, vamos dar-lhe int. E, em seguida, dentro das chaves, é o que se passa dentro das chaves para uma função? ESTUDANTES: tipo de argumento. JASON HIRSCHHORN: Os seus argumentos. Então, provavelmente, fatorial tomar um argumento. Ele provavelmente vai ter apenas um argumento. E vamos dizer que vai demorar um inteiro chamado x. E mais uma vez, ao escrever o protótipo de uma função ou escrever a função em seu código antes de defini-la, você escrever o tipo de dados e o nome essa variável para apenas essa função. Assim, você pode passar um número para este função, ele vai ser referido como x internamente. Nós temos nossa função fatorial. Precisamos de duas coisas, um caso base e uma chamada recursiva. O que é o caso base para fatorial? Alguém que escreveu-lo e que não tem falado ainda, o que é a base caso para fatorial? ALUNO: Se n é menor de 2, retornar 1. JASON HIRSCHHORN: Se n é inferior a 2, retornar 1. Eu gosto disso, porque isso cuida de 0 e 1. Então, vamos fazer x <2, o retorno 1. Se conseguir passar 0, se tivermos passou 1, esta função retornar imediatamente 1. Se conseguir passar algum número maior ou igual a 2, vamos temos nossa chamada recursiva. E então, como é que vai funcionar? Pode alguém que trabalhou neste que ainda não tenha falado me dar a chamada recursiva para esta função em pseudocódigo? Se conseguir passar em um número x e é superior a 2, o que que queremos fazer? Temos também um exemplo escrito no lado que pode lhe dar uma dica. ESTUDANTE: Call x vezes o fatorial de x menos 1? JASON HIRSCHHORN: Exatamente. Nós vamos voltar x vezes o fatorial de x menos 1. E isso, mesmo que eu escrevi, basicamente, o que você disse em Inglês, esta função fatorial será chamado novamente. Ele vai executar em x menos 1. Vai voltar com algum inteiro, e então ele vai multiplicar estes dois em conjunto, e esse valor será voltou para o que chamou este função fatorial, o que pode ser outra instância do esta função fatorial. Assim que é um exemplo de um recursiva função, uma muito função recursiva simples. Mas a maioria deles vai ser assim. Se você gostaria de um bom recursiva desafio para o teste, tente codificação busca binária recursiva. Porque se você fez a busca binária para conjunto de problemas de três, você provavelmente fez isso iterativa em um loop while. Mas também pode ser escrito de forma recursiva. Você está indo a necessidade de escrever o seu próprio função separada que leva algum diferentes argumentos de linha de comando - ou nem argumentos de linha de comando, alguns diferentes argumentos apenas regulares. Mas você pode escrever de busca binária recursivamente bem. ALUNO: Então você poderia ter escrito também, em vez de x menos 1, você também poderia ter escrito x menos menos, ou você poderia ter escrito menos menos x. Você pode apenas explicar muito rapidamente porque esses seriam coisas diferentes, como o que é a diferença entre x menos menos e menos menos x? JASON HIRSCHHORN: Não, eu não sou vai entrar nessa. Mas vou falar com você sobre isso depois classe. x menos menos, menos negativo x diminuir x por 1. Mas eles fazem isso um pouco diferente. Mas eu não quero entrar em detalhes. Outras perguntas sobre recursão ou esta função? Isso não é realmente mesmo pseudocódigo. Isso é basicamente o código C você escreveria para isso. OK, quaisquer outras perguntas sobre temas aqui em cima? É. ALUNO: Eu tenho um rápido resumo ponto flutuante de precisão e. JASON HIRSCHHORN: Flutuante ponto e precisão. Pode alguém realmente rapidamente dê-me um resumo de ponto flutuante e precisão? Todos vocês tiveram que fazer isso para o seu conjunto de problemas, de modo que você é tudo familiarizado com ele. Ou talvez não todos vocês. Qualquer um? Dê-me um ponto de começar. Ponto flutuante e precisão. Qual é o problema? Sim. Victoria? VANESSA: Vanessa. JASON HIRSCHHORN: Vanessa. Desculpe. VANESSA: Há apenas um número finito de números que podem ser representados porque você está em um em nossa caso, um sistema de 32 bits. Então você meio que tem que fazer-se alguns números. JASON HIRSCHHORN: Então é isso exatamente correto. Há apenas uma certa quantidade de números que podem ser representados. Se você multiplicar dois números muito grandes, pode transbordar a quantidade de espaços que você tem de representar um inteiro. É por isso que às vezes nós usamos um long long em vez de um int. Isso tem mais espaços. Que pode conter um número maior. Ponto flutuante de precisão tem a ver com que, mas também tem a ver com o fato de que os números decimais são Nem sempre representados. Desculpe. Deixe-me colocar isso de volta. O número decimal 1.0 nem sempre é representado como seria de esperar, 1,000 milhões. Às vezes é representado como 1,000000001 ou 0,999999999. Pode-se até mesmo 89 jogados em algum lugar. Assim, os números decimais não são representado exatamente como você faria esperar que eles sejam representados. Assim, no conjunto de problemas - era dois? - conjunto de problemas dois, onde lidamos com números de ponto flutuante, quando queríamos los para representar exatamente o que queríamos los para representar o número de moedas de um centavo, ou o número de centavos, nós multiplicá-los por 100. Nós viramos eles. E, então, cortar tudo atrás do ponto decimal. Isso era para garantir que eles iriam realmente igual exatamente o que queríamos los para igualar. Porque quando você toma algo que é a flutuar e transformá-lo em um int, você cortar tudo para a direita do ponto decimal. Porque há algum ponto flutuante imprecisão, 100.000 poderiam ser representada como 99,999999999. E se você acabou de cortar tudo para o direito de imediato, você vai obter o número errado. É. ALUNO: Eu tinha uma pergunta sobre o elenco. Que ordem ele ocorre em? Se você faria flutuar, suportes, 1 dividido por 10, ele faz 1 dividido por 10, em seguida, obter 0,1, em seguida, ligue -lo em um carro alegórico? JASON HIRSCHHORN: Se você fizer flutuar 1 dividido por 10 - ALUNO: Sim, e, em seguida, é igual a - Bem, seria normalmente tê-lo em igual - É. Você quer torná-lo um carro alegórico, certo? JASON HIRSCHHORN: OK, então vamos usar isso para segue em descobrir as respostas a estas perguntas através de codificação. Porque você provavelmente vai ter um monte de estas perguntas minutos, e uma boa maneira para resolvê-los é através da codificação. Então, nós estamos indo para codificar isso agora, e então vamos voltar e codificar a pergunta que você tinha. Assim, a primeira linha - Eu não deveria ter escrito - o que é a primeira coisa que queremos fazer quando abrir um novo arquivo no gedit? ALUNO: Incluir. JASON HIRSCHHORN: Incluir o quê? ALUNO: biblioteca CS50. JASON HIRSCHHORN: OK. O que mais devemos incluir? Nós apenas estamos indo para verificar o que acontece quando você lançar algo a uma bóia. Mas o que precisamos incluir, se estamos vai escrever um programa em C? ALUNO: Padrão I / O. JASON HIRSCHHORN: stdio.h. Nós realmente não precisa, para este programa, cs50.h, mesmo que seja sempre útil para incluí-lo. Mas nós sempre precisamos stdio.h. ALUNO: Quando a codificação em C? JASON HIRSCHHORN: Quando a codificação em C. Então eu salvá-lo como este arquivo c.. Eu recebo algum bom destaque de sintaxe. Escrevi vazio dentro principal. O que o vazio significa? ALUNO: Não tomar qualquer argumentos de linha de comando. JASON Hirschhorn: meio vazio, neste caso, o principal não assume qualquer argumentos de linha de comando. Em outros casos, isto significa que a função não leva argumentos de linha de comando. Ou a função, se eu fosse escrever vazio main (void), que diria principais do não devolver nada. Então vazio só não significa nada. O que eu iria escrever, se eu fosse ter argumentos de linha de comando? ALUNO: int arco c corda do arco v JASON HIRSCHHORN: int argc argv string. É isso mesmo? ALUNO: É carac suportes estrela argv. JASON HIRSCHHORN: Então você poderia escrever suportes de corda argv ou char estrela argv colchetes, mas você precisa dos colchetes. Porque argv é um array de cordas, lembre-se. Não é apenas uma string. Então corda argv é, aqui está uma corda chamado argv. Suportes de Cordas argv é, aqui está uma matriz de strings. Então int argc argv suportes cadeia seria algo que eu provavelmente escrever. Então você queria salvar em um inteiro? ALUNO: Sim, inteiro. Ou, em um carro alegórico. JASON HIRSCHHORN: Em uma bóia? Como, float x é igual a 1 dividido por 10. JASON HIRSCHHORN: OK. Como faço para imprimir um float em printf? O quê? ALUNO:% f. JASON HIRSCHHORN:% f. O que é um número inteiro? d ou i. O que é uma string? ALUNO: s. JASON HIRSCHHORN: s. Como faço para obter uma nova linha? ALUNO: barra invertida n. JASON HIRSCHHORN: O que eu retorno se principal é executado corretamente? ESTUDANTE: 0. Preciso escrever essa linha, embora? ALUNO: Não. OK, não vamos escrevê-lo, então. Qualquer pessoa pode ler isso? Parece um pouco pequeno. Todos podem ver, ou deveria Eu torná-lo maior? Acho que para a câmera, vamos fazer um pouco maior, no entanto. JASON HIRSCHHORN: Se eu quero transformar este . C arquivo em um arquivo executável, o que que eu escrevo? ESTUDANTE: Faça teste. JASON HIRSCHHORN: Desculpe? ESTUDANTE: Faça teste. JASON HIRSCHHORN: Faça teste. Nós estávamos falando sobre esta linha anterior. Clang. O que há de bumbum? O nome do compilador. O que é essa linha? ALUNO: Define-lo para uso de GDB. JASON Hirschhorn: Define -lo para uso de GDB. Esta linha, que é isso? ALUNO: O código-fonte. JASON HIRSCHHORN: Esse é o arquivo de origem, o arquivo c.. O que essas duas linhas de fazer? Ou estes dois não linhas. ALUNO: It nomes que testar. JASON HIRSCHHORN: Então o traço o diz, nomeá-lo algo diferente. E aqui você está chamando-o de teste. Se eu não tenho isso em, o que seria o nome disso? ALUNO: a.out. JASON HIRSCHHORN: a.out. O que isso faz? ALUNO: Ligações da biblioteca matemática. JASON HIRSCHHORN: Liga a biblioteca matemática. Nós não incluir a biblioteca de matemática, mas já que é tão comum, eles têm make escrito para incluir sempre a biblioteca de matemática. E da mesma forma, isso inclui a biblioteca de CS50. OK, então se listar, agora temos um executável chamado teste. Para executá-lo, eu escrevo teste. Eu vejo que o meu ponto flutuante, como esperado, é igual a 0. Será que isso - so - Estudante: Então, se você colocar flutuar agora, como você lançá-lo como float - JASON HIRSCHHORN: Elenco o 1 a uma bóia? ALUNO: Não, atire a coisa completa - sim. Se você acabou de fazer isso, não que fazê-lo de 0,1? JASON HIRSCHHORN: OK, então muito rapidamente, 1 dividido por 10, são inteiros sendo dividido. Então, quando você dividir inteiros, eles são 0, e você está salvando que 0 em um flutuar, porque a barra está apenas divisão inteira. Então agora estamos transformando algo em um carro alegórico. Vamos ver o que acontece. Nós vamos fazer teste. Então, agora vemos que esse corte não era divisão inteira, ele estava flutuando divisão ponto. Porque um dos seus argumentos tinha sido convertido em um float. Então, agora ele estava dizendo, tratar esta divisão como estamos lidando com Os pontos de flutuação, não com números inteiros. E, assim, obter a resposta que esperamos. Vamos ver o que acontece - oops. Se eu quisesse imprimir mais decimal manchas, como eu poderia fazer isso? ALUNO: Ponto ponto f, ou como muitos casas decimais que você deseja. JASON HIRSCHHORN: Então eu imprimir 10 pontos decimais. E agora vemos que estamos recebendo algumas coisas estranhas. E isso vai voltar para a sua pergunta cerca de ponto flutuante imprecisão. Há coisas estranhas armazenados aqui. OK, isso responde sua pergunta? O que mais você quer para codificar rapidamente? ALUNO: Eu só queria ver se ou não, se você liberou alguns ponteiro, se esse ponteiro ainda tinha armazenado em que o endereço que tinha sido apontando para anteriormente. JASON HIRSCHHORN: OK, então vamos fazer isso. Char ptr estrela, isso cria uma variável chamado ptr do tipo char estrela. Como faço para escrever malloc? Alden? ALDEN: Apenas malloc. Mas, então, ele tem que ser o tamanho de, e neste caso, eu acho que você estar apontando para char. Assim, seria de char. JASON HIRSCHHORN: OK, então mais genericamente, Dentro - vamos editar. Dentro malloc, você deseja que o número de bytes na pilha. Geralmente, o que temos visto que estamos fazendo é que estamos indo para malloc cadeias, por exemplo, ou matrizes de inteiros. Portanto, se queremos 10 inteiros, ou 10 caracteres, 10 nos dará 10. E, em seguida, tamanho de caracteres daria nos de que o tamanho de caracteres, que na Neste caso, é de 1 byte. Ficamos com 10 bytes. Se fôssemos escrever tamanho de int, que nos daria 40 bytes. Então, mais genericamente, dentro de malloc é o número de bytes que você deseja. Neste caso, estamos recebendo um byte. Que parece ser um uso estranho de malloc, mas para o nosso propósitos faz sentido. Portanto, não é isso. Vamos chamar livre. Nós se livrar dele e usamos ptr novamente. E o que você deseja verificar? ALUNO: Eu só queria verificar se houve ou não qualquer coisa no interior do mesmo. JASON HIRSCHHORN: Então, se ele apontou para alguma coisa? ALUNO: Sim, exatamente, se ele ainda tinha um endereço de memória. JASON HIRSCHHORN: Então você quer para verificar o valor do PTR? ALUNO: Sim, exatamente. JASON HIRSCHHORN: O que eu escrevo aqui se eu quiser verificar o valor do ponto - o que é, na Jordânia Dito isto, o valor? Ou o que é armazenado dentro do PTR? ESTUDANTE: Um endereço de memória. JASON HIRSCHHORN: Um endereço de memória. Então, se eu escrevo apenas isso, ele vai dá-me o valor de ptr. E como faço para imprimir um endereço de memória? Qual é a string de formato para um endereço de memória? ALUNO:% p. JASON HIRSCHHORN:% p. % S é uma string. % P para ponteiro. É isso mesmo? Isso é certo. Então ptr é igual - ainda tem algo no mesmo. Este é provavelmente um maior pergunta interessante. O que é que essa linha faz? ALUNO: Seg falhas. JASON HIRSCHHORN: O quê? ALUNO: Eu acho que SEG falhas. JASON HIRSCHHORN: Hm? ALUNO: Eu acho que vai SEG culpa. JASON HIRSCHHORN: Então esta linha de código, estrela ptr, o que que a estrela significa? ESTUDANTE: Conteúdo. JASON HIRSCHHORN: Yeah. Vá para obter o conteúdo de. Portanto, este está indo para ir para a memória dirigir lá e me dar isso. Eu costumava% c certo aqui, porque há são personagens armazenados lá. Então, nós estamos indo para ir para que endereço acabei de ver - ou ele provavelmente vai ser um pouco presente diferente vez que executar o programa. Mas vamos para esse endereço que sabemos que ainda existe e ver o que está lá. Então não SEG culpa. Ele só não nos deu nada. Ele poderia ter realmente nos deu alguma coisa, nós apenas não podemos vê-lo. E isso vai voltar a essa idéia - e nós não vamos conseguir muito em isso, porque isso é para além da escopo deste curso. Mas falamos aqui, se nós foi além dos limites da matriz por 1, podemos não ficar em apuros. Às vezes, quando você acabou de sair por 1, você está fazendo algo errado, e você poderia ficar em apuros. Mas nem sempre você terá problemas. Depende de quanto de uma coisa ruim você não, você vai ficar em apuros. O que não quer dizer, ser desleixado com o seu código. Mas é para dizer que o programa não sempre desistir, mesmo se você ir a algum lugar você não deveria ir. Um bom exemplo do que é, um monte de pessoas em seu conjunto de problemas 3, que tinha 15 anos, não se verifique a limites da placa. Então você olhou para a esquerda, olhou para o direita, olhou para cima, olhou para a parte inferior. Mas você não verificar para ver se o topo foi realmente vai ser na placa. E um monte de pessoas que fizeram isso e virou-se que em, seu programa funcionou perfeitamente, porque sempre que este era armazenados na memória, se você fosse um acima, ou verificado que a memória endereço, não havia nada particularmente horrível sobre isso, para que o seu programa não era vai gritar com você. Mas ainda iria decolar pontos se você não verificar isso, porque você estavam fazendo algo que você não estava deveria fazer, e você poderia ter ficado em apuros. As probabilidades são, no entanto, você provavelmente não o fez. Então, isso é para mostrar que, sim, ainda podemos ir a ele. E nós não vamos a problema neste caso. Se tentássemos fazer ler a próximos 100 caracteres, teríamos provavelmente terá problemas. E você pode codificar a ler o próximo 100 caracteres, se você quiser, fazendo algumas espécie de loop for. É. ALUNO: Desde que foram atribuídos que espaço um valor real, não teríamos realmente ser capaz de ver nada. Devemos tentar com a criação que igual a gostar c ou algo assim? JASON HIRSCHHORN: Ótima pergunta. Como faço para configurar esse valor - que linha de código que eu escrevo na linha sete para fazer o que você disse? ALUNO: Estrela ptr iguala único Citação c acabar aspas simples. JASON HIRSCHHORN: Para que está colocando um personagem, c, naquele local, porque mais uma vez, que a estrela significa ir para lá. E quando usado do lado esquerdo do um operador de atribuição, que é igual a assinar, nós não vamos conseguir que valor tanto como definido esse valor. Agora vamos ver o que acontece. Nós colocamos algo lá e foi lá. Chamamos livre. Algumas coisas provavelmente aconteceu na pilha. Portanto, não é mais lá. Mas, novamente, não estamos recebendo em apuros para ir lá. Estou fazendo isso em código para ilustrar que muitos destes perguntas que você tem, eles são realmente interessante responde a um monte de tempo. E eles estão realmente boas perguntas. E você pode entendê-los em seu próprio, se, por exemplo, não estamos na seção. É. ALUNO: Porque você não está enviando o ponteiro em qualquer lugar, você precisa de usar malloc? JASON HIRSCHHORN: Então, isso vai voltar à sua pergunta inicial. [? ?] É apenas uma variável local? Malloc aqui não é que convincente. O uso de malloc aqui não é que convincente porque é apenas uma variável local. ALUNO: Então você poderia fazer de char estrela ptr é igual Olá? JASON HIRSCHHORN: Ah. Então, vamos agora voltar à sua pergunta inicial. Eu acho que você não estavam satisfeitos com a minha resposta. OK? Assim? ESTUDANTE: Yeah. Espere. JASON HIRSCHHORN: E onde que você quer imprimir? Então, vamos imprimir uma string assim? ESTUDANTE: Interessante. JASON HIRSCHHORN: Então, isso diz que esta argumento tem o tipo de caráter. Portanto, este deve ser um personagem. ALUNO: só tem o primeiro. JASON HIRSCHHORN: Então isso é o que eu disse antes. Como eu disse, ele não está armazenando o corda dentro ponteiro variável. É o armazenamento - ALUNO: O primeiro valor da cadeia. JASON HIRSCHHORN: O endereço de o primeiro valor da seqüência. Se tivéssemos que imprimir isso, estamos ficando o valor dentro do ponteiro. E vamos ver que é, de fato, um endereço de memória. Será que isso faz sentido? Desculpe. Espere, isso responde a sua questão, embora? ESTUDANTE: Yeah. JASON HIRSCHHORN: Esta linha de código é criando uma string e depois outro ponteiro variável que está apontando para essa seqüência, essa matriz. É. Estudante: Então, se nós fomos uma memória aprofundar, se chegarmos a horas? Tem sido armazenado como uma string? JASON HIRSCHHORN: Como, nós fizemos - por isso este é valioso para fazer. Este é o ponto de aritmética, que vocês tenha visto antes e deve ser relativamente confortável. Isto é semelhante a escrever - se fôssemos escrever esta linha de código, temos visto a notação de matriz antes. Isso deveria nos dar a segunda valor neste array, h. Se fizéssemos isso, isso também deve dar nós o segundo valor do array. Porque ele não vai para a memória endereço do primeiro lugar, mas o endereço de memória da coisa que se acabou. E então os dereferences operador estrela esse ponteiro. E mais uma vez, vamos ver. Recebemos h novamente. ALUNO: O que exatamente faz dereference significa? JASON HIRSCHHORN: Dereference é uma palavra chique para ir. Ir para isso e obter o que está lá é para excluir a referência de um ponteiro. É apenas uma palavra chique para isso. ALUNO: Se quiséssemos impressão a corda toda, poderíamos fazer ponteiro e comercial? JASON HIRSCHHORN: OK, estamos vai fazer uma pausa aqui. Vamos terminar aqui. Ampersand dá-lhe o endereço de um localização, por isso, quando você faz comercial de uma variável, que lhe dá o endereço onde a variável está armazenada. Ponteiro Ampersand lhe dará a endereço de onde ptr ptr está na memória. Nós não estamos indo para ir em com este exemplo. Você pode descobrir estes as coisas por conta própria. Mas, novamente, isso pode até ser uma beirando pouco além do que você precisa saber para o âmbito do presente intercalar - ou este teste, melhor dizendo. Desculpe. Vamos seguir em frente, porque eu faria gostaria de fazer um problema de codificação antes do tempo é para cima. E nós estamos indo para codificar o que eu penso é a mais convincente delas exemplos, atoi. Portanto, esta foi uma pergunta sobre um quiz, há dois anos. E eu tenho isso no conselho aqui. Pessoas foram convidados para o teste - eles receberam um pouco mais em tesxt a pergunta, mas eu eliminou o texto, porque não era necessário para os nossos propósitos agora. Foi apenas algumas fundo em que atoi fez. Mas todos sabem e são muito familiarizado com atoi. Sugiro que este código sobre uma folha de papel. Sugiro também que você usar a estratégia que já sabemos muito em nossa seção. Primeiro, certifique-se de compreender atoi que está fazendo. Faça um desenho ou chegar a algum imagem mental do que em sua cabeça. Em seguida, escreva o pseudocódigo para isso. No questionário, se tudo que você recebe é pseudocódigo, pelo menos você colocar algo para baixo. E, em seguida, mapear esse pseudocódigo para C. Se você tem um cheque em seu pseudocódigo, como verificar se algo é 1, que mapeia para um caso estado e assim por diante. E, finalmente, o código do programa em C. Então volte para atoi e levar cinco minutos para este código em uma folha de papel, que é, provavelmente, sobre a quantidade de tempo que você levaria em uma quiz para atoi código. Cinco a 15 minutos, de cinco a 12, para cinco 10 minutos, é sobre a quantidade de tempo que você gastaria neste pergunta no questionário. Então, levar cinco minutos, por favor. E se você tiver alguma dúvida, levantar sua mão e eu vou chegar perto. [conversas paralelas] JASON HIRSCHHORN: OK, então que foi de cinco minutos. Essa foi, provavelmente, sobre a quantidade de tempo que você gastaria em que, em um teste, talvez a baixa final da época. Vamos recapitular um pouco. Vamos começar a programar isso. E se nós não temos todo o tempo, as respostas para este e este questionário questão estão disponíveis, mais uma vez, Outono de 2011 é quando esta pergunta apareceu no quiz. E valeu a pena de oito pontos em seguida, o questionário. Oito pontos é na parte alta da quantidade de pontos de algo vale a pena. A maioria das perguntas estão na faixa de um a seis pontos. Portanto, esta é uma mais desafiador pergunta, com certeza. Alguém pode me fale? Geralmente, o que vamos querer fazer com essa funcionar atoi, logicamente? O que queremos fazer? Então vamos escrever alguns pseudocódigo. ESTUDANTE: Converter caracteres em números inteiros. JASON HIRSCHHORN: Converter caracteres em números inteiros. OK. Então, quantos personagens somos nós vai precisar para passar? ALUNO: Todos eles. ALUNO: Todos os personagens na seqüência. Jason HIRSCHHORN: Todo o caracteres na string. Então, se nós queria passar por todos os caractere em uma string, o que é uma coisa em C vimos que tem permitido nós que passar por todos os caractere em uma string? ALUNOS: Um loop for. JASON HIRSCHHORN: Um loop for. Então, nós estamos indo para percorrer cada personagem em s. Então, o que vamos querer fazer quando temos um personagem específico? Digamos que está se passou a 90. Ficamos com a 9. É um personagem. O que nós queremos fazer com que o personagem 9? ALUNO: subtrair caráter 0? ALUNO: Adicionar 0? JASON HIRSCHHORN: Subtrair lo do caráter 0? ESTUDANTE: Yeah. JASON HIRSCHHORN: Por que você quer fazer isso? Estudante: [inaudível] valor. Seu valor int. JASON HIRSCHHORN: OK, então tomamos o caráter 9, subtrai-lo a partir de caractere 0 para obter uma inteiro real 9. Doce. E como você sabe que o personagem 9 menos 0 personagem é 9? O gráfico que você olhar? ALUNO: Há nove logicamente lugares entre 9 e 0. Ou você pode olhar para a tabela ASCII. JASON HIRSCHHORN: tabela ASCII. Mas sim, você está correto também. Então subtraímos 0. Portanto, agora temos o inteiro 9. E o que nós queremos fazer com isso? Se tivermos 90, é o primeiro número inteiro temos, o que queremos fazer? ALUNO: Eu colocaria em um inteiro temporário matriz, em seguida, fazer a matemática para ele mais tarde para fazê-lo em um fim. JASON HIRSCHHORN: OK. ALUNO: Você pode começar no final de a matriz e, em seguida, seguir em frente assim que cada vez que você se move para a frente, você multiplicá-lo por 10. JASON HIRSCHHORN: OK. Isso soa como uma bonita idéia atraente. Podemos começar no final de nossa matriz, e podemos usar strleng. Podemos usar strleng aqui. Vamos obter o comprimento da nossa string. Começamos no final. E + o primeiro, só levamos isso inteiro, e talvez nós criamos como um nova variável inteira em cima onde estamos armazenando tudo. Então, nós loop através de cada caractere em s de trás para a frente, subtraímos 0, e então vamos levá-lo, e, dependendo da onde ele está, nós multiplicá-lo por uma potência de 10. Como o primeiro, o que é que vamos multiplicar o caractere mais à direita por? ALUNO: 10 ao 0. JASON HIRSCHHORN: 10 a 0. O que queremos multiplicar o segundo mais à direita de caracteres por? Estudante: [inaudível]. JASON HIRSCHHORN: O quê? ALUNO: 10 para a 1. Jason HIRSCHHORN: 10 para o 1. O personagem terço mais à direita? ALUNO: 10 para a 2. Jason HIRSCHHORN: 10 para o 2. ESTUDANTE: Desculpe, eu não entendo o que estamos fazendo aqui. JASON HIRSCHHORN: OK, Vamos voltar, então. Então, nós estamos indo para obter aprovada em uma string. Porque estamos escrevendo atoi. Por isso, são passadas em uma string. Digamos que está se passou na seqüência de 90. A primeira coisa que vamos fazer é definir uma nova variável inteiro que nós somos só vai criar como o nosso novo inteiro. Isso é o que vamos para retornar no final. Precisamos passar por todos os personagens a corda porque temos determinado que precisamos para tocar cada um e em seguida, adicioná-lo ao nosso novo inteiro. Mas não podemos simplesmente adicioná-lo como um número. Não podemos simplesmente pegar e 9 adicionar 9 ao nosso inteiro. Depende de que lugar é na cadeia. Nós vamos precisar de multiplicar ele por uma potência de 10. Porque é assim que 10 obras de base. Então, nós estamos indo para obter o real personagem, ou o número inteiro real número, por caractere 0 subtraindo de caráter 9 como fizemos com subtraindo capital caráter A partir de tudo o que personagem que tinha em um dos esses problemas. Então, vamos realmente ter um número de 0 a 9 salvo como um número real, e nós vamos multiplicá-lo por uma potência de 10, dependendo de onde estamos na corda. E então nós vamos adicioná-lo de volta em nossa nova variável inteira. Então, o que seria algo como faria ser - vamos chamar aqui. Se conseguir passar na seqüência de 90 - Estudante: [inaudível]. JASON HIRSCHHORN: Mas atoi recebe uma string. Então vamos passar por da exploração. Vamos ter passado em 90. Nós vamos na parte de trás para a frente. Tomamos a 0. ALUNO: Eu sinto muito. Talvez isso é estúpido. Se estamos a ser aprovada em uma corda, por que é de 90 o que estamos se passou em? Porque 90 é um inteiro. JASON HIRSCHHORN: Porque atoi leva um string e transforma-lo em o inteiro representação dessa string. Mas a corda 90 não é o número inteiro 90 ou o número 90. A seqüência de 90 é um conjunto de dois ou três personagens, ao invés, a 9 caráter, o personagem 0, e a barra invertida 0 personagem. E nós estamos escrevendo atoi porque, por exemplo, quando você toma o comando argumento de linha, e é guardada em argv, é guardada como uma string. Mas se você quer tratá-lo como um número, você precisa convertê-lo em um inteiro real. Que fizemos um dos nossos conjuntos de problemas. Que fizemos em um número dos nossos conjuntos de problemas. Todo mundo que teve um número inteiro como um argumento de linha de comando. É por isso que a nossa função atoi recebe uma string. Então, novamente, no nosso exemplo aqui, estamos vai tomar o último. Nós estamos indo para subtrair o caráter 0 dele, porque os personagens 0 subtraído pelo personagem 0 dá-lhe o número real de 0, de acordo com a a matemática ASCII que fazemos. Como os caracteres são representados como diferente do que o seu real - o caráter de um, por exemplo, minúsculas é um 97. Não é - oops! Não é o que você esperaria que seja, 0, por exemplo. Então você tem que subtrair o caráter de um para chegar a 0. Então, vamos fazer isso aqui para obter o número real. E então nós estamos indo para multiplicá-lo por uma potência de 10, dependendo de onde ele é na cadeia, e depois tomar esse e adicioná-lo ao nosso espaço reservado variável, para que possamos chegar a nosso inteiro novo final. Será que faz sentido para todos? Então, nós não estamos indo para este código agora, porque estamos ficando em curto tempo. Peço desculpas pelo tempo do que isso. Mas isso é o que, esperamos, você faria ser capaz de fazer no questionário - no muito menos, obter este pseudocódigo escrito. E então, se fôssemos escrever o pseudocódigo, na verdade, poderíamos fazer isso muito rapidamente. Cada linha de comentários que nós escrevemos aqui se traduz em cerca de uma linha de código C. Declarando uma variável nova, escrita um loop, alguns subtração, alguns multiplicação, e alguns atribuição. Nós provavelmente também querem escrever uma linha de retorno. Também pode querer colocar algumas verificações aqui. É. ALUNO: Então podemos tratar s como a seqüência real? Porque eu sei que é apenas um endereço. Como, como você obter o comprimento de a corda que está sendo passado através de? JASON HIRSCHHORN: Então, como é que o comprimento de uma corda? Strlen. ALUNO: strlen, sim. Mas você pode colocar s como o argumento para isso? JASON HIRSCHHORN: Então strlen leva uma estrela de char. E segue-se que a estrela char, e mantém a contagem até que se chega a um barra invertida 0. strlen era realmente um dos outros programas que iam código. Essa é outra boa para código. Esse é um pouco mais fácil, porque se você vai pensar sobre isso conceitualmente - Eu apenas disse em voz alta - strlen segue um ponteiro e continua indo e contar e manter o controle até chegar a uma barra invertida 0. ALUNO: OK, entendi. JASON HIRSCHHORN: Então, o melhor de sorte no teste 0 amanhã. Se você tiver alguma dúvida, eu vou estar fora após esta. Sinta-se livre para me e-mail. Estenda a mão para seu próprio TF se você é não em minha seção, ou buscar o meu enviar e-mail, se você quiser. Se você quer surtar e basta enviar me um e-mail, um e-mail freakout, eu vou mandar de volta, assim como, um rosto sorridente, ou, tipo, uma piada ou algo assim. Então, fique à vontade para fazer isso também. Boa sorte mais uma vez, e eu vou ver todos vocês na próxima semana.