Foros del Web » Programación para mayores de 30 ;) » C/C++ »

dudas code

Estas en el tema de dudas code en el foro de C/C++ en Foros del Web. Bueno, despues de un tiempo, he vuelto a estudiar C y me han surgido algunas dudas en estos codigos. 1. Código: #include<stdio.h> #include<stdlib.h> void funcion(int ...
  #1 (permalink)  
Antiguo 19/01/2007, 19:51
 
Fecha de Ingreso: julio-2006
Mensajes: 99
Antigüedad: 17 años, 9 meses
Puntos: 0
dudas code

Bueno, despues de un tiempo, he vuelto a estudiar C y me han surgido algunas dudas en estos codigos.


1.
Código:
#include<stdio.h>
#include<stdlib.h>

void funcion(int []);
void main(){
char a[10]={1,2,3,4,5};
funcion(a);
printf("%d",a[2]);
}

void funcion(int a[])
{
int i;
a[2]=9;

}
Por que me imprime 3 y no 9, si estoy pasando como parametro la direcicon de memoria del array??

2.

Por que no puedo retornar un puntero desde una funcion?, me explico...
A ver, por ej, si tu retornas de una funcion, " &var", como retornas la direccion de memoria de la variable, al cambiar la pila, cambia el valor de "&var", hasta ahi bien. Pero, según tenia entendido, (ademas lo lei tb en el FAQ d esta pagina) si tu, retornas un puntero desde una funcion, lo q contiene esa direccion de memoria no varia, ya q se guarda en memoria heap, y no en la pila. Pues bien, he hecho un code, para comprobar eso, y sigue cambiando el valor,retornando el puntero, al igual q con "&var"... q pasa??

3.

Por que no se puede poner esto : while (s1[i]!='\0')&& (!log)?? Me da error en el compilador, q pasa? (log es de tipo logico, en este caso, log=cierto)...

Saludos.
  #2 (permalink)  
Antiguo 19/01/2007, 21:06
Avatar de marlonbtx  
Fecha de Ingreso: febrero-2006
Ubicación: Tijuana,B.C. Mexico
Mensajes: 151
Antigüedad: 18 años, 2 meses
Puntos: 2
Re: dudas code

a ver prueba poniendo la funcion arriba del void main
Cita:
#include<stdio.h>
#include<stdlib.h>

void funcion(int a[])
{
int i;
a[2]=9;

}
void main(){
char a[10]={1,2,3,4,5};
funcion(a);
printf("%d",a[2]);
}
  #3 (permalink)  
Antiguo 19/01/2007, 22:00
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: dudas code

Cita:
Por que me imprime 3 y no 9, si estoy pasando como parametro la direcicon de memoria del array??
Si arreglas el error que menciono abajo imprime 9.
Cita:
char a[10]={1,2,3,4,5};
funcion(a);
Esto me hace pensar que no ejecutaste el programa, el arreglo a es del tipo char y tu funcion recibe un arreglo de tipo int, en cualquier compilador que pruebes obtendras un error en esa lina. Cambia en tipo char a int en la declaracion del arreglo. Para que quede asi:
Código:
#include<stdio.h>
#include<stdlib.h>

void funcion(int []);

void main()
{
  int a[10]={1,2,3,4,5};
  funcion(a);
  printf("%d",a[2]);
}

void funcion(int a[])
{
  int i;
  a[2]=9;
}
Cita:
Pues bien, he hecho un code, para comprobar eso, y sigue cambiando el valor,retornando el puntero, al igual q con "&var"... q pasa??
Postea el codigo para ver, asi se despejaran mejor las dudas.
Cita:
Por que no se puede poner esto : while (s1[i]!='\0')&& (!log)?? Me da error en el compilador, q pasa? (log es de tipo logico, en este caso, log=cierto)...
Lo tienes asi:
Código:
while (s1[i]!='\0')&& (!log)
y deberia ser:
Código:
while( (s1[i]!='\0')&& (!log) )
Fijate en los parentesis que agregue. Los coloque mas separados para que los vieras, los espacios no seran tomados en cuenta al momento de compilar.
Cita:
a ver prueba poniendo la funcion arriba del void main
marlonbtx eso no tiene nada que ver con el error que menciona. Ademas asi como tu indicas sigue estando el error de compilacion, creo que debe ser algo de "no coinciden los tipos" o "no se puede convertrir de .... a ...."

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #4 (permalink)  
Antiguo 19/01/2007, 22:06
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: dudas code

Bueno.
Primero, para pasar por referencia con punteros te recomendaria mas algo como:
Código:
void funcion(int *a)
{
int i;
a[2]=9;

}
Segun mi experiencia, es lo mismo. Pero igual y me puedo equivocar.

