Restrição de memória do DOS

0 comentários
Olá,

Quando a microsoft fornecia DOS 5.x a restrição de memória era de 1 Mb. Devido a isso, o s.o era acusado injustamente de ser extrememente limitado, mas, vou mostrar que não é limitação dele e sim do PC.

O PC possuia um registrador de segmento de 16 bits e um de deslocamento de 16 bits Assim, ele pode referenciar 65536 endereços e cada um com 16 bits. logo, 1048576
(65536 * 16) posições de memória poderiam ser referenciadas, equivalendo a 1 Mb.

Atualmente, o tipo DWORD de 32 bits do Windows pode referenciar mais de 4 Gb de RAM.

Sobrecarregando operadores em C++

0 comentários
Olá,

Os compiladores de C++ possui definições padrão para os operadores.
Ex:
int + int
float + float
...

E assim, por diante.
Mas, para a maioria deles a soma de duas cadeias de caractéres é um erro.
Exemplo de código inválido:
...
char* str1 = "aaa";
char* str2 = "bbb";

char* str3 = str1 + str2;

Mas, muitos compiladores (e.g: g++, bcc32) permitem sobrecarga de operador. Ou seja, é adicionar uma nova assinatura (sem alterar o número de argumentos) e comportamento a um operador.
Ex:
Podemos fazer com que seja possível somar um double com um array de char. Isso é muito esquisito, então, vamos fazer com que seja possível somar duas cadeias de caractéres.

A sobrecarga de operador aplica-se indivudualmente as classes (talvez, haja um jeito de sobrecarregar para todas).

A sintaxe é:
tipo-retorno nome-classe::operator # (lista-argumentos)

Nesse link está a minha classe
String.

O operador de adição foi sobrecarregado para receber um ponteiro de char (cadeia de caractéres) e concatenar com o buffer corrente e incrementar a variável que denota o tamanho da string.

Agora, é possível fazer a seguinte operação:
String str1 = "aaa";
String str2 = str1 + "vvv";

Mas, não é possível imprimir na tela o objeto de uma string.
Exemplo de código inválido:
String str1 = "sss";
cout << str1;

Então, para que o código de cima seja válido temos de sobrecarregar o operador "<<" de um cout.

No mesmo link esse operador já foi sobrecarregado.

Não é permitido sobrecarregar:
.
.*
::
?:

Criando Processos em Windows usando C

0 comentários
Olá,

Para criar um executável Windows escrito em C que cria um novo processo veja o seguinte código:
#include "<"windows.h">" // aspas inseridas para tags aparecerem

int main(int argc, char **argv) {
PROCESS_INFORMATION pi; /*preenchido em CreateProcess */

STARTUPINFO si;
GetStartupInfo(&si);

CreateProcess(NULL, /* Nome do módulo executável*/
"notepad.exe", /* String da linha de comando */
NULL, /* Atributos de segurança do processo */
NULL, /* Atributos de segurando do encadeamento*/
FALSE, /* Sinalizador indicativo de herança */
DETACHED_PROCESS, /* Sinalizadores de criação */
NULL, /* Ponteiro para o novo bloco de ambiente */
NULL, /* Ponteiro para o diretório atual */
&si, /* Ponteiro para STARTUPINFO */
&pi /* Ponteiro para PROCESS_INFORMATION */
);


return 0;
}

A string contendo o nome do processo vão os argumentos de linha de comando.

É possível usar funções como execl e spawnl para abrir executáveis (funciona em linux), porém, essas funções não retornam informações interessantes em relação ao processo aberto. Por exemplo, o comando "pi.dwProcessId" retorna o ID do processo.

Veja a estrutura de PROCESS_INFORMATION:

typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

O HANDLE do processo serve para diversas operações (que não serão descritas nesse post).

Programming @ home em inglês

0 comentários
Olá a todos,

Hoje, estou inaugurando a versão inglês do blog.
Comecei a fazer isso devido as pessoas que acessam o blog pelo google e não falam português.
Somente vou traduzir os novos posts e dos antigos os mais interessantes.

O link é:
www.enprogramminghome.blogspot.com
Se houver qualquer tipo de erro nos textos em inglês, por favor, me avisem.

Ratings:

Avaliação deste artigo

Copyright © Programming @ home