Duda codigo C

eR_NaNo

Buenas!! tengo el siguiente codigo para analizar, el programa se encarga de recibir nombres por teclado y ordenarlos alfabeticamente, hasta aki todo mu bien, la unica duda q tengo es porque se pone la funcion antes del main(). Yo siempre (novato) las he visto definidas despues de main, y no entiendo porque va antes y xq si la pongo debajo no funciona :\ Alguien me dice a q se debe?? El codigo es el sigueinte

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

void ordenar_cadenas (char nombres[50][100], int total)
{
char temp[100];
int i, j;

for(i=0; i < total-1; i++)
{
for(j=i+1; j < total; j++)
if(strcmp(nombres, nombres[j]) > 0)
{
// Copia en variable temporal datos actuales
strcpy(temp, nombres);

	 // Intercambia informacion
	 strcpy(nombres[i], nombres[j]);
	 strcpy(nombres[j], temp);
  }

}
}

int main()
{
char nombres[50][100];
int i, total;

printf("Cuantos nombres desea introducir: ");
scanf("%d", &total);
fflush(stdin);
for(i=0; i<total; i++)
{
  printf("Nombre %d: ", i+1);
//scanf("%s", nombres[i]); con esto no necesito el fflush.
  gets(nombres[i]);
}

ordenar_cadenas(nombres, total);

printf("\nLos nombres ordenados quedan:\n\n");
for(i=0; i<total; i++)
{
  printf("Nombre %d: %s\n", i+1, nombres[i]);
}
return 0;

system("pause");
}

Thx!!!

Weno ya consegui ponerlo delante y q me funcione, xo sigo sin comprender el orden en q lo puse, alguien me puede explicar porq?

cabron

En C no puedes usar nada que no haya sido declarado antes.

Si usas una función en main, tienes que declararla antes de main, y luego la puedes definir donde quieras.

Si la defines antes de main, entonces no hace falta declararla, ya que la definición lleva implícita la declaración.

Josepanaero

Creo se debe a q si las pones después, cuando vaya por el main y se encuentre la llamada a la función, como no ha aparecido antes definida en ningún sitio (recordemos que está después del main), no sabe a qué se refiere.

Es posible que me equivoque en la explicación que te he dado, te lo he dicho intuitivamente, es decir, yo imagino q pueden andar por ahí los tiros. De todas formas, a ver si alguien más experto nos saca de dudas.

De todas formas, lo q sí sé seguro es q hay una forma de evitar esto (al menos en C++), y consiste en declarar la función antes del main, de la siguiente forma:

..........

int funcion(char argumento1, double argumento2);

.......

int main(){

........

}

.......

int funcion(char argumento1, double argumento2){
// Contenido de la función
}

eR_NaNo

#2 Gracias, yo tenia metido en la cabeza, q primero la definias, en main la llamabas, y debajo de main detallabas su funcion. No sabia que asi se podia hacer.

#3 asi es como lo solucione, esa es la estructura q me han enseñado, x eso no veia esta "nueva" forma.

cabron

#4:

Es muy importante que aprendas a diferenciar entre declaración y definición.

Una declaración dice "esto existe", pero no crea nada nuevo, solo dice que existe en algún lado.

Por el contrario una definición si que lo crea.

Una función, variable o constante, puede ser declarada varias veces, pero solo puede ser definida una vez.

El compilador no te deja usar nada que no haya sido declarado, pero, si te deja usar algo que ha sido declarado, pero no definido, eso sí, luego la definición tiene que estar en algún lado, puede ser más abajo, o incluso en otro fichero diferente, el compilador ya se encarga de encontrarlo.

Y como te dije en el otro post, la definición, implica declaración, así que si defines algo antes de usarlo, no hace falta que además lo declares, ya que la propia definición vale como declaración.

eR_NaNo

#5 Gracias x la info tio, soy bastante amateur en el tema, y x lo tanto muy cuadriculado xq para esto tiendes a seguir las pautas q t han enseñado, y en cuanto t cambian una cosa parece un tanto extraña. Jodidos profesores xDD

Da gusto la rapidez y seriedad del foro ;)

MTX_Anubis

#6 hombre, lo que te ha dicho cabron te lo deberían de haber dicho los profesores xD

SeiYa

#5 seguro que una variable la puedes declarar varias veces ? porque si yo hago int X; y más tarde lo repito ya sabes lo que pasa :P

Fr4nk0

Una variable no puede declararse dos veces, a no ser que sea en ambitos distintos, es decir, int x; variable global y luego int x; variable local dentro de una función. Lo normal en c, es declarar las funciones que vas a usar antes del main ( es decir, solo el prototipo) y luego tras el main definirlas, aunque como bien han dicho antes, si la defines antes directamente, no hace falta la declaración.

eR_NaNo

Gracias x las multiples aclaraciones ;)!!

cabron

#8 y #9

Una variable se puede declarar más de una vez.

Como ya dije antes, una declaración, solo dice que algo existe, no lo crea.

Ejemplo de una variable declarada varias veces.

miArchivo1.c

int variableGlobal;

miArchivo2.c

extern int variableGlobal;

miArchivo3.c

extern int variableGlobal;

En los 3 casos se trata de la misma variable, que es declarada varias veces, pero solo definida una vez.

#8:

"seguro que una variable la puedes declarar varias veces ? porque si yo hago int X; y más tarde lo repito ya sabes lo que pasa "

Si tu haces "int x;" y luego vuelves a poner "int x;", no esas declarando una variable dos veces, estás definiendo una variable dos veces, y por eso te da error.

Lo que dije en mi post es totalmente correcto, una variable puede ser declarada varias veces, pero solo se puede definir una vez.

Y mira que puese bien claro en el post #5: la diferencia entre declarar y definir xD

JuAn4k4

Como mucho te dara warning no ? Porque todo lo que no esta definido antes lo define C como int.

Te dara un warninng de que la funcion ordenar_cadenas se declaro como que devolvia entero. Ya que al compilar la define cuando la ve por primera vez que es cuando la usa el main.
Aunque tambien depende de la version del compilador que estes usando, igual no te deja hacer eso.

Usuarios habituales

  • JuAn4k4
  • cabron
  • eR_NaNo
  • Fr4nk0
  • SeiYa
  • MTX_Anubis
  • Josepanaero