Ir para conteúdo

Recommended Posts

[ajuda] e ai glr , to aprendendo agr sobre alocaçao dinamica, e me surgiu uma duvida no exercicio:
"3) Construa um programa (main) que aloque em tempo de execução (dinamicamente)
uma matriz de ordem m x n (linha por coluna), usando 1+m chamadas a função
malloc. Agora, aproveite este programa para construir uma função que recebendo os
parametros m e n aloque uma matriz de ordem m x n e retorne um ponteiro para esta
matriz alocada. Crie ainda uma função para liberar a área de memória alocada pela
matriz. Finalmente, crie um novo programa (main) que teste/use as duas funções
criadas acima.
4) Construa um programa (main) que aloque em tempo de execução (dinamicamente)
uma matriz de ordem m x n (linha por coluna), usando 2 chamadas a função malloc.
Agora, aproveite este programa para construir uma função que recebendo os
parametros m e n aloque uma matriz de ordem m x n e retorne um ponteiro para esta
matriz alocada. Crie ainda uma função para liberar a área de memória alocada pela
matriz. Finalmente, crie um novo programa (main) que teste/use as duas funções
criadas acima."

nao entendi mt bem oq e pra fazer a respeito dessa alocaçao, tanto 1+m qt 2 chamadas.

segue meu code :

