Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - David8

#1
Imaginemos que tenemos una estructura tal que:

struct estructura{
// miembros
};

struct estructura *variable;


y ahora

variable = malloc(5 * sizeof(*variable));


Quería saber si liberar la memoria así:

for(i = 0; i < 5; i++){
free( (variable + i) );
(variable + i) = NULL;
}


es correcto.

Un saludo.
#2
Programación C/C++ / Re: A que equivale...
20 Mayo 2014, 21:03 PM
Cita de: Gh057 en 20 Mayo 2014, 21:00 PM
hola  David8 , fíjate como estás tomando la asociación... estás intentando agrupar a
todo
a un puntero, pero j lo intentas asignar a palo? palo no lo tenías como un arreglo de chars?

palo es un arreglo de punteros a char

Un saludo
#3
Programación C/C++ / Re: A que equivale...
20 Mayo 2014, 20:33 PM
Cita de: rir3760 en 18 Mayo 2014, 17:26 PM
Eso sucede porque el operador "." tiene mayor prioridad que "*" y esa expresión se termina evaluando así:
*((vector + i).miembro);

Para que se evalué en la forma correcta debes utilizar paréntesis:
(*(vector + i)).miembro;
O utilizar el operador "->":
(vector + i)->miembro;

Un saludo

Otra cosilla. Es que acabo de ver que el operador -> tiene mayor preferencia que +
Entonces al hacer algo como esto:
(*((Jugador + i) -> palo + j)) = NULL;
supongo que se estará haciendo primero
(Jugador + i) -> palo
y después se le suma j.

He intentado hacer
(*((Jugador + i) -> (palo + j))) = NULL;
pero me da error.

¿Qué puede pasar?

Un saludo.
#4
Programación C/C++ / Re: Duda archivos en C
19 Mayo 2014, 11:24 AM
Cita de: eferion en 19 Mayo 2014, 11:16 AM
En primer lugar, 'c' no está inicializado. Pero además, dado que el valor que tenga 'c' en la primera iteración es indiferente, deberías replantearte cambiar el while por un do-while.


int mayorLinea(FILE *arch)
{
char c;
int contador = 0;
int aux = 0;

while(c != EOF){


En la siguiente sección, no reinicias la variable "contador", sino que estás forzando una comparación:


if(contador > aux){
aux = contador;
}
contador == 0;


A ese "==" le sobra uno de los dos caracteres.

Hice lo que me dijiste
int mayorLinea(FILE *arch)
{
char c = 'a';
int contador = 0;
int aux = 0;

c = fgetc(arch);
do{
if(c != '\n'){
contador++;
}
else{
if(contador > aux){
aux = contador;
}
contador = 0;
}

c = fgetc(arch);

} while(c != EOF);

return aux;
}


y solucionado

Muchas gracias
#5
Hola de nuevo. Resulta que estoy haciendo un programa que involucra archivos y hay un segmento en el que me resulta útil saber la línea más larga del archivo.

Para ello tengo este código:

int main(void)
{
int N;
// codigo
FILE *archivo;
archivo = fopen(nombreArchivo.txt, "r");
N = mayorLinea(archivo);
// codigo
fclose(archivo);

return EXIT_SUCCESS;
}

int mayorLinea(FILE *arch)
{
char c;
int contador = 0;
int aux = 0;

while(c != EOF){
c = fgetc(arch);

if(c != '\n' && c != EOF){
contador++;
}
else{
if(contador > aux){
aux = contador;
}
contador == 0;
}
}

return aux;
}

La duda es que si imprimo N en el main() me sale siempre 0. Me parece que la forma en la que llamo a la función es errónea, pero no encuentro tal error.
Un saludo y gracias
#6
Programación C/C++ / Re: A que equivale...
18 Mayo 2014, 12:16 PM
Cita de: rir3760 en 10 Mayo 2014, 03:05 AM
En C todo se pasa por valor, cuando llamas a una función antes que el cuerpo de esta se ejecute cada uno de los parámetros (variables locales a la función) se inicializa con el argumento correspondiente (valores utilizados en la llamada).

La única excepción son los arrays, con estos cuando se llama a una función el valor que se pasa es la dirección en memoria del primer elemento, un array de tipo "T [N]" genera un valor de tipo "T *" donde T es el tipo de los elementos.

Si tu declaras una función de esta forma:
int fn(char *mat[100]);
Por lo anterior (N es 100, T es "char *") la declaración en realidad es:
int fn(char **mat);

Un saludo

Ya lo pillé, gracias.

Una última cosa, con relación al tema original del tema. Si en vez de tener el acceso a los miembros de la estructura con notación puntero uso por ejemplo vector[i].miembro;
¿cómo lo puedo representar a notación de puntero?
Es que he probado con *(vector + i).miembro; y me da error.

Un saludo.

#7
Cita de: do-while en 12 Mayo 2014, 16:03 PM
¡Buenas!

Si las funciones tienen poco código, puedes declarar macros que hagan el trabajo de las funciones. Si lo haces de esta forma, el preprocesador sustituirá las llamadas a las macros por el código que contienen y realmente no habrá ninguna llamada a ninguna función, sino que tendrás el código "incrustado" en el lugar de la llamada.

Si utilizas C++ y como antes las funciones tienen poco código, siempre puedes declarar las funciones inline, aunque en este caso dependerá del compilador la decisión de sustituir las llamadas por el código que contienen.

Otra opción, en el caso de que la función reciba structs, es pasar los parámetros por referencia (utilizando punteros), ahorras tiempo al no tener que escribir el struct completo en la pila...

Sin tu código no podemos darte mas indicaciones.

¡Saludos!
La función tiene una longitud aproximada de 200 líneas (no sé si eso es mucho o poco)
Uso C

Un saludo.
#8
Hola. La cuestión es que tengo un programa en el que hay una serie de funciones que son llamadas bastantes veces durante la ejecución de este(más de 20 cada una).
Lo que quería saber es si existe algún método para mejorar la velocidad del programa cuando se hacen muchas llamadas a una función.

Un saludo.
#9
Programación C/C++ / Re: A que equivale...
9 Mayo 2014, 19:22 PM
Cita de: Gh057 en  9 Mayo 2014, 13:26 PM
hola David8, no es lo mismo... un puntero es una variable que guarda una dirección de memoria, cierto?
en

lo que intentas hacer es guardar la dirección de memoria del puntero palo, que coincide con el arreglo... debería tirarte un warnig sobre ello... intentas definir  un "puntero a puntero" que es guardar en una variable la dirección de memoria de otra tipo puntero, cual a su vez contiene la dirección de memoria de un tipo de dato... XD

corresponde al tema de "operaciones con punteros" para que puedas profundizar el concepto.

saludos.

A vale, muchas gracias.
Es que por ejemplo cuando tengo una función que recibe un parámetro que es por ejemplo
const char *nombre[]
y lo cambio por
const char **nombre
no me dice nada

Un saludo
#10
Programación C/C++ / Re: A que equivale...
9 Mayo 2014, 11:30 AM
Cita de: rir3760 en  9 Mayo 2014, 04:28 AM
Utilizas:
*((jugador + i)->cadena + j)

Un saludo

Muchas gracias  :D

Otra pequeña duda. Cuando creo un array de punteros a char como por ejemplo:
const char *palo[] = {"Corazones", "Diamantes", "Treboles", "Picas"};
el compilador me lo permite perfectamente; sin embargo cuando uso:
const char **palo = {"Corazones", "Diamantes", "Treboles", "Picas"};
el compilador me lanza warnings. ¿Porqué pasa esto, si en teoría es lo mismo?

Un saludo