Pesquisar na Comunidade
Mostrando resultados para as tags ''alocação dinamica''.
Encontrado 8 registros
-
Programa imprimindo valores errados de um vetor
uma questão postou jujuneos Tutoriais & Dicas - C, C++
Galera, estou fazendo um programa de manipulação de vetores, e me deparei com esse problema: eu entro com os valores do vetor, mas quando peço para exibi-los, o programa exibe alguns valores errados, que sempre mudam cada vez que eu executo. Acredito que seja um problema de memória que precisa ser limpa, queria saber como fazer isso em C. #include <stdio.h> #include <stdlib.h> int funcao(int v[10]){ int i, maior, menor, j, prim, ult; int *vet = malloc(10*sizeof(&v)); float m=0; //Cálculo da média: for(i = 0; i < 10; i++) m = m + v[i]; printf("\nMedia: %.2f", m/10); //Posição do maior: for(i = 0; i < 10; i++){ maior = v[i]; for(j = 0; j < 10; j++){ if (v[j] > maior) maior = v[j]; }} printf("\nO maior elemento é: %d.\nO endereço de memória é: %d.\n", maior, &maior); //Posição do menor: for(i = 0; i < 10; i++){ menor = v[i]; for(j = 0; j < 10; j++){ if (v[j] < menor) menor = v[j]; }} printf("\nO menor elemento é: %d.\nO endereço de memória é: %d.\n", menor, &menor); //Endereços da primeira e última posição: for(i = 0; i < 10; i++){ if (i == 0) prim = v[i]; if (i == 9) ult = v[i]; } printf("\nO endereço da primeira posição do vetor é %d e do último é %d\n", &prim, &ult); free(v); return *vet; } int main(){ int i, v[10], m = 0; for(i = 0; i < 10; i++){ scanf("%d", &v[i]); m = m + v[i]; if (v[i] > (m/10)) v[i] = v[i] - (m/10); } for(i = 0; i < 10; i++) printf("%d ", v[i]); funcao(v); return 0; } Abaixo segue um print do programa sendo executado. Alguém sabe como contornar o problema? -
Qual o problema deste código? Ele simplesmente crasha do nada.
uma questão postou Tallahassee C, C++
#include <stdio.h> #include <stdlib.h> #include <locale.h> int matrixSum(int ** mA, int ** mB, int ** mC, int la, int lb, int ca, int cb); int main(){ int ** matrixA, ** matrixB, ** matrixC, lineA, columnA, lineB, columnB; int i, j; printf("Insert the numbers of lines desired for matrix A:\n>>>\n"); scanf("%d", &lineA); fflush(stdin); printf("Insert the numbers of columns desired for matrix A:\n>>>\n"); scanf("%d", &columnA); fflush(stdin); printf("Insert the numbers of lines desired for matrix B:\n>>>\n"); scanf("%d", &lineB); fflush(stdin); printf("Insert the numbers of columns desired for matrix B:\n>>>\n"); scanf("%d", &columnB); fflush(stdin); matrixA = malloc(lineA * sizeof(int *)); if(matrixA == NULL){ printf("ERROR! There isn't space on disc!\n"); return 1; } for(i=0; i<columnA; i++){ matrixA = malloc(sizeof(int)); if(matrixA == NULL){ printf("ERROR! There isn't space on disc!\n"); return 1; } } matrixB = malloc(lineB * sizeof(int *)); if(matrixB == NULL){ printf("ERROR! There isn't space on disc!\n"); return 1; } for(i=0; i<columnB; i++){ matrixB = malloc(sizeof(int)); if(matrixB == NULL){ printf("ERROR! There isn't space on disc!\n"); return 1; } } for(i=0; i<lineA; i++){ for(j=0; j<columnA; j++){ printf("\nMatrix A - Position [%d][%d]: ", i+1, j+1); scanf("%d", &matrixA[j]); fflush(stdin); } } for(i=0; i<lineB; i++){ for(j=0; j<columnB; j++){ printf("\nMatrix B - Position [%d][%d]: ", i+1, j+1); scanf("%d", &matrixB[j]); fflush(stdin); } } int ans; ans = matrixSum(matrixA, matrixB, matrixC, lineA, lineB, columnA, columnB); if(ans == 0){ printf("\nIt is impossible sum the arrays because the number of rows and columns are different!\n"); return 0; } else{ for(i=0; i<lineA; i++){ for(j=0; j<columnA; j++){ printf("\nMatrix C - Position[%d][%d] = %d\n", i, j, matrixC[j]); } } return 0; } } int matrixSum(int ** mA, int ** mB, int ** mC, int la, int lb, int ca, int cb){ int i, j; if(la != lb || ca != cb){ return 0; } else{ //Como as linhas e colunas precisam ser iguais, pode-se usar tanto la e ca, como lb e cb mC = malloc(la * sizeof(int *)); if(mC == NULL){ printf("ERROR! There is no space on disc!\n"); } for(i=0; i<ca; i++){ mC = malloc(sizeof(int)); if(mC == NULL){ printf("ERROR! There is no space on disc!\n"); } } for(i=0; i<lb; i++){ for(j=0; j<cb; j++){ mC[j] = mA[j] + mB[j]; } } } return 1; } -
Olá galera, estou desenvolvendo um pequeno programa que tem por objetivo comparar uma string que está armazenado em um vetor com essa mesma string armazenada em uma pilha para verificar se ela pertence ao padrão yxy; Exemplo: o usuário digita a palavra EDFED o para programa verificar se essa palavra pertence ao padrão e a saber ela pertence (ED)->Y (F) ->X (ED) -> Y, outro exemplo de palavras que pertence THT = (T) -> Y (H)-> (T)->Y já a palavra EFGFE não pertence. OBS:Estou implementando em C
- 1 resposta
-
- vetor
- alocação dinâmica
- (e %d mais)
-
To com um problema em fazer um programa, ele recebe um arquivo .txt onde possui varios dados de varios tipos, como semestre (float), numero do trabalho (int), ano (int), titulo (char), descricao (char), de alguns trabalhos, há valor indeterminado de trabalhos no arquivo de texto, tenho q ler o arquivo, armazenar numa lista, ordenar em ordem crescente a partir do ano, semestre e o numero do trabalho, excluir duplicidades, inserir um novo trabalho e imprimir de formar ordenada no arquivo de saida .txt. não sei por onde começar...
-
Olá gostaria de ajuda com o programa abaixo, é um trabalho escolar onde devo usar lista dinâmica, lista duplamente ligada e arvore binária. // Lista Dinamica struct pessoa { int cpf; char nome[50]; int tel; }p [10]; void adicionar(); void menu(); int opcao; int LD_posicao = 0; void inicializar(); void listar(); //----------------------// //Lista DUplamente Ligada struct no { struct no *anterior; char *dado; struct no *proximo; }; struct no *novo_no(char *dado); void ornenar_no(char dado); void adicionar_no_final(); void adicionar_no_inicio(); void adicionar_no_meio(); struct no *inicio; struct no *novo; struct no *aux; struct no *anterior; char LDL_nome[50]; // int main() { inicializar(); opcao = 0; while(opcao !=3) { menu(); switch(opcao) { case 1: adicionar(); break; case 2: listar(); break; } } return 0; } void inicializar() { } void menu() { printf("1 - Adicionar\n"); printf("2 - Listar\n"); printf("3 - AdicionarOrdenando\n"); scanf("%d", &opcao); } void adicionar() { printf("Digite o cpf:\n "); scanf("%d", &p[LD_posicao].cpf); printf("Digite o tel:\n "); scanf("%d", &p[LD_posicao].tel); printf("Digite o nome:\n "); fflush(stdin); scanf("%s",p[LD_posicao].nome); printf("recebeu antes -> %s ", p[LD_posicao].nome); Gostaria de passar como parâmetro esse conteúdo "nome" (que foi alocado em uma estrutura simples) para estrutura "struct no *novo_no(char *dado)", isso é possível? Se não, como faço pra fazer uma alocação dinâmica de memoria usando uma variável/vetor do tipo char. ordenar_no(p[LD_posicao].nome); LD_posicao++; } void listar_LD() { int i; for(i = 0; i < LD_posicao; i++) { printf("nome: %s - ", p.nome); printf("cpf: %d - ", p.cpf); printf("tel: %d \n", p.tel); } } struct no *novo_no(char *dado) como posso mudar essas estutura para que ela trabalhe alocando variavel/ vetor do tipo char? { struct no *n; n = malloc(sizeof(struct no)); if(!n) { printf("não consegui alocar memoria!\n"); exit(-1); } n->anterior = 0; n->dado=dado; n->proximo = 0; printf("n->dado %s \n", n->dado); printf("dado %s \n",&dado); return n; } void ordenar_no(char *dado) { printf("recebeu depois -> %s \n ", dado); // PROBLEMA ESTA NA LINHA 134 (novo=novo_no(*dado)) , NOVO NÃO ESTA RECEBENDO novo_no(*dado); //n->dado RECEBE O VALOR DE DADO POREM DE ALGUMA FORMA NÃO RETORNA PARA O PARAMETRO (*dado) da funcao *novo_no novo = novo_no(*dado); printf("novo-> %s \n", *novo); if(inicio == 0) { inicio = novo; printf("inicio primeiro if= %s\n",inicio); printf("inicio->dado= %s\n",inicio->dado); } else { printf("inicio->dado segundo if = %s\n", inicio->dado); printf("*dado = %s\n", *dado); // decidir aonde inserir if(strcmp (inicio->dado,dado) == 1) adicionar_no_inicio(); else { aux = inicio; while((aux->proximo != 0) && (strcmp (aux->dado,dado) == -1)) { aux = aux->proximo; } if(aux->proximo == 0 && (strcmp (dado,aux->dado) == 1)) adicionar_no_final(); else adicionar_no_meio(); } } } Observação: o programa esta incompleto mesmo.
- 3 respostas
-
- estrutura de dados
- alocação dinamica
- (e %d mais)
-
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)); }
-
Boa tarde, pessoal! Já li diversas coisas a respeito de Alocação Dinâmica com realloc e mesmo assim não consigo entender o porque meu código não estar dando certo. O meu objetivo fazer uma alocação dinâmica de um vetor com a relloc. Eu aloquei ele no inicio do código e a medida que preciso de mais espaço usei um laço (FOR) para ir alocando cada bloco. O programa é o seguinte: "Leia um número positivo do usuário, então, calcule e imprima a sequencia de Fibonacci até o primeiro número superior lido. Exemplo: se o usuário informou o número 30, a sequência a ser impressa será 0 0 1 2 3 4 8 13 21 34. O meu código funciona com números menores. Por exemplo, quando digito "10", ele vai até o 13. Tudo Ok. MacBook-Pro-de-Renan:Lista_3 renan$ ./PD_L_3_44.out Digite o n: 10 0, 1, 1,2,3,5,8,13, Mas quando digito "30", ele quebra com a seguinte mensagem: MacBook-Pro-de-Renan:Lista_3 renan$ ./PD_L_3_44.out Digite o n: 30 0, 1, PD_L_3_44.out(2696,0x7fff782be000) malloc: *** error for object 0x7fbada401390: pointer being realloc'd was not allocated *** set a breakpoint in malloc_error_break to debug 1,2,3,5,8,13,21,Abort trap: 6 Alguém consegue me ajudar o porque dá esse problema? #include <stdio.h> #include <stdlib.h> int main () { int *temp, n; int *v = malloc(2 * sizeof(int)); v[0] = 0; v[1] = 1; printf("Digite o n: "); scanf("%d", &n); printf("%d, %d,", v[0], v[1]); for(int i = 2; i > 1; i++){ temp = realloc(v, (i+1) * sizeof(int)); if( temp != NULL){ v[i] = (v[i-1] + v[i-2]); printf("%d,", v[i]); if(v[i] >= n){ i = 0; } } else { printf("Erro na Alocação da Memória\n"); return 1; } } free(v); printf("\n"); return 0; } Muito obrigado!!
-
Bom, eu estou aprendendo C++, mas eu estou tendo dificuldades(muita) em aprender alocação dinamica, então eu quero escrever o que eu entendi e também algumas duvidas minhas.Ai vocês respondem a duvida e me corrijam se eu escrever algo errado O Objetivo da alocação dinamica é apenas um: economizar mémoria.Porem na função malloc eu não especifico o numero de Bytes que eu vou usar eu so escrevo o tipo de variavel ou seja porque eu não uso 1 variavel comum, qual é a diferença: int *nome = (int *) malloc(sizeof(INT)); // 4 Bytes int nome; // 4 Bytes Outra duvida que não tem nada a ver com alocação dinamica. Pode misturar c com c++ ?