#include <stdio.h>
#include <stdlib.h>
float **Alocar_matriz_real (int m, int n) {
float **v; 
int i;

if (m < 1 || n < 1) {
printf ("** Erro: Parametro invalido **\n");
return (NULL);
}
v = (float *)calloc (m, sizeof(float *)); 
if (v == NULL) {
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
for ( i = 0; i < m; i++ ) {
v = (float *)calloc (n, sizeof(float)); 
if (v == NULL) {
printf ("** Erro: Memoria Insuficiente **");
return (NULL);
}
}
return (v);
} 
float **Liberar_matriz_real (int m, int n, float **v) {
int i;
if (v == NULL)
return (NULL);

if (m < 1 || n < 1) {
printf ("** Erro: Parametro invalido **\n"); \
return (v);
}
for (i=0; i<m; i++){
free (v);
}
free (v);
return (NULL);
}

int main (void) {
float **mat;
int l, c;
int i, j;
printf("digite o valor de m: ");
scanf("%d",&l);
printf("\ndigite o valor de n: ");
scanf("%d",&c);

mat = Alocar_matriz_real (l, c);
for (i = 0; i < l; i++){
for ( j = 0; j < c; j++){
if(i==j) mat[j] = 1;
}
}
mat = Liberar_matriz_real (l, c, mat);
return(0);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você fez quatro posts do mesmo, vou apagar os outros 3. Ah, coloque esse código dentro da área de código clicando no ícone que tem "menor que e maior que".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poderia dar uma formatada no tópico para ficar mais fácil de entender ?

porém encontrei alguns problemas de cara no código enviado.

float **v;  está errado.
  
float *v; está correto.
  
  * é para demonstrar o valor contido naquele endereço.
  ** seria para ir para o endereço porem é mais facil apenas deixar o v que da na mesma;

Exemplo de alocação dinamica{}


#include <stdio.h>
#include <stdlib.h>


main(){

  int *v, tamanho, i;
 puts("Entre com o tamanho para a o array: ");
 scanf("%i",&tamanho);
 v = malloc(tamanho*sizeof(int));
 for(i=0 ; i<tamanho ; i++)
 v[i] = i;
 for(i=0 ; i<tamanho ; i++)
 printf("Posicao %i: %i \n",i,v[i]);
 puts("Entre com o novo tamanho para a o array: ");
 scanf("%i",&tamanho);
 v = realloc(v,tamanho*sizeof(int));
 for(i=0 ; i<tamanho ; i++)
 printf("Posicao %i: %i \n",i,v[i]);
 free(v);
}


 

 

Editado por SmoLL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
Entre para seguir isso  



  • Conteúdo Similar

    • Por qebuqci
      Eai rapaziada, beleza?
      Então to começando a programar em C e estou com dificuldade em fazer um negócio. Eu quero criar uma estrutura e um ponteiro que guarde os valores referentes a cada membro da estrutura. Algo semelhante a isso
      typedef struct { char nome[20], marca[20]; } ESTRUTURA; int main(void) { ESTRUTURA *ponteiro; int i, quantidade;
      Ai aqui entra um loop de repetição (for i até quantidade) pra eu associar cada valor do ponteiro->nome, ponteiro->marca. Tanto quanto for necessário. Por exemplo, se eu quiser fazer um cadastro de três marcas por exemplo, eu quero um ponteiro que suporte isso na memória e cada valor aponte pra um membro da estrutura.
      scanf("%d",&quantidade); ponteiro=(char *) malloc (quantidade*sizeof(ESTRUTURA)); for (i=1;i<=quantidade;i++) { scanf("%s",ponteiro->nome); scanf("%s,ponteiro->marca); } criaArquivo(ponteiro); free(ponteiro); return 0; }
      Bom, a questão é, eu quero salvar todos os dados cadastrados num arquivo depois. Então, eu criei uma função que recebe o ponteiro em que estão e joga isso pro ponteiro arquivo. E até aqui beleza, ele cria o arquivo, mas o arquivo só salva o primeiro valor da primeira posição de memória. No caso do exemplo que eu dei, digamos que eu quisesse cadastrar 3 marcas e 3 nomes. Ele alocaria dinamicamente o espaço necessário e cadastraria tudo certinho, agora na hora de passar pro arquivo, somente o primeiro nome do primeiro cadastro é salvo.
      Eu não entendi isso, eu não passei o ponteiro inteiro pra função criaArquivo?
      Eu estou salvando no arquivo desse jeito
       
      void criaArquivo(char *ponteiro) { FILE *arquivo; arquivo=fopen("teste.txt","w"); fprintf(arquivo,"%s",ponteiro); fclose(arquivo); } Se eu pedir na função criaArquivo pra ele printar esse ponteiro que ele recebe, ele não recebe o ponteiro inteiro com todos os dados cadastrados na main, ele recebe somente o valor daquela posição de memória. Somente do primeiro ponteiro->nome. Ai isso é que quebra, porque eu já tentei chamar na main, criaArquivo(ponteiro+1). Achando que a próxima posição de memória teria ponteiro->marca. E ele cria o arquivo sem nada, como se não tivesse valor cadastrado ali
      Então assim, deixando claro as minhas dúvidas, eu defini um ponteiro com tamanho A bytes. Quando eu passo ele pra outra função, ele não vai com o tamanho A de memória, ele vai somente o valor da primeira célula de memória, certo? Como eu faço pra pegar o resto?
    • Por Pain
      Segue o Link do Canal no Youtube: https://www.youtube.com/playlist?list=PLa75BYTPDNKZWYypgOFEsX3H2Mg-SzuLW
      Já vi essas aulas  e o professor explica muito bem! Ele vai até alocação dinâmica.
    • Por gusdnide
      Proxy Changer

      Salve galera, venho apresentar esse meu codigo velho que faziar para poder aprovar CC na netflix, pegava um Proxy do pais que desejava (mais precisamente uma lista) e trocava as configuraçoes globais do Windows de proxy, ou seja voce podia acessar qualquer navegador que o seu ip teria mudado!, vai ser bem simples apartir desse meu projeto desenvolvi algo maior que me ajuda até hoje, mas ainda falta alguns concertos ae quando tiver tudo OK eu posto aqui!
      Bom beleza vamos la , primeiro vamos chamar as bibliotecas que usaremos!
      using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Net; using System.Threading; using System.IO; Ok, ja com as bibliotecas importadas, vamos adicionar nossas referencias que vamos chamar das API do windows ou especificamente da "wininet.dll" ok.
      #region Referencias [DllImport("wininet.dll")] public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength); #endregion (Para saber mais sobre a funçao acima só acessar o site da Microsoft aqui ) Ok, agora vamos criar um metodo para chamar essa funçao de maneira correta na hora correta.
      static bool MudarProxy(string Proxy, bool Habilitar) { RegistryKey RegInternet = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); //Atribui a variavel RegInternet o registro onde fica as configuraçoes da internet no regedit RegInternet.SetValue("ProxyEnable", Habilitar); //Habilita o proxy RegInternet.SetValue("ProxyServer", Proxy); //Atribui o server proxy para o windows InternetSetOption(IntPtr.Zero, 0x27, IntPtr.Zero, 0); //Avisa o windows q ouve uma mudança nas configuraçoes da internet InternetSetOption(IntPtr.Zero, 0x25, IntPtr.Zero, 0); //Atualiza as configuraçoes da internet } Para mais flags do InternetSetOption pode ser visto aqui, ok agora é só desenvolver o programa outra funçao simples de se fazer para checar se o proxy está funcionando, é fazer um teste com ele, se o site não responder ou der algum error é por que não esta funcionando Veja o exemplo:
       
      static bool VerificarProxy(sProxy p) { HttpWebRequest wc = (HttpWebRequest)WebRequest.Create("http://google.com"); wc.Proxy = new WebProxy(p.IP, p.Port); wc.Timeout = 2000; try { wc.GetResponse(); return true; } catch { return false; } } O código do meu programa que fiz de teste:
      using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Net; using System.Threading; using System.IO; namespace ProxyChange { class Program { #region Referencias [DllImport("wininet.dll")] public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength); #endregion #region Metodos static bool MudarProxy(string Proxy, bool Habilitar) { RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); registry.SetValue("ProxyEnable", Habilitar); registry.SetValue("ProxyServer", Proxy); InternetSetOption(IntPtr.Zero, 0x27, IntPtr.Zero, 0); InternetSetOption(IntPtr.Zero, 0x25, IntPtr.Zero, 0); } static bool CheckContains(sProxy p) { foreach (sProxy p2 in ProxyTestados) if (p.getString() == p2.getString()) return true; return false; } static bool CheckProxy(sProxy p) { if (!CheckContains(p)) ProxyTestados.Add(p); else return false; HttpWebRequest wc = (HttpWebRequest)WebRequest.Create("http://google.com"); wc.Proxy = new WebProxy(p.IP, p.Port); wc.Timeout = 2000; try { wc.GetResponse(); return true; } catch { return false; } } #endregion #region Structs struct sProxy { public string IP { get; set; } public int Port { get; set; } public string getString() { return $"{IP}:{Port}"; } } #endregion static List<sProxy> ListProxy; static List<sProxy> ProxyFuncionando; static List<sProxy> ProxyTestados; static string Arquivo = ""; static int TempoTroca; [STAThread] static void Main(string[] args) { MudarProxy("", 0); Console.ForegroundColor = ConsoleColor.White; Console.Title = "Proxy Chaanger"; ProxyTestados = new List<sProxy>(); if (ListProxy == null) ListProxy = new List<sProxy>(); if (ProxyFuncionando == null) ProxyFuncionando = new List<sProxy>(); TempoTroca = 0; string Resp = ""; if (ListProxy.Count == 0) { Console.Write("Digite o nome do arquivo de proxys: "); Resp = Console.ReadLine(); if (!File.Exists(Resp)) { Console.WriteLine("Arquivo invalido!"); Console.ReadLine(); Console.Clear(); Main(args); return; } } Arquivo = Resp; LerProxys(); Console.Write("Digite quantos minutos para a troca de IP: "); Resp = Console.ReadLine(); if (int.TryParse(Resp, out TempoTroca)) { if (TempoTroca > 0 && TempoTroca < int.MaxValue) { TempoTroca *= 60000; } else { Console.WriteLine("Arquivo invalido!"); Console.ReadLine(); Console.Clear(); Main(args); return; } } else { Console.WriteLine("Arquivo invalido!"); Console.ReadLine(); Console.Clear(); Main(args); return; } new Thread(Rotina).Start(); Console.ReadLine(); MudarProxy("", 0); Environment.Exit(1); } static void LerProxys() { ListProxy.Clear(); foreach (string Linha in File.ReadAllLines(Arquivo)) { if (Linha.Contains(":")) { string[] Div = Linha.Split(':'); int Porta = -1; sProxy p; if (int.TryParse(Div[1], out Porta)) p = (new sProxy() { IP = Div[0], Port = Porta }); else continue; if (!ProxyTestados.Contains(p)) ListProxy.Add(p); } } } static void TestarProxys() { int count = 1; foreach (sProxy p in ListProxy) { Console.Clear(); Console.WriteLine("Testando Proxys..."); Console.WriteLine($"{ListProxy.Count} proxys carregados!"); Console.WriteLine($"Testando {count}/{ListProxy.Count} e {ProxyFuncionando.Count} estao funcionando!"); if (CheckProxy(p)) { ProxyFuncionando.Add(p); } count++; Thread.Sleep(200); } ListProxy.Clear(); } static void Rotina() { int Count = 0; while (true) { Console.Clear(); Console.WriteLine("Procurando Proxy Funcionando!"); Console.WriteLine("Aperte qualquer tecla para sair!"); while (CheckProxy(ListProxy[Count])) { Console.Clear(); Count++; if (Count == ListProxy.Count) { Console.WriteLine("Os Proxys acabaram!"); Console.WriteLine("Desligando proxy..."); MudarProxy("localhost", 0); Console.ReadLine(); return; } } Console.Clear(); sProxy AtualProxy = ListProxy[Count]; Console.WriteLine($"Proxy Atual: {AtualProxy.getString()}"); Console.WriteLine($"Proxima Troca: { DateTime.Now.AddMinutes(TempoTroca/60000).ToString() }"); Console.WriteLine("Aperte qualquer tecla para sair!"); MudarProxy(AtualProxy.getString(), 1); Thread.Sleep(TempoTroca); LerProxys(); } } } }  
    • Por Paulo Júnior
      É o seguinte galera, como eu posso fazer um programa em C que crie um loop com uma condição com string, tipo, ele pergunta qualquer coisa e enquanto  a pessoa não digitar ''exit'' ele continue perguntando eternamente ? Se possivel um loop com while e um com if, mas caso não for possivel com os dois, apenas um esta de muito bom agrado. Obrigado por sua atenção.
×

Informação Importante

Ao usar este site, você concorda com nossos Termos de Uso.