problemas na alocação dinâmica no linux Kurumin 7 [RESOLVIDO]

1. problemas na alocação dinâmica no linux Kurumin 7 [RESOLVIDO]

Reginaldo de Matias
saitam

(usa Slackware)

Enviado em 17/04/2008 - 18:24h

Ae galera sou iniciante no linux-Kurumin 7 e abaixo segue o script em C, que fiz no Windows XP, funcionou, dae como sou iniciante resolvi testar meus scripts C no linux-Kurumin 7, os simples blz, o problema é na alocação dinâmica e liberação da memória.
Nem passa na compilação:
gcc multiplica_matrizes.c -o multiplica_matrizes
aparece vários warning e erros de sintaxe.

No Windows usava o Dev-C++ (que é uma IDE que usa o gcc) Queria saber se no linux-Kurumin 7 tem uma IDE parecida com o Dev-C++?

Se possível reconstruir esse script que funcione no linux-Kurumin 7, para eu poder aprender nos próximos scripts.


/*Autor: Reginaldo de Matias - reginaldo.matias@gmail.com*/
#include <stdio.h>

#include <stdlib.h>

float **Alocar_matriz_real (int m, int n)

{

float **v; /* ponteiro para a matriz */

int i; /* variavel auxiliar */

if (m < 1 || n < 1) { /* verifica parametros recebidos */

printf ("** Erro: Parametro invalido **\n");

return (NULL);

}

/* aloca as linhas da matriz */

v = (float **) calloc (m, sizeof(float *));

if (v == NULL) {

printf ("** Erro: Memoria Insuficiente **");

return (NULL);

}

/* aloca as colunas da matriz */

for ( i = 0; i < m; i++ ) {

v[i] = (float*) calloc (n, sizeof(float));

if (v[i] == NULL) {

printf ("** Erro: Memoria Insuficiente **");

return (NULL);

}

}

return (v); /* retorna o ponteiro para a matriz */

}

float **Liberar_matriz_real (int m, int n, float **v)

{

int i; /* variavel auxiliar */

if (v == NULL) return (NULL);

if (m < 1 || n < 1) { /* verifica parametros recebidos */

printf ("** Erro: Parametro invalido **\n");

return (v);

}

for (i=0; i<=m; i++) free (v[i]); /* libera as linhas da matriz */

free (v); /* libera a matriz */

return (NULL); /* retorna um ponteiro nulo */

}

void Le_matriz_real(int linhas, int colunas, float **matriz)

{

int i, j;

for (i = 0; i < linhas; i++)

{

printf("\nlinha %d: \n", i+1);

for (j= 0; j<colunas; j++)

scanf("%f", &matriz[i][j]);

}

}

void Multiplica_matriz_real(int linha3, int coluna3, int linha2, float

**mat1,float **mat2, float **mat3)

{

int i, j, t;

for(i=0; i< linha3; i++)

for(j=0; j< coluna3; j++)

{

mat3[i][j] = 0;

for(t=0; t< linha2; t++) /* linha2, que e igual a coluna1.. */

mat3[i][j] += mat1[i][t]*mat2[t][j];

}

}

void Imprime_matriz_real(int linha,int coluna,float **mat)

{

int i,j;

for (i =0; i < linha; i++)

{

for (j=0; j<coluna; j++)

printf("%f\t", mat[i][j]);

printf("\n");

}

}

int main()

{

float **mat1, **mat2, **mat3; /* matrizes a serem alocadas */

int linha1, coluna1; /* Dimensoes das matrizes */

int linha2, coluna2;

int linha3, coluna3;

int i, j, t, erro=0;

system("color 3f");

printf("Este Software multiplica duas matrizes\n");

printf("\n\n-------- Multiplicacao de Matrizes: -----------\n");

printf(" Alocacao Dinamica de Memoria\n");

printf("------------------------------------------------\n");



/* Le e compara as dimensoes das matrizes.

So abandona o loop se as dimensoes forem validas

Atencao aa condicao... */

do

{

printf("\nDimensoes da matriz 1 (linhas e colunas): ");

scanf("%d%d", &linha1, &coluna1);

printf("\nDimensoes da matriz 2 (linhas e colunas): ");

scanf("%d%d", &linha2, &coluna2);

if ( coluna1 != linha2 )

printf("\nDimensoes Invalidas! Tente de novo..\n");

} while ( coluna1 != linha2 );



/* Dimensoes da matriz de resposta: */

linha3 = linha1;

coluna3 = coluna2;



/* Aloca a memoria para as matrizes: */

if ((mat1 = Alocar_matriz_real (linha1, coluna1))== NULL) erro = 1;

if ((mat2 = Alocar_matriz_real (linha2, coluna2))== NULL) erro = 1;

if ((mat3 = Alocar_matriz_real (linha3, coluna3))== NULL) erro = 1;

if (erro)

{

printf("\n Memoria Insuficiente! Abortando..\n");

exit(1);

}

/* Le a Matriz 1: */

printf("\n\nDigite a Matriz 1:\n");

Le_matriz_real(linha1,coluna1,mat1);

/* Le a Matriz 2: */

printf("\n\nDigite a Matriz 2:\n");

Le_matriz_real(linha2,coluna2,mat2);

/* Imprime as matrizes lidas */

printf ("\n\n==>Matriz 1\n");

Imprime_matriz_real(linha1,coluna1,mat1);

printf ("\n\n==>Matriz 2\n");

Imprime_matriz_real(linha2,coluna2,mat2);



/* --------------------- Multiplicacao..*/

Multiplica_matriz_real(linha3,coluna3,linha2,mat1,mat2,mat3);

/* ------------- Imprime a Matriz Calculada... */

printf("\n\n==> Matriz 3 , Resultado da multiplicacao:\n");

Imprime_matriz_real(linha3,coluna3,mat3);

Liberar_matriz_real (linha1, coluna1, mat1);

Liberar_matriz_real (linha2, coluna2, mat2);

Liberar_matriz_real (linha3, coluna3, mat3);

printf("\n\n\nReginaldo de Matias\nCiencia da Computacao\nUDESC\n");

system("pause");

}