Para retornar punteros desde una funcion tendrias que hacer algo asi:

Código:
int *funcion(...)
{
   int *i;
   i=(int *)malloc(sizeof(int)*5);
   i[0]=1;
   i[1]=2;
   i[2]=3;
.
.
   return i;
}
Esto crea espacio para un array de ints y retorna la direccion de este espacio de memoria. Solo recuerda liberar ese trozo de memroia despeus con un free(variable_devuelta);

Nunca devualvas un puntero de una variable estatica dentro de una funcion, ya que al acabar la funcion, el espacio de esa variable se libera automaticamente por el Sistema operativo.

Por ultimo:

Código:
Por que no se puede poner esto : while (s1[i]!='\0')&& (!log)?? Me da error en el compilador, q pasa? (log es de tipo logico, en este caso, log=cierto)...
Obviamente esto te va a dar error.
En todo caso tendria que ser asi:

while ((s1[i]!='\0')&& (!log))
Ya que la condicion del while solo son las 2 y en tu programa le dices que solo use la primera.
Con esos parentesis extras, te debe de leer las 2.

Espero haberte ayudado.

SAludos
  #5 (permalink)  
Antiguo 19/01/2007, 22:13
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: dudas code

Cita:
Segun mi experiencia, es lo mismo. Pero igual y me puedo equivocar.
Para ese caso es lo mismo, el resultado sera el mismo. Lo que pasa es que a veces por convencion se suelen usar los corchetes cuando es un arreglo estatico y el "*" cuando es un arreglo dinamigo o una variable que se pasa por direccion, pero como dije es pura convencion...

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #6 (permalink)  
Antiguo 20/01/2007, 21:16
 
Fecha de Ingreso: julio-2006
Mensajes: 99
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: dudas code

1. Bueno fue un despieste, el caso esque el compilador no me dio error, ahora que me fije bien, me dio un warning, pero me dejo compilar.
2. El caso esque ayer lo probe y no me iva, y hoy cuando lo probe, me fue, un misterio... jeje..
3. ok, se me paso poner el parentesis.


Ahora esta mirandome el tema de los ficheros, a ver si encontrais el error en este programa, por que no copia los numeros al fichero de escritura??

Código:
#include<stdio.h>
#include<assert.h>
#define MAX 7
typedef FILE * fichero;
typedef char cadena[10];

void main()
{
int cad[MAX];
fichero f1,f2;
int i,i2,i3,i4,i5;
f1=fopen("fich.txt","r");
f2=fopen("fich2.txt","w");
assert (     ! (  (f1==NULL) || (f2==NULL)  )     );


while  (     (    !(feof(f1))    )    &&    (i<MAX)    ) 

 {

fscanf(f1,"%d",&cad[i]);

i++;
}

while (i<MAX){

fprintf(f2,"%d",cad[i]);

i++;
}

}

Otra pregunta sobre los ficheros de texto. Por ej, teniendo esto en un fichero de texto:

Código:
ABC DD 6 7 LL
33
Como tendrias q poner las sentencia fscanf, fgets... para que guardara en una variable de tipo cadena, cad1 = "DD 6", en otra, cad="ABC 7", y en una variable de tipo caracter, car = ' '(espacio en blanco) ???seria como contando las posiciones o como?

Otra pregunta aparte, por que no se puede declarar un array vacio (char cad[] ). Me da error en el compilador, me dice q tiene tamaño nulo, sin embargo en muchos manuales lo vi asi puesto.

Saludos.
  #7 (permalink)  
Antiguo 20/01/2007, 21:57
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: dudas code

Atu primer pregunta. Efectivamente tienes un error muy muy escondido.
Y es que usas i sin haberlo inicializado.

sustituye

int i,i2,i3,i4,i5;

por

int i=0,i2,i3,i4,i5;

y con eso jala.

A la siguiente rpegunta, lo mas que te puedo decir es lo siguiente:

fgets lee hasta encontrar un \n(osea un retorno), por eso se dice que lee una linea. Y lo guarda en una array. fscanf originalmente lee hasta encontrar un espacio. O mas bien lee por espacios. fread lee por bloque, la cantidad de bytes que tu queiras que lea.
aqui el chiste es o usar fscanf inteligentemente o usar fgets o fread y luego con las funciones de string.h ir separando conforme la necesidad de cada quien.

A tu tercera pregunta...
Obviamente no puedes declarar arrays vacios. Y si muchos manuales dicen que sis e puede, pero no, no se puede. En la version del nuevo estandar no se puede, ya que para eso se usan los punteros. Tu creas un puntero que es lo mismo que un array vacio. Luego en ejecucion almacenas un espacio a ese puntero que es como darle un tamaño al array dentro de la ejecucion. Y ahi se guarda lo que se quiere y al final esa memoria almacenada se libera.

