Pesquisar na Comunidade
Mostrando resultados para as tags ''malloc''.
Encontrado 5 registros
-
Estou criando um algoritmo em C. Tenho um vetor char Vet[MAX];, onde MAX é um valor pré definido. Mas, pelo menos no meu PC, quando digito um número muito grande (Ex.: MAX = 3000000) o programa não roda. Ouvi dizer que tem como usar a função malloc pra contornar essa situação. Algum filho de Deus pode, por favor, escrever o trecho do algoritmo que usa a função mallc? Obrigado :-)
-
Preciso de uma ajuda com esse codigo. Toda vez que a função screen() é chamada a memoria alocada não é liberada, fazendo aumentar o uso da memoria RAM até travar o pc. Como faço pra liberar essa memoria , segue o codigo: #include <iostream> #ifdef WIN32 #include <windows.h> #else #include <unistd.h> #endif // win32 using namespace std; void sleepcp(int milliseconds); char filename[64]; FILE* f; void screen(char* fileName) { HWND window = GetDesktopWindow(); HDC _dc = GetWindowDC(window); HDC dc = CreateCompatibleDC(0); RECT re; GetWindowRect(window, &re); int w = re.right, h = re.bottom; void* buf = malloc(w*h*4); HBITMAP bm = CreateCompatibleBitmap(_dc, w, h); SelectObject(dc, bm); StretchBlt(dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY); void* f =CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); GetObject(bm, 84, buf); tagBITMAPINFO bi; bi.bmiHeader.biSize = sizeof(bi.bmiHeader); bi.bmiHeader.biWidth = w; bi.bmiHeader.biHeight = h; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = 0; bi.bmiHeader.biSizeImage = 0; CreateDIBSection(dc, &bi, DIB_RGB_COLORS, &buf, 0, 0); GetDIBits(dc, bm, 0, h, buf, &bi, DIB_RGB_COLORS); BITMAPFILEHEADER bif; bif.bfType = MAKEWORD('B','M'); bif.bfSize = w*h*4+54; bif.bfOffBits = 54; BITMAPINFOHEADER bii; bii.biSize = 40; bii.biWidth = w; bii.biHeight = h; bii.biPlanes = 1; bii.biBitCount = 32; bii.biCompression = 0; bii.biSizeImage = w*h*4; DWORD r; WriteFile(f, &bif, sizeof(bif), &r, NULL); WriteFile(f, &bii, sizeof(bii), &r, NULL); WriteFile(f, buf, w*h*4, &r, NULL); buf=NULL; free(buf); CloseHandle(window); CloseHandle(f); DeleteDC(_dc); DeleteDC(dc); } void sleepcp(int milliseconds) // cross-platform sleep function { #ifdef WIN32 Sleep(milliseconds); #else usleep(milliseconds * 1000); #endif // win32 } int main() { int A=0; char img[30]; for(;;) { sprintf(img,"image%.3i.bmp",A); screen(img); printf("Imagem%.3i.bmp foi salva !\n",A); sleepcp(8000); A++; } return 0; } ATT.
-
Olá, estou fazendo seguinte programa com o objetivo simples de criar uma matriz com as dimensões dadas pelo usuário durante a execução do programa, depois preencher todos os elementos da matriz com um caractere também dado pelo usuário, e por fim exibir todos os elementos da matriz na tela. Ignorem o fato de eu não ter liberado memoria por que como disse ainda estou escrevendo o programa então falta algumas partes ainda. Bom vamos ao que interessa "O erro", o programa esta compilando normalmente sem erros. Porem não consigo executá-lo até o final, ele trava antes de imprimir os elementos da matriz. Eu depurei o programa no visual estúdio e obtive a seguinte mensagem de erro: "Exception thrown at 0x00CD19CD in SQUARE.exe: 0xC0000005: Access violation writing location 0xCDCDCDCD. If there is a handler for this exception, the program may be safely continued." Também já consegui localizar o erro só não sei como corrigi-lo :). O erro está na hora de alocar o caractere na matriz, ou seja na função "gravar_char(void)". Desde já agradeço se poderem me ajudar. OBS. se forem compilar o código em um compilador que não seja o do visual studio, alterem a função "scanf_s" por "scanf" ou então dará erro na compilação. CÓDIGO: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // program name: SQUARE // // author: "I.L" // // target: criar uma matriz bidimencional com as dimenções dadas pelo usuario durante a execução do programa // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //libarys #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; //variaveis globais int COLUNAS_MATRIZ; int LINHAS_MATRIZ; char **MATRIZ; char CARACTER; //declaraçõa das funções void menu_inicial(void); void menu_texturas(void); char **Alocar_matriz_real(int linhas, int colunas); void gravar_char(void); void mostrar_matriz(char **vetor); void clearbuffer(void); //função principal (main) int main(void) { system("title SQUARE"); menu_inicial(); system("cls"); menu_texturas(); gravar_char(); mostrar_matriz(); cin.get(); return 0; } //menu inicial //recebe as dimenções do usuario void menu_inicial(void) { //aqui é onde o usuario entra com as dimenções da matriz printf("\tMENU INICIAL\n\n"); printf("Especifique o numero de colunas e o numerode linhas da matriz:\n"); printf("colunas: "); scanf_s("%i", &COLUNAS_MATRIZ); clearbuffer(); printf("linhas: "); scanf_s("%i", &LINHAS_MATRIZ); clearbuffer(); //gerando a matriz MATRIZ = Alocar_matriz_real(LINHAS_MATRIZ, COLUNAS_MATRIZ); } //menu texturas // da ao usuario a opção de escolher um caracter para peencher sua matriz void menu_texturas(void) { int escolha; //LISTA DE TESTURAS char text_01 = -78; char text_02 = -79; char text_03 = -80; char text_04 = 36; char text_05 = 35; char text_06 = 38; char text_07 = 64; char text_08 = -37; char text_09 = -36; char text_10 = -50; printf("\t TEXTURAS\n\n"); printf("Escolha uma textura para seu quadrado:"); printf("\n\n"); printf(" _____ _____ _____ _____ _____ _____ _____ _____ _____ ______\n"); printf("| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 |\n"); printf("| | | | | | | | | | | | | | | | | | | |\n"); printf("| %c | | %c | | %c | | %c | | %c | | %c | | %c | | %c | | %c | | %c |\n", text_01, text_02, text_03, text_04, text_05, text_06, text_07, text_08, text_09, text_10); printf("|_____| |_____| |_____| |_____| |_____| |_____| |_____| |_____| |_____| |______|\n\n\t\t\t\tEscolha: "); scanf_s("%i", &escolha); clearbuffer(); while (true) { if (escolha <= 0 || escolha > 10) { printf("\n"); while (escolha <= 0 || escolha > 10) { printf("Erro, valor %i nao permitido! ", escolha); scanf_s("%i", &escolha); clearbuffer(); } } break; } switch (escolha) { case 1: CARACTER = text_01; break; case 2: CARACTER = text_02; break; case 3: CARACTER = text_03; break; case 4: CARACTER = text_04; break; case 5: CARACTER = text_05; break; case 6: CARACTER = text_06; break; case 7: CARACTER = text_07; break; case 8: CARACTER = text_08; break; case 9: CARACTER = text_09; break; case 10: CARACTER = text_10; break; default: printf("\nErro desconhecido!"); cin.get(); break; } } //função que gera a matriz com as dimenções que o usuario passou char **Alocar_matriz_real(int linhas, int colunas) { if (linhas < 1 || colunas < 1) { /* verifica parametros recebidos */ printf("** Erro: Parametro invalido **\n"); return (NULL); } /* aloca espaço na memoria para a matriz */ char **matriz_aux = (char **)malloc((5 * sizeof(char *)) - 1); if (matriz_aux == NULL) { printf("** Erro: Memoria Insuficiente **"); return (NULL); } return(matriz_aux); } //função que aloca o caracter inserido pelo usuario void gravar_char(void) { //loop que vai alocar o caracter passado pelo usuario em cada elemento da matriz for (int linhas = 0; linhas < LINHAS_MATRIZ; ++linhas) { for (int colunas = 0; colunas < COLUNAS_MATRIZ; ++colunas) { MATRIZ[linhas][colunas] = (char)CARACTER; } } } //função que inprime na tela todos os elementos da matriz void mostrar_matriz(char **vetor) { printf("\tRESULTADO\n\n"); printf("Quadrado gerado: \n\n"); for (int linhas = 0; linhas < LINHAS_MATRIZ; ++linhas) { for (int colunas = 0; colunas < COLUNAS_MATRIZ; ++colunas) { printf("%c", vetor[linhas][colunas]); } printf("\n"); } } //limpa o buffer void clearbuffer(void) { char c; while ((c = getchar() != '\n' && c != EOF)); }
-
Olá a todos. Gostaria de pedir para alguém me ajudar a corrigir esse código, pois fiz mais não estou conseguindo corrigir o erro que está dando. erro gerado pelo programa: segmentation fault (core dumped). Não sei o que estou fazendo de errado mais creio que seja minha linha que tem "matriz = aloca(m,n)" O programa esta sendo desenvolvimento no codeblock 13.12 linux xubuntu ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- #include<stdlib.h> #include<stdio.h> #include<locale.h> /* 2- Construa uma função que receba dois parâmetros m e n, aloque uma matriz de ordem m x n e retorne um ponteiro para a matriz alocada em tempo de execução. Crie ainda outra função que receba por parâmetro um ponteiro para matriz e libere a área de memória alocada. Finalmente, crie um programa (main) que teste/use as duas funções criadas. */ int *aloca(int m, int n); void liberaEspaco(int **p); int main(){ setlocale(LC_ALL,"portuguese"); int i=0,j=0,m,n, **matriz; printf("Informe o número de linhas que deseja em sua matriz:"); scanf("%d",&m); printf("Informe o número de colunas que deseja em sua matriz:"); scanf("%d",&n); matriz = aloca(m,n); for(i=0;i<m;i++){ for(j=0;j<n;j++){ printf("Matriz[%d][%d]:",i,j); scanf("%d",&matriz[j]); } } liberaEspaco(matriz); system("pause"); return 0; } int *aloca(int m, int n){ int *p; p=(int*)malloc(m*n*sizeof(int)); } void liberaEspaco(int **p){ free(p); }
-
Olá a todos Gostaria de pedir ajuda a vocês pois estou tento dificuldades com funções usando ponteiros. Fiz todo o código, como segui abaixo, porém não estou sabendo passar as informações necessárias para as funções. Se alguém puder corrigir meu código ficaria muito grato. Programa utilizado para desenvolvimento CodeBlock 13.12 /* 1-Faça uma função que receba um valor n e crie dinamicamente um vetor de n elementos e retorne um ponteiro. Crie uma função que receba um ponteiro para um vetor e um valor n e imprima os n elementos desse vetor. Construa também uma função que receba um ponteiro para um vetor e libere esta área de memória. Por fim, crie uma função principal que leia um valor n e chame a função de alocação de memória. Depois, a função principal deve ler os n elementos desse vetor. Então, a função principal deve chamar a função de impressão dos n elementos do vetor criado e, finalmente, liberar a memória alocada através da função criada para liberação. */ int *aloca(int n); void mostra(int *p, int n); void liberaEspaco(int *p); int main(){ int n,i, *vetor; printf("Quantos números deseja armazenar no vetor?\n"); scanf("%d",&n); vetor = &aloca; for(i=0;i<n; i++){ printf("Informe números: \n"); scanf("%d",&vetor); } mostra(vetor, n); liberaEspaco(vetor); system("pause"); return 0; } int *aloca(int n){ int *p; p=(int*)malloc(n * sizeof(int)); if(!p){ printf("memoria insufuciente para alocacao!!"); exit(0); } return p; } void mostra(int *p, int n){ int i; for(i=0; i<n; i++, p++){ printf("Posicao %d = %d: \n",i,*p); } } void liberaEspaco(int *p){ free(p); if(p == NULL){ printf("Espaço liberado!!!!"); } }