Se tiver algum material de C para linux e poder encaminhar eu agradeço.
Grato pela atenção



  


2. que estranho

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 18/04/2008 - 09:36h

cara, fiz um teste do seu programa tanto no gcc no windows (aqui no trampo, tenho o ming com o gcc) e num linux kurumin 6.1 que tenho aqui com o gcc tbem e em ambos o programa funcionou perfeitamente. A unica coisa que não funciona no linux é a parte do system:
system("color 3f"); e system("pause);
Pois estas são funções do DOS. Do restante, simplesmente olhei seu código, não vi nenhum erro aparente, salvei ele em um arquivo matriz.c e dei o comando:
# gcc -o matriz matriz.c
E depois
# chmod +x matriz
# ./matriz

E pronto. Você esta compilando corretamente?

E ah, quanto a IDE, eu usei bastante no linux o eclipse mas estou testando o CodeBlocks (é pra C++) e ele ta me agradando. É bem parecido com o Dev. O negócio é experimentar, IDE é igual Distro, cada um vai ter uma preferida.

Posta mais detalhes do erro ai, pra gente ver.
Abs


3. ah

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 18/04/2008 - 09:38h

mais um detalhe.
Não será pq vc criou este arquivo no windows e copiou ele pro linux e por isso ele não ta compilando?
Tente dar um:
# dos2unix matriz.c
Se não tiver o dos2unix só instalar.



4. Re: problemas na alocação dinâmica no linux Kurumin 7 [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 18/04/2008 - 10:24h

Boa stremer!

E alguns fontes DOS ainda colocam o Control+Z no fim.

E outra: acentos em unicode (aliás, qualquer acento) em comentários podem atrapalhar.

stremer: em tempo. O system é sim uma função do Linux, pois está no stdlib.h e serve para executar um programa externo. O que só tem no DOS é o cls. Mas se tu fizer no shell um
alias cls=clear

ai funciona ;-)


5. Re: problemas na alocação dinâmica no linux Kurumin 7 [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 18/04/2008 - 10:26h

Ops.
No caso especifico:

alias pause=read

É que normalmente alguns programadores limpam a tela com system("cls");

:-D


6. opa

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 18/04/2008 - 10:54h

cara eu não quis dizer que o system não tem no linux. Ele tem sim, e o programa dele até funciona, somente não vai conseguir executar as funções la do system, como o color e pause. Mas pode usar o system de maneira diferente no linux, mas eu não recomendo mto não por causa da portabilidade, prefiro evitar, somente em ultimo caso, e mesmo assim, prefiro fazer uma função genérica e esta função detectar o sistema operacional e então executar de acordo com o sistema (tenho até um factory para isso), pois mesmo no windows se tem problemas de coisas que tem de ser implantadas de maneira diferente. Assim fica mais facil "portar" o código, somente recompilando sem precisar modifica-lo.

Mas se não tiver jeito, só adaptar o system pro linux como vc disse :)


7. ah

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 18/04/2008 - 10:58h

agora um comentário meio tosco mas.

Se o cara usa o system("cls") para limpar a tela, ele ta bem longe de ser um programador.
Eu chamaria logo ele de POGramador.

kkkk


8. Concordo plenamente

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 18/04/2008 - 11:34h

Pior é usar isto:

scanf("%i", $valor);
fflush(stdin);
gets(st1);

tsctsc

Já vi muito disto!
O cara usa fflush para limpar o Enter que sobrou do scanf (e ele nem sabe disso) e usa o TERRÍVEL gets para ler string com problema de overflow!

Usar um system("cls") para limpar a tela é fichinha!

Estes mesmos insistem a fazer coisas absurdas como:

char st[300];

st = "apenas um teste";

if (st == "apenas um teste" )

acham que estão programando em Java script.
hehehehehe


9. kkkkk

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 18/04/2008 - 18:00h

pior que isso só algo do tipo
if (true) {

} else {

}

O pior que já vi um código assim e daqui da empresa. :O


10. Re: problemas na alocação dinâmica no linux Kurumin 7 [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 18/04/2008 - 18:07h

O stremer. Deixa de preconceito. Qual é o problema do cara usar true?

#define true 1
#define false 0
typedef char boolean;

boolean a;

a= true;
if (a == true)
...

Algum problema?
(Ps: qua qua qua qua)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts