Hilo Oficial de C/C++

1, 2, 3, 4, 5, 6
Aunque ha pasado algunas semanas, voy a contestar a helbreath:

Puedes mirar el primer caracter del array, si es M pues que se meta en el if, o sea.

if(sexo[0] == 'M') printf("correcto");

asi :)
Fox ya ha contestado a helbreath, solo añadir...

helbreath escribió:Char sexo[10];
printf("Introduce sexo");
fflush(stdin);
scanf("%s",&sexo");
if(-----)
printf("Correcto);


que en el SCANF sobra el &
(porque el array "sexo" ya es una posicion de memoria en si mismo)

:P
Buenas...

En una clase, cómo se declara e inicializa una matriz constante?

thx
bas escribió:Buenas...

En una clase, cómo se declara e inicializa una matriz constante?

thx

int matriz[10][20]; por ej.
Es un array de arrays simplemente, por tanto tienes 2 veces el [].
Espero sea eso a lo que te refieres.
deathline escribió:int matriz[10][20]; por ej.
Es un array de arrays simplemente, por tanto tienes 2 veces el [].
Espero sea eso a lo que te refieres.


No exactamente...

Me gustaría que la matriz sea una propiedad de la classe, declarada por tanto en el .h, como const, y al ser constante querría darle los valores que tiene en el .cpp.

Con un vector unidimensional no hay demasiados problemas, se puede hacer por ejemplo en el .h un

const int x[];

y en el cpp

const int Clase::x[] = { 1, 2, 3 };

y ya se tiene un array constante con esos valores... pero, qué debería hacer para obtener algo similar con una matriz?
A ver si consigo explicarme.

Tengo una aplicacion en vb6, y aparte uso el programa pdf995 para con el programa en vb6 crear pdfs a partir del pdf995, pero el problema es que el programa este siempre me pide en una pantalla el nombre que le quiero poner al pdf, y yo quiero conseguir que no me pida el nombre (tipica pantalla guardar como ..) sino que yo le pueda pasar el nombre de alguna forma para evitar que salga la pantalla y asi los cree directamente.

Alguien tiene alguna idea?

Gracias
SiTTo escribió:A ver si consigo explicarme.

Tengo una aplicacion en vb6, y aparte uso el programa pdf995 para con el programa en vb6 crear pdfs a partir del pdf995, pero el problema es que el programa este siempre me pide en una pantalla el nombre que le quiero poner al pdf, y yo quiero conseguir que no me pida el nombre (tipica pantalla guardar como ..) sino que yo le pueda pasar el nombre de alguna forma para evitar que salga la pantalla y asi los cree directamente.

Alguien tiene alguna idea?

Gracias


No sé, pero quizá el pdf995 acepte parámetros, tal vez le puedas indicar un nombre con el que guardar al llamarlo, o decirle que no pregunte nada y coja uno por defecto o lo que sea, ni idea.

(Ésta pregunta no pinta demasiado en este hilo, que se supone sólo de C/C++...)
Hola buenas, que tal llevais los programas? :P
Weno, ya se más o menos lo básico en C, y querría seguir aprendiendo más, quiero aprender algo de C++, pero tengo una duda con respecto a los programas de ventana, en Java me han dicho que es bastante más facil que en C, porque hay muchos más objetos predefinidos que tan solo tienes que tratarlos, la verdad es que de Java no se nada, pero se algo de Basi y en Visual Basic hacer un programa de ventanas es la mar de sencillo, la mayor parte es a golpe de click.
He visto el código de ejemplos de programas con ventanas en C y he visto que todo es en códigos poniendo la posición de los objetos y el tamaño de las ventanas y demás elementos a mano, querría saber si hay algún programa o algo en el que puedas al menos colocar los elementos de la ventana a mano para verlo como queda y luego sacar las posiciones o algo.
Muchas gracias.
¿Ventas en C? No sabía que eso era posible [agggtt]
¿Ventas en C? No sabía que eso era posible [agggtt]
Buenas, yo soy novatillo también en esto del c++ (estoy terminando el primero año del módulo superior de programación), pero ya hemos dado objetos, constructores, sobrecargar operadores, estructuras, funciones, bucles, blablabla... y me gustaría saber si con lo que sé podría pasar a hacer algo (po mi cuenta) con GUI, vamos, con ventanitas.

He leído mucho sobre las API de windows, pero ni entiendo ná. Supongo que son funciones o métodos ya hechos del tipo "créame una ventana de 150x150" pero no sé qué compilador usar ni cómo hacerlo.

Vamos, tampoco pretendo hacer un 3dsmax, sólo me gustaría hacer una aplicación del tipo "ventanita pequeña que ponga hola mundo y con un botón que haga algo". No sé si será mucho pedir para mí xD es que estoy cansado de el modo texto 80x25 del TurboC xD

¿tutoriales o algo? Gracias.
Para el tema de "ventanitas" hay mejores herramientas que usar sólo C++ y llamadas a la API de Windows, eso es un infierno... Si quieres programar con entorno gráfico de usuario en Windows, mejor tira por Visual C++, Visual C++.NET, Java (no te recomiendo esto para el tema de las ventanitas), o Borland. Esto tirando por el rollo C/C++, si no, usa mejor C# o Visual Basic.NET.
Los de windows os dificultais la vida, en linux, con GTK+ y C puedo hacer la interfaz a golpe de raton y luego meterle el codigo :).

Un saludo.
Fox escribió:Los de windows os dificultais la vida, en linux, con GTK+ y C puedo hacer la interfaz a golpe de raton y luego meterle el codigo :).

Si, seguro, como que windows ya disponia de editores gráficos en visual studio desde hace MUCHO más tiempo. No creo que hayas descubierto nada.
De hecho programar "a pelo" las ventanas es simplemente un coñazo por temas de estilo: alinear botones, campos, etc aunque seguro que alguno dirá que si no lo haces con vi o emacs y sin IDE no eres hombre (opinión de algunos linuxeros de mi facultad)

Por otro lado, también puedes hacer eso mismo en Windows, ya que también hay editores de GTK+

bas escribió:
No exactamente...

Me gustaría que la matriz sea una propiedad de la classe, declarada por tanto en el .h, como const, y al ser constante querría darle los valores que tiene en el .cpp.

Con un vector unidimensional no hay demasiados problemas, se puede hacer por ejemplo en el .h un

const int x[];

y en el cpp

const int Clase::x[] = { 1, 2, 3 };

y ya se tiene un array constante con esos valores... pero, qué debería hacer para obtener algo similar con una matriz?

Pues lo mismo:

En el .h
class C
{
const int x[N][M];
};

en el .cpp
const int C::x[N][M] =
{
{ {elemento11}, {elemento12}, ... , {elemento1M}},
{ {elemento21}, {elemento22}, ... , {elemento2M}},
...
{ {elementoN1}, {elementoN2}, ... , {elementoNM}
};

Es IMPORTANTE que definas, AL MENOS el número de COLUMNAS que tiene la matriz (const int x [][M])
Buenas, trato de hacer un programa en c que liste los archivos que hay en un directorio, soy bastante novato, y ayudándome de internet y tal, tengo esto:

#include <Shlwapi.h>
#include <iostream>
#include <Windows.h>
void main(LPCTSTR path)
{
   TCHAR searchPath[MAX_PATH];

   lstrcpy(searchPath, path);
   PathAppend(searchPath, _T("*"));

   WIN32_FIND_DATA ffd;
   HANDLE sh = FindFirstFile(searchPath, &ffd);
   if(INVALID_HANDLE_VALUE == sh) return;
   
   do {
      printf("Nombre = %s",ffd.cFileName);
      printf("Type = %s", (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? "dir\n" : "file\n" );
 
   } while (FindNextFile(sh, &ffd));

   FindClose(sh);
}



Me pone que no existe el identificador _T, y eso lo cojí de una web, y no sé como funciona esa función.

A ver si alguien me puede ayudar con esto o dándome ideas de cómo hacerlo.

Muchas gracias!!
weno gente, necesito el codigo para C (a secas) para ver si un numero es primo o no

un saludo y gracias por adelantado


EDIT, comentar que en pseudocodigo lo tengo planificado pero he introducido variables booleanas que C no permite...de ahi que os lo pida
NiLbReTh escribió:EDIT, comentar que en pseudocodigo lo tengo planificado pero he introducido variables booleanas que C no permite...de ahi que os lo pida

Pero eso es tan facil como tener una variable que le des el valor 0 o 1 XD
0 = Falso
1 (o cualquier otro numero que no es 0) = Cierto
JanKusanagi escribió:Pero eso es tan facil como tener una variable que le des el valor 0 o 1 XD
0 = Falso
1 (o cualquier otro numero que no es 0) = Cierto

ostris...toy medio tonto...lo voy a intentar asi ;)
En c++ sí puedes utilizar variables booleanas si no me equivoco... aunque el 0 y 1 también puede servirte [oki]
Yo normalmente cuando quiero utilizar un convenio de variables booleanas o lo que sea, en C++ me defino dos constantes VERDADERO ó VERD que pongo a 1 y FALSO que pongo a 0...así en los if que tenga que comparar o al asignar valores a variables que considero booleanas utilizo eso...

No es que sea lo mejor, pero me acostumbré a hacerlo cuando aprendí y es lo que hago siempre :D

...pequeña anécdota nada más

Saludos!
ijjys escribió:Buenas, trato de hacer un programa en c que liste los archivos que hay en un directorio, soy bastante novato, y ayudándome de internet y tal, tengo esto:

#include <Shlwapi.h>
#include <iostream>
#include <Windows.h>
void main(LPCTSTR path)
{
   TCHAR searchPath[MAX_PATH];

   lstrcpy(searchPath, path);
   PathAppend(searchPath, _T("*"));

   WIN32_FIND_DATA ffd;
   HANDLE sh = FindFirstFile(searchPath, &ffd);
   if(INVALID_HANDLE_VALUE == sh) return;
   
   do {
      printf("Nombre = %s",ffd.cFileName);
      printf("Type = %s", (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? "dir\n" : "file\n" );
 
   } while (FindNextFile(sh, &ffd));

   FindClose(sh);
}



Me pone que no existe el identificador _T, y eso lo cojí de una web, y no sé como funciona esa función.

A ver si alguien me puede ayudar con esto o dándome ideas de cómo hacerlo.

Muchas gracias!!



logico que te diga eso, sino esta declarado

lo que ocurre es que no se como funciona esa funcion, voy a investigar algo por google


EDITO:

joder!!! pongo listar archivos en c y me encuentro con 999999 millones de mensajes tuyos por todos los foros, en algunos ya te han respondido asi que dejo de buscar xD
alguien me recomendaria algun lenguage de programacion antes de empezar con el C#??

teniendo encuenta que de lenguage lo unico que se es html.
Atacando por otro hilo... ¿eh? xDDD

Bueno... yo este verano me voy a poner con Java en serio con un amigo que está estudiando ingeniería infomática.

El tema es que empezar con Java es más complicado porque es un lenguaje orientado a objetos total, y en un principio es más difícil de entender. Pero una vez lo haces, es más fácil, ya que es lo más cercano a la vida que hay de momento en lenguajes de programación.

Un lenguaje como C, es ¿imperial? ( ¿es así? xDD). Como han dicho en otro hilo, es más al estilo receta de cocina: unas órdenes detrás de otras. Claro que al empezar es más fácil, pero al irse complicado el código, puede llegar a ser frustrante.

Te aconsejo Java. No tiene tanta potencia como C o C++, pero tiene suficiente y es un lenguaje en auge que yo creo que tiene mucho futuro. Con esto no digo que C no lo tenga, no me lapidéis aún xD.

Hay libros muy buenos para Java. Hay 3 que te recomiendo.

Piensa en Java (Thinking in Java). Es gratis la versión inglesa, la española cuesta dinero.

Aprenda java como si estuviera en primero: Es de una universidad, gratis total.

La Biblia de java (Anaya): Es un poco cara pero por lo que he podido ver es bastante buena.

Antes de hacer un gasto como esos, mira a ver si están en alguna biblioteca o un colega los tiene...o también puedes conseguirlos por "otros" métodos. Pero si el libro de verdad merece la pena, es bueno comprarlos y tenerlos de consulta.

Con empeño y entusiasmo se consigue.
centipado escribió:Un lenguaje como C, es ¿imperial? ( ¿es así? xDD). Como han dicho en otro hilo, es más al estilo receta de cocina: unas órdenes detrás de otras. Claro que al empezar es más fácil, pero al irse complicado el código, puede llegar a ser frustrante.

Imperativo [ginyo]
hola, tengo un pequeño problemilla con c++, a ver si podeis ayudarme:

estoy intentando generar numeros aleatorios y lo unico que encuentro por ahi son ejemplos de las funciones rand() y srand(). lo malo es que que con estas funciones siempre se repite la misma secuencia.

se que en unix existen funciones como la drand48 que soluciona este problema, lo malo es que estoy programando en windows

a ver si conoceis algun metodo, si no me tendre que poner a buscar una libreria (porque yo no pienso implementarlo X-D )

edito: bueno, al final he tenido que pasarme a linux. es un coñazo porque tengo que trabajar de forma remota pero ya tengo verdaderos numeros aleatorios.
Uhms, si te funciona con srand() y rand() en linux y en windows no... creo que es porque en Windows las funciones se llaman de otra forma.

si no recuerdo mal.. ponia esta cabecera al principio de los programas que usan random para que funcionasen correctamente:

#ifndef srand
#define srand srandom
#define rand random
#endif
no, si las funciones srand y rand van tanto en linux como en windows,
son la drand48, lrand48... las que no estan en windows y por eso para no complicarme la vida he tenido que compilar en linux.
Vaya, perdona que te habia entendido mal, xD

Para que no repita siempre la misma secuencia de numeros es sencillo, usa una semilla lo más aleatoria posible, normalmente se usa la hora, ya que a cada segundo es distinta.

Es muy sencillo, al principio del programa cambias la semilla haciendo

srand(time(NULL));

Eso si, recuerda el

#include


[bye]
gracias por contestar.
lo de usar como semilla la hora ya lo habia visto por algunos sitios, el problema es que en un segundo puedo hacer miles de llamadas a rand(), por lo cual necesitaria que la semilla variase mucho mas frecuentemente.

pero vamos que como dije antes con linux no tengo problemas que las funciones xrand48 te aseguran una secuencia aleatoria distribuida uniformemente.
yauros escribió:gracias por contestar.
lo de usar como semilla la hora ya lo habia visto por algunos sitios, el problema es que en un segundo puedo hacer miles de llamadas a rand(), por lo cual necesitaria que la semilla variase mucho mas frecuentemente.

Pero ese problema se soluciona llamando UNA vez a srand() al inicio del programa, por ejemplo, ya que rand simplemente genera una secuencia pseudoaleatoria asociada a esa semilla.

Si te preocupa sobremanera, cada x tiempo haz otra llamada a srand, así podrías estar cambiando la secuencia aleatoria cada x segundos, por ejemplo.
ijjys escribió:Buenas, trato de hacer un programa en c que liste los archivos que hay en un directorio, soy bastante novato, y ayudándome de internet y tal, tengo esto:

#include <Shlwapi.h>
#include <iostream>
#include <Windows.h>
void main(LPCTSTR path)
{
   TCHAR searchPath[MAX_PATH];

   lstrcpy(searchPath, path);
   PathAppend(searchPath, _T("*"));

   WIN32_FIND_DATA ffd;
   HANDLE sh = FindFirstFile(searchPath, &ffd);
   if(INVALID_HANDLE_VALUE == sh) return;
   
   do {
      printf("Nombre = %s",ffd.cFileName);
      printf("Type = %s", (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? "dir\n" : "file\n" );
 
   } while (FindNextFile(sh, &ffd));

   FindClose(sh);
}



Me pone que no existe el identificador _T, y eso lo cojí de una web, y no sé como funciona esa función.

A ver si alguien me puede ayudar con esto o dándome ideas de cómo hacerlo.

Muchas gracias!!


Mejor utiliza la libreria dirent.h, que es estandar. Aquí te dejo un ejemplo funcional:

#include <stdio.h>
#include <dirent.h>

int main() {
   DIR *directorio;         // Stream de un directorio
   struct dirent *infoArchivo;      // Información de un archivo concreto
   
   // Creamos un stream de un directorio
   directorio = opendir("C:\");
   
   // Escribimos en la consola el nombre de los archivos encontra
   infoArchivo = readdir(directorio);
   while(infoArchivo) {
      printf("%s\n", infoArchivo -> d_name);
      infoArchivo = readdir(directorio);
   }
   
   // Cerramos el stream
   closedir(directorio);
   
   return 0;
}
Alguien conoce algun algoritmo para pasar de decimal a cualquier base de forma recursiva??.

De decimal a binario lo he hecho pero que lo haga con cualquier base no tengo ni idea :S. A ver si alguien em puede ayudar y de paso revivamos el hilo que esta muerto desde el mes de Junio...
Si puedes, postea el código del programa que pasaba de decimal a binario. Gracias
Moutio aqui tienes el codigo para pasar de decimal a binario de forma recursiva.

#include

void dec_bin(int x);

int main()
{
int a;
printf("Introducir numero \n");
scanf("%d",&a);
dec_bin(a);
return 0;
}

void dec_bin(int x)
{
int coc, resto;
coc =x/2;
resto = x%2;
if(coc > 1)
dec_bin(coc);
else
if (coc==1)
printf("%d ",1);
printf("%d ",resto);
}

Aver si alguien me puede ayudar con lo de pasar a cualquier base.
Funciona... XD

#include

void dec_bin(int x, int base);

int main() {

int a, base;

printf("Introducir numero \n");
scanf("%d",&a);

printf("Introducir base \n");
scanf("%d",&base);

dec_bin(a, base);

return 0;
}

void dec_bin(int x, int base) {
int coc, resto;

coc = x / base;
resto = x % base;

if(coc > base-1)
dec_bin(coc, base);
else
printf("%d ",coc);
printf("%d ",resto);

return;
}


[bye]

Editado para indentar.
Editado 2: no pilla espacios al principio de linea.. y he probado el codigo y parece que funciona
Gracias por el código, voy a toquitear cosas a ver si saco algo
Hola. Hace tiempo que no hay actividad en este hilo pero voy a dejar planteada una duda a ver si algun alma caritativa me la resuelve.

Tengo que hacer un programa en C que esta dividido en 3 achivos: un .h con la declaracion de las funciones y eso, un "main.c" que tenga el cuerpo del programa, y un "estadistica.c" que tenga la funcion estadistica, que halla la media de notas de una serie de alumnos, pudiendose introducir numericas o escritas.

El caso es que lo tengo todo hecho (mas o menos), pero no se juntar main.c con estatistica.c, y cuando los compilo por separado me dan error, obviamente, porque a cada fichero le faltan parametros.

Uso Devc++, ¿que hay que hacer para linkear un fichero a otro? y ¿como se crea exactamente un header file (.h)?

Salu2
Tenerlos todos en el mismo proyecto y que cada fichero tenga su respectivos includes...
Escapology, gracias a tu pequeña ayuda, he conseguido acabar el programa (resulta que no sabia que lo tenia que hacer dentro de un proyecto, siempre que hago un programa le doy a nuevo codigo fuente)

Si alguien tiene curiosidad de ver como me ha quedado el programa, os dejo el ejecutable. El programa lo que hace es que a partir de las notas de n alumnos, hace los porcejtajes de aprobados, suspensos, notables... la gracia esta en que puedes introducir los datos de forma numerica o escrita. Todavia me falta tener en cuenta los rangos de valores introducidos y eso, pero com esto por ahora me conformo.

Seguramente para los que sepais mucho os parezca una chorrada, pero a mi me ha costado hacerlo sin ayuda. M

Adjuntos

Upeo un poco el hilo con unas dudas q tengo (estoy empezando con C)

Bien, el caso es que en la facultad estamos dando Pascal, pero por mi cuenta quiero aprender C (para no tener q estar esperando para el año q viene).

Estoy intentando portar mi practica de Pascal a C, una "calculadora" de matrices.

Tengo q crear el tamaño de las matrices en tiempo de ejecucion:

En Pascal utilizamos punteros a esquemas de arrays, algo tan simple como:

TYPE
    tArray (F, C: INTEGER) = ARRAY [1..F, 1..C] OF REAL;
    tpArray = ^tArray;


Estoy intentando hacer lo mismo en C y la unica manera q he encontrado ha sido con la funcion malloc (para reservar memoria y esas gaitas XD), algo tal q asi:

Crear_Matriz(float **matriz)
{
    short i, j;
   
    // Crear filas
    matriz = (float**) malloc(f * sizeof(float*));
    if (matriz == NULL) {
        printf("Memoria insuficiente.\n");
        printf("La ejección se interrumpirá.\n");
        printf("Pulse una tecla para terminar ... ");
        getchar();
        exit(0);
    }
   
    // Crear columnas
    for (i = 0; i < f; i++) {
        *(matriz + i) = (float*) malloc(c * sizeof(float));
        if (* (matriz + i) == NULL) {
            printf("Memoria insuficiente.\n");
            printf("La ejección se interrumpirá.\n");
            printf("Pulse una tecla para terminar ... ");
            getchar();
            exit(0);
        }
    }
}


¿No hay otra manera menos liante?

Otra cosa, despues de crear las dimensiones de la matriz intento rellenarla con numeros con esta funcion:

int ObtNumMatriz(float **matriz)
{
    int i, j;
   
    printf("Introduce los numeros de la matriz: \n");
    for (i = 0; i < f; i++)
        for (j = 0; j < c; j++) {
            printf("matriz [%2hd][%2hd] = ", i, j);
            scanf("%f", &matriz[i][j]);
        }
}



Lo compilo y todo parece ir bien pero al ejecutar me da error:

cm2236:~/Desktop/matriz DSurf$ ./a.out
Introduce el numero de filas de la matriz
2
Introduce el numero de columnas de la matriz
2
Introduce los numeros de la matriz:
Bus error


A ver si me podeis echar un cable.

Salu2
rYlEi escribió:Estoy intentando hacer lo mismo en C y la unica manera q he encontrado ha sido con la funcion malloc (para reservar memoria y esas gaitas XD)

No tiene que ver con tu error, pero siempre que uses malloc para reservar memoria tienes que usar free después para liberarla. C no tiene recolector de basura.

Por cierto, la variable f, ¿de dónde coño sale?

Y por último: puedes usar gdb para depurar tus programas. O bien el depurador de Eclipse si usas ese IDE para programar en C/C++, que es mucho más cómodo.

Desarrollo con C/C++ en Eclipse
te sconsejo que al crear las columnas de la matriz, en ligar de utilizar *(matriz + i)... utilices (matriz[i] = (float *)malloc(c *sizeof(float)).

Yo al menos me liaba menos....

Y otra cosa... los caracteres [ y ] no son especiales?
prueba a ponerles delante una barra invertida \[ y \] que a lo mejor lo que falla es el printf...

[bye]
zootropo escribió:No tiene que ver con tu error, pero siempre que uses malloc para reservar memoria tienes que usar free después para liberarla. C no tiene recolector de basura.


Sabia q se me olvidaban cosas por preguntar :p y esta es una, y es si tengo q utilizar la funcion free en el mismo procedimiento q malloc. Es decir, en una funcion utilizo malloc y salgo de la funcion, ¿podria hacer un free en otra funcion para liberar la memoria utilizada anteriormente?

zootropo escribió:Por cierto, la variable f, ¿de dónde coño sale?


Pues la tengo como variable global (junto con c). A lo q me lleva a preguntar otra cosa q se me olvidaba tambien [Alaa!]:

La cuestion de ponerla global es para no tener q andar pasandosela como parametros a todas las funciones q utilicen las matrices (q van a ser la mayoria) para recorrerlas con algun for. Por ejemplo en pascal esto se soluciona asi:

FOR i := 1 TO Matriz^.F DO
    FOR j := 1 TO Matriz^.C DO
        ....
        ....


Se le pasa a la funcion unicamente la matriz (q es de tipo puntero) y con esta expresion "Matriz^.F" ya se consigue el valor del num. de filas de la matriz (y su correspondiente para las columnas es "Matriz^.C").

¿Existe algun tipo de "truco" parecido a este para saber el tamaño de las matrices q se le pasa a las funciones? He leido algo sobre sizeof pero no se si me serviria ein?

zootropo escribió:Y por último: puedes usar gdb para depurar tus programas. O bien el depurador de Eclipse si usas ese IDE para programar en C/C++, que es mucho más cómodo.

Desarrollo con C/C++ en Eclipse c


Gracias por la recomendacion, el depurador no me daba cuenta de el (con eso de q en GNU Pascal no hay :p).

Salu2

EDIT:

Batousay escribió:te sconsejo que al crear las columnas de la matriz, en ligar de utilizar *(matriz + i)... utilices (matriz[i] = (float *)malloc(c *sizeof(float)).

Yo al menos me liaba menos....


Gracias por el apunte, yo lo puse asi por era asi como lo vi en la documentacion de malloc. A mi tambien me gusta mas como me dices [oki]

Batousay escribió:Y otra cosa... los caracteres [ y ] no son especiales?
prueba a ponerles delante una barra invertida \[ y \] que a lo mejor lo que falla es el printf...


No creo q sea de eso ya q por ejemplo si pongo la funcion ObtNumMatriz (me refiero a lo q es el cuerpo de la funcion) dentro de la funcion Crear_Matriz me funciona. Yo creo q puede ser por los parametros q le paso, q a lo mejor no lo hago bien.

Salu2
Veamos... tienes razón jejej.

A crear Matriz le pasas mal la matriz, le deberias pasar float ***matriz.

Si no se te ocurre porqué, la explicación esta en el spolier

La cuestion es que cuando tu a crear matriz le pasas un doble puntero y luego creas la matriz sobre ese puntero estas modificando el valor que tiene la copia local del puntero, no se si me explico.

En realidad es como si tu a una función le pasas un entero y le sumas 3 dentro de la función, luego cuando sales de la función el entero seguirá valiendo lo mismo que al principio, ya que lo que has incrementado es la copia que hay dentro de la función.


Y bueno, si te aclara algo más, el codigo de crear matriz

void crear_matriz(float ***matriz) {
int i;
//Crear filas
*matriz = (float **)malloc(filas * sizeof(float *));

//Crear columnas
for(i = 0; i < filas; i++)
(*matriz)[i] = (float *)malloc(columnas * sizeof(float));
}


[bye]

Me explico fatal [buuuaaaa]

Edito, a mi las matrices me gustaba "empaquetarlas" dentro de una estructura así me evitaba las feas y asquerosas variables globales jejeje

Hacia algo así como

typedef struct _matriz {
float ** datos;
int filas, columnas;
} matriz;
Batousay escribió:Me explico fatal [buuuaaaa]


No, que va, si te he entendido bien le estoy pasando la matriz por valor en lugar de por referencia. Ya lo pillo :P

Es q tanto asterisco me marea [qmparto] y ya no se si es un puntero o lo q.

Voy a probar a cambiarlo.

Batousay escribió:Edito, a mi las matrices me gustaba "empaquetarlas" dentro de una estructura así me evitaba las feas y asquerosas variables globales jejeje

Hacia algo así como

typedef struct _matriz {
float ** datos;
int filas, columnas;
} matriz;


Con esto deberia de declarar la variable como "matriz" ¿no?. Lo tendre q probar tambien.

Muchisimas gracias [tadoramo]

EDIT:

¿Puedo pasar esa estructura como parametro de una funcion? Y si se puede, ¿como la paso por referencia?

Es q yo hago:

matriz matriz1    //declaro la variable asi, anteriormente tengo la estructura declarada.


Filas (matriz1);   //llamo al procedimiento de esta manera, le paso como parametro una variable de tipo "matriz"


Filas(matriz *matriz)   // le pongo el asterisco para pasar la variable por referencia. Aqui es donde me da error de compilacion.
{
    ...;
    ...;
}
Deberías poner esto para pasarle la dirección de memoria, ya que la función filas espera un puntero a un tipo de dato matriz
tambien en la funcion filas el parametro matriz deberias llamarlo de otra manera, no como el tipo de dato
(espero no equivocarme [looco] )


Filas (&matriz1);   //llamo al procedimiento de esta manera, le paso como parametro una variable de tipo "matriz"
Hola amigos,vereis estoy algo agobiado pq estoy estudiando un ciclo superior de programación y no doy conseguido sacarme la asignatura de C,no se si el problema esta en que no estudio lo suficiente o que tendría que cambiar la forma de estudiar,¿podríais ayudarme? como se debe estudiar C.
Lo que hago ahora es hacer ejercicios problemas (programas) que plantea la profesora y los repito hasta cojerle el tranquillo,pero no me dan muy buenos resultados bueno muchas gracias saludos y espero vuestras respuestas programadores :)

PD:una buena pagina de manuales es http://www.aulaclic.net
hugh. escribió:Hola amigos,vereis estoy algo agobiado pq estoy estudiando un ciclo superior de programación y no doy conseguido sacarme la asignatura de C,no se si el problema esta en que no estudio lo suficiente o que tendría que cambiar la forma de estudiar,¿podríais ayudarme? como se debe estudiar C.
Lo que hago ahora es hacer ejercicios problemas (programas) que plantea la profesora y los repito hasta cojerle el tranquillo,pero no me dan muy buenos resultados bueno muchas gracias saludos y espero vuestras respuestas programadores :)

PD:una buena pagina de manuales es http://www.aulaclic.net

No se te da bien C, no se te da bien Java... Lo mismo te has equivocado de ciclo [jaja]

No, en serio... ¿Cuál es la dificultad que tienes? ¿Aprender la API? ¿Dudas por los punteros y la gestión de memoria?
verás voy a intentar explicarlo como pueda

la profesora de C es muy buena profesora pero muy exigente tuve un examen de conocimientos basicos,bucles,estructras repetititas,problemas mas o menos sencillos y lo cargue por tonterias,mi problema es que no se comotngo que estudiarlo,para eso lo que hice fue hacer de nuevo sin ver los ejercicios que nos habia dado en clase pero no se si es lo correcto por eso preguntaba.

por otro lado el profesor de java no sabe explicar no preprara las clases y es el doble de duro,escribe en la pizarra y siempre le tienen que estar corrigiendo algo poreso estoy desconcertado y por eso pido ayuda :) gracias y saludos
Alguien de aquí programa con QT? Bueno, algún cordobés de sistemas/gestión seguro, porque es lo que se hace en EDI (estructuras y datos de la información). Para los que no lo sepan, es una librería gráfica, bastante entretenida, en c++, aunque es un coñazo hacer tooodo por código.
Mi problema en realidad es una tontería, y es que tengo instalada la librería tanto en winxp como en ubuntu , y en ambos casos tengo la misma situación. Cuando construyes una barra de menú (archivo, editar...ayuda), existe una función que se llama addSeparator(), que básicamente lo que hace es alinear a la derecha el resto de los menús que pongas. Muy bien, en los pc's de la facultad funciona estupendamente, sin embargo, tanto en linux como en Winxp, se la pasa por el forro y no me hace el separador...alguna idea de por qué? XD
288 respuestas
1, 2, 3, 4, 5, 6