Espero haberte ayudado.

Saludos
  #8 (permalink)  
Antiguo 21/01/2007, 15:23
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: dudas code

Por ultimo que no se te olvide cerrar el archivo con fclose()

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #9 (permalink)  
Antiguo 22/01/2007, 10:49
 
Fecha de Ingreso: julio-2006
Mensajes: 99
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: dudas code

1. Ah ok,no me di cuenta, bueno, tambien habria que incializar i a 0 antes del segundo while...

2. Y como se podria contar entonces las lineas de un fichero de texto, haciendo un fgets? pero, de cuantos caracteres? "fgets(cadena,????,manejador_fichero)??
Y para encontrar una cadena dentro de una linea de fichero, e imprimir el numero de linea donde fue localizada??

3. Sin embargo en las funciones si se pueden declaras arrays vacios. ej:
void funcion( int array[]);

saludos.
  #10 (permalink)  
Antiguo 22/01/2007, 15:45
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: dudas code

Cita:
2. Y como se podria contar entonces las lineas de un fichero de texto, haciendo un fgets? pero, de cuantos caracteres? "fgets(cadena,????,manejador_fichero)??
Y para encontrar una cadena dentro de una linea de fichero, e imprimir el numero de linea donde fue localizada??
Para contar las lineas es facil.

Dentro de un ciclo solo checas cuando se ha llegado al final del archivo.
also asi

while(!feof())
{
fgets(...);
contador=contador+1;
}


Para contar los caracteres dentro de la cadena solo usas strlen.
Si no quieres usar strlen entonces igual con un ciclo hasta que encuentroes un \n.

Para encontrar una cadena dentro de otra cadena(por lo consiguiente, de otro fichero), usas strstr(...). Con eso obtienes un puntero al lugar donde empieza la cadena localizada.

Cita:
3. Sin embargo en las funciones si se pueden declaras arrays vacios. ej:
void funcion( int array[]);
Pues no es que decalras, es simplemente que vas a pasar un parametro de ese tipo.
Teoricamente(y por lo que la experiencia me dice) es lo mismo eso que esto:

void funcion(int *array);

Es solo para pasar por valor o por puntero(pseudoreferencia) y en caso de C++, referencia.

En este caso pasas por puntero, y si pones la notacion argv[] como en la funcion main es lo mismo.

De hehco en la funcion main tienes:

char *argv[] que es igual a char **argv y a char argv[][].

Que es una lista de cadenas....

Espero haberte ayudado.

Saludos
  #11 (permalink)  
Antiguo 22/01/2007, 19:11
 
Fecha de Ingreso: julio-2006
Mensajes: 99
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: dudas code

Cita:
Si no quieres usar strlen entonces igual con un ciclo hasta que encuentroes un \n.
A que te refieres con esto?Esque tengo el problema de que al utilizar la funcion fgets, tengo que poner el numero de caracteres que quiero que lea, pero, como nose cuantos caracteres hay en cada linea del fichero, pues nose hasta donde poner que lea.. lo que quiero hacer, esque lea hasta \n como tu dices, pero nose como hacerlo...

Saludos.
  #12 (permalink)  
Antiguo 22/01/2007, 21:15
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: dudas code

fgets te lee hasta \n.
Por ejemplo.
si tienes una cadena en un fichero de este vuelo:

abcd(\n)

char buffer[512];
fgets(buffer, 511, file);

Solo te va a leer abcd y el caracter \n que es el indicador de nueva linea. Es decir, cada vez que en el block de notas tu pones Enter, en realidad escribes un \n.(new line)

El problema es que si la linea es de mas de 512 caracteres, entonces parara de leer hasta llegar a los 512 caracteres. Para esto se podrian usar otros metodos, como ir leyendo caracter por caracter hasta encontrar el \n y luego con un poco de creatividad y de memoria dinamica, guardarlo en un buen buffer.

strlen es una funcionde string.h que te regresa el numero de caracteres que una cadena tiene.
No es la gran cosa.

Saludos
  #13 (permalink)  
Antiguo 23/01/2007, 07:01
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: dudas code

Cita:
A que te refieres con esto?Esque tengo el problema de que al utilizar la funcion fgets, tengo que poner el numero de caracteres que quiero que lea, pero, como nose cuantos caracteres hay en cada linea del fichero, pues nose hasta donde poner que lea.. lo que quiero hacer, esque lea hasta \n como tu dices, pero nose como hacerlo...
No va la cantidad que quieres leer, va la cantidad maxima que quieres almecenar el el buffer.

Es decir, si tu buffer es de 512 caracteres (sin contar \0) y la linea tiene tres caracteres solo almecenara 3, pero si la linea es de 745 solo leera 512.

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:07.