# programación en C



## Bochi (Jul 12, 2007)

Hola a todo el foro. Necesito ayuda con respecto a un problema q tengo en un pequeño programa de C en el cual aparece un error _illegal use of floating point in function main_ y ya he buscado por internet pero no puedo solucionarlo. El programa se basa en cargar una matriz por punteros, pasar la matriz a un vector, ordenar el vector, pasar el vector ordenado a la matriz e imprimirla.
Desde ya muchas gracias.
El programa es el siguiente:


#include<stdio.h>
#include<conio.h>

void main (void)
{	int i,j,k,l,m;
	float a[3][3][2],b[18],t;
	l=0;
	for(i=0;i<3;++i)
		for(j=0;j<3;++j)
			for(k=0;k<2;++k)
				{	printf(" \n a[%d][%d][%d]: ",i,j,k);
					scanf("%f",(a+l));
					b[l]= *(a+l);  // aca es donde aparece el error
					++l;
				}
	do
	{	m=0;
		for(i=0;i<l-1;++i)
			if(b_<b[i+1])
			{	t=*(b+i);
				*(b+i)=*(b+i+1);
				*(b+i+1)=t;
				m=1;
			}
	}	while(m!=0);
	m=0;
	for(i=0;i<3;++i)
		for(j=0;j<3;++j)
			for(k=0;k<2;++k)
			{	a[j][k]=*(b+m);
				++m;
			}
	for(i=0;i<3;++i)
		for(j=0,k=0;j<3;++j)
			printf("%f",a[j][k]);
}_


----------



## gabyfree (Jul 12, 2007)

no sera un problemas de librerias ????, decime si el error es en tiempo de ejecucion en tiempo de compilacion responde al Mejor leo las Normas de Participación@forosdeelectronica.com a Gabriel


----------



## vally (Jul 13, 2007)

Hace muchos años que no uso el C pero creo que el error puede estar aquí:
scanf("%f",&(a+l)); 

es decir, prueba a poner un "&" para indicar la dirección de memoria de (a+l)

Salu2


----------



## Ardogan (Jul 22, 2007)

Van algunos comentarios respecto al código que escribiste:

for(i=0;i<3;++i) 
for(j=0;j<3;++j) 
for(k=0;k<2;++k) 

en estos for yo por las dudas pondria i++, j++ y k++ en vez de ++i, ++j y ++k. Creo que puede llegar a haber lío porque la diferencia entre i++ y ++i es que con i++ primero se toma el valor de la variable i, y después se la incremente; mientras que con ++i primero se incremente el valor de i y después se toma el valor (ya incrementado).

Pero sí, el quilombo está acá:
scanf("%f",(a+l)); 

porque definiste a como una matriz y l como un entero.
Estás sumando peras con manzanas. Por ahí el compilador lo toma, pero no es lo más recomendable, yo utilizaría en lugar de (a+l) lo siguiente:
&a_[j][k]
Entiendo que lo querés hacer es cargar los valores de la matriz, y a la vez ir cargando el vector.

En donde está:

b[l]= *(a+l);

yo utilizaría:

b[i+j+k]= a[j][k];

Y hasta te olvidás de usar la variable l; y la sentencia l++.

Las instrucciones que siguen no las ví, ojalá te sirva.
Saludos_


----------



## Meliklos (Sep 8, 2010)

el problema es que "b" no esta declarado o inicializado en ningun lado!!
que es b???cuanto vale???

que tipo de variable es?? no lo dice en ningun lado...

aprovecho que estamos en el tema de "Programación en C" y acudo a la inteligencia y conocimientos de ustedes compañeros mios, para saber si de los que saben usar C
tienen idea de como copiar unas lineas de un archivo y pegarlas en otro creado...


 tengo confusion....


----------



## Chico3001 (Sep 8, 2010)

Seleccionas el texto a copiar y presionas simultaneamente CTRL y C
Despues te mueves al archivo donde lo quieres pegar y presionas simultaneamente CTRL y V

simple...


----------



## Meliklos (Sep 8, 2010)

no pancho jejeje....
estoy haciendo un programa que haga lo siguiente:
tengo 64 archivos de capturas de un instrumento, y en cada archivo hay como 210 lineas con mediciones de parámetros... de esas 210, yo solo quiero 3 lineas...

la idea es copiar esas tres lineas de cada uno de los 64 archivos y pegarlos en un archivo nuevo creado, se supone que recibo las 64 capturas y ésto lo hace automático...

this is the cuestions!


----------



## Chico3001 (Sep 8, 2010)

Ah... ps lo que tienes que hacer es usar fopen(), fclose(), fputs() y fread()


----------



## Meliklos (Sep 8, 2010)

mmm...hasta ahora tengo hecho el menu y los bloques de las funciones...jeje esta preparadito para poner los comandos jejeje

bueno, tengo la parte de crear el archivo (fopen, fclose)
y lo de fread se como hacerlo...bueno, maso...porque, como elijo la linea especifica que quiero copiar???
porque supone que de las 210 lineas quiero copiar (por decir algo...) la 24, 69 y 136...???

y creo que el fputs funciona con un getc() que seria algo como un scanf, pero no voy a necesitar escribir nada...


----------



## Chico3001 (Sep 8, 2010)

Me encontre este ejemplo:


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

int main()
{
    FILE *nombre;
    int c;

    nombre = fopen("Prueba.htm", "r");

    if (nombre == NULL)
    {
        printf("El archivo no existe \n");
        exit (EXIT_FAILURE);
    }
    else
    {
        do
        {
            c = getc(nombre); /* Obtiene un caracter del archivo */
            putchar(c); /* Lo despliega en pantalla y continua... */
        }
        while (c != EOF); /* hasta encontrar EOF (el final del archivo)*/
    }
    fclose(nombre);

    return EXIT_SUCCESS;
}
```

http://www.modelo.edu.mx/univ/virtech/prograc/clecesc.htm


----------



## Meliklos (Sep 8, 2010)

igualito, igualito!!! pero como me tomada 1 caracter nada mas.....


 y el link me vino al pelo! 

por si te interesa un poquin, una de las 64 capturas es ésta, para el valor 000000...
la primera columna son frecuencias que van de 1GHz hasta 1,6GHz

y yo quiero la linea de 1.2GHz, 1.3GHz y 1.4GHz (o las mas proximas)...
 y copiarlas a otro archivo que tambien lo crea el programa y armar tipo columnas para cada frecuencia segun los diferentes valores de bits...

ufff..... en eso ando...


----------



## Eduardo (Sep 8, 2010)

Meliklos dijo:


> ...bueno, tengo la parte de crear el archivo (fopen, fclose)
> y lo de fread se como hacerlo...bueno, maso...porque,* como elijo la linea especifica que quiero copiar*???
> porque supone que de las 210 lineas quiero copiar (por decir algo...) la 24, 69 y 136...???


Necesitás conocer el formato del archivo. 
Si las líneas son de longitud fija NL , te posicionás con fseek(streamptr,NL*Linea,SEEK_SET).
Pero si es un archivo de texto común, la única forma es ir leyendo desde el principio contando caracteres de fin de línea, que también pueden  variar según el formato.


----------



## Dr. Zoidberg (Sep 8, 2010)

Meliklos dijo:


> estoy haciendo un programa que haga lo siguiente:
> tengo 64 archivos de capturas de un instrumento, y en cada archivo hay como 210 lineas con mediciones de parámetros... de esas 210, yo solo quiero 3 lineas...
> la idea es copiar esas tres lineas de cada uno de los 64 archivos y pegarlos en un archivo nuevo creado, se supone que recibo las 64 capturas y ésto lo hace automático...



Lo que necesitas hacer es muuuuyyyyy simple hacerlo con *AWK*. 
Acá tenes algo para leer: http://es.wikipedia.org/wiki/AWK
Este lenguaje tiene la misma sintaxis del C, es interpretado, lo podés bajar para Windows (es GNU) y está específicamente preparado para hacer lo que necesitas.
Yo usualmente proceso unos 60 archivos de log de servidores de impresión, poniendo y sacando campos, y tengo que generar otro archivo delimitado por comas para que lo importen en EXCEL...creo que son 25 líneas de AWK 

Edito:
ACá te pego el código para que lo veas...

```
BEGIN {
    FS=","
}
{
# Salteamos los dos primeros registros por que tienen basura
if( NR > 2) {
    # Estos campos hay que enderezarlos por que estan luego del titulo
    # que puede tener comas adentro
    isduplex = 12
    filesize = 14
    pchost = 7
    # Buscamos solo el titulo que esta entre comillas
    comilla = index( $0, "\"" )
    restolinea = substr( $0, comilla + 1 )
    comilla = index(restolinea, "\"")
    titulodoc = substr( restolinea, 1, comilla - 1 )
    # Ahora contamos cuantas comas tiene adentro
    tmp = titulodoc
    ncomas = 0
    poscoma = index( tmp, "," )
    while( poscoma != 0 ) {
        ncomas++
        tmp = substr( tmp, poscoma + 1 )
        poscoma = index( tmp, "," )
        }
    # Y corregimos la posicion de los campos
    isduplex += ncomas
    filesize += ncomas
    pchost += ncomas
    # Le quitamos el nombre de dominio a las PC que lo tengan
    nomhost = $pchost
    ppunto = index( $pchost, "." )
    if( ppunto != 0 ) {
        nomhost = substr( $pchost, 1, ppunto - 1 )
        }
    hoja="2"
    if( $isduplex == "NOT DUPLEX" ) {
        hoja = "1"
        }
    tamanio = substr( $filesize, 1, length($filesize) - 2 )
    print $1 "," toupper( nomhost ) "," $3 "," $4 ",\"" titulodoc "\"," hoja "," tamanio
    }
}
```


----------



## Meliklos (Sep 14, 2010)

muuuchas gracias chicos por sus aportes!!! 
todos se tuvieron en cuenta!
pero me alegra decirles que ya lo resolvi!!

y en c no mas...asi que si a alguien le interesa subo esa parte del código...aun me queda por hacer!! 


```
/* Recopila los datos de cada par*metro para determinadas frecuencias
preseteadas y guarda los valores, seg£n la frecuencia
en un archivo direfente.
*/

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

void
void main(void)
{
    char cadena[2014];
    FILE *f=fopen("c:\\tc\\fase\\000000.s2p","r");
    FILE *tabla1=fopen("c:\\tc\\tabla1.txt","w");
    FILE *tabla2=fopen("c:\\tc\\tabla2.txt","w");
    FILE *tabla3=fopen("c:\\tc\\tabla3.txt","w");
    unsigned long frec;
    clrscr();
    if(f==NULL){
        perror("El archivo no existe\n");
        return;
    }
    while(!feof(f)){
        fgets(cadena, 3000,f);
        sscanf(cadena,"%lu",&frec);
        if(frec==1201000000)fputs(cadena,tabla1);
        if(frec==1300000000)fputs(cadena,tabla2);
        if(frec==1399000000)fputs(cadena,tabla3);
    }
    /*while(fgets(cadena,2014,f)!=NULL){
        if(){
            fputs(cadena,tabla);
        }
    }*/
    fclose(f);
    fclose(tabla1);
    fclose(tabla2);
    fclose(tabla3);
}
```

éste código tiene que ver con uno de los archivos que subi en el post #11, tengo muchas lineas que cada una representa valores de parametros en cierta frecuencia (la frecuencia es la primera columna) y elijo las que quiero y las guardo en archivos diferentes, segun la frecuencia! 

saludos!!! y gracias


----------



## Meliklos (Sep 16, 2010)

nuevamente con dificultades y no encuentor la solución....

ezevalla me tiro una ayuda con awk, pero lo necesito en c y me cuesta relacionar los códigos...

todavia no logro conseguir la parte que me permita ir abriendo archivo por archivo y copiar lo que necesito....la parte de abrir es el problema....

se me ocurre hacer un bucle...

int i;
..
for(i=0;i<64;i++){
       f=fopen("c:\\"i".txt","r");  

o: f=fopen("c:\\%d.txt",i);

pero no puedo escribirlo asi...tendria que ser parecido...pero he probado muchisimas formas (ovbiamente leyendo las librerias, otros comandos,etc...) pero no sale....


----------



## Eduardo (Sep 16, 2010)

Meliklos dijo:


> ...
> todavia no logro conseguir la parte que me permita ir abriendo archivo por archivo y copiar lo que necesito....la parte de abrir es el problema....


Los nombres de los archivos los vas leyendo con findfirst y findnext. 
findfirst acepta búsquedas con caracteres * y ? 

Este es un ejemplo de un Help.


```
/* findfirst and findnext example */

#include <stdio.h>
#include <dir.h>

int main(void)
{
   struct ffblk ffblk;
   int done;
   printf("Directory listing of *.*\n");
   done = findfirst("*.*",&ffblk,0);
   while (!done) 
   {
      printf("  %s\n", ffblk.ff_name);
      done = findnext(&ffblk);
   }

   return 0;
}
```


----------



## Meliklos (Sep 16, 2010)

justamente ese mismo ejemplo habia probado y lo descarte porque crei que no podias especificar el directorio...solo me mostraba los archivos que estaban donde ejecuto el programa, pero me di cuenta que se podia especificar..... colgueti!!

ahora estoy ensamblando un poco con ésto que me decis!


----------



## Eduardo (Sep 16, 2010)

Respecto a esto:



Meliklos dijo:


> se me ocurre hacer un bucle...
> 
> int i;
> ..
> ...



Para que eso funcione tiene que ser así:


```
char nombre[0x80]  ;
......
for(i=0;i<64;i++){
    sprintf(nombre,"c:\\%d.txt",i);
    f=fopen(nombre,"r");
```


----------



## Meliklos (Sep 16, 2010)

edu, sigo los pasos al pie de la letra, pero lo loco es que solo me copia las lineas del archivo nº 3....ni registra los otros...


----------



## Eduardo (Sep 16, 2010)

Meliklos dijo:


> edu, sigo los pasos al pie de la letra, pero lo loco es que solo me copia las lineas del archivo nº 3....ni registra los otros...


 Podes mostrar el código y un listado del directorio ?


----------



## Meliklos (Sep 16, 2010)

los archivos estan guardados en la carpeta fase1, son 5 archivos que se llaman: 1,2,3,4 y 5...
bien simple para evitar errores...pero no funca...


```
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>

void cargardatos(FILE *f,FILE *tabla1,FILE *tabla2,FILE *tabla3);
void main(void)
{
    FILE *f;
    FILE *tabla1;
    FILE *tabla2;
    FILE *tabla3;
    clrscr();
    cargardatos(f,tabla1,tabla2,tabla3);
}

void cargardatos(FILE *f,FILE *tabla1,FILE *tabla2,FILE *tabla3)
{
    char cadena[2014];
    char nombre[0x80];
    int done,i;
    unsigned long frec;
    for(i=1;i<=5;i++){
        sprintf(nombre,"c:\\tc\\fase1\\%d.s2p",i);
        f=fopen(nombre,"r");
        if(f==NULL){
            printf("El archivo no existe.\n");
            return;
        }
        else{
            tabla1=fopen("c:\\tc\\tabla1.txt","w");
            tabla2=fopen("c:\\tc\\tabla2.txt","w");
            tabla3=fopen("c:\\tc\\tabla3.txt","w");
            while(!feof(f)){
                fgets(cadena, 3000,f);
                sscanf(cadena,"%lu",&frec);
                if(frec==1201000000)fputs(cadena,tabla1);
                if(frec==1300000000)fputs(cadena,tabla2);
                if(frec==1399000000)fputs(cadena,tabla3);
            }
        }
    }
    fclose(f);
    fclose(tabla1);
    fclose(tabla2);
    fclose(tabla3);
    return;
}
```

solo me genera el nuevo archivo "tabla" pero con las lineas que le pido del archivo 3...nada mas..

el formato de los archivos es .s2p


----------



## Eduardo (Sep 16, 2010)

```
tabla1=fopen("c:\\tc\\tabla1.txt","w");
            tabla2=fopen("c:\\tc\\tabla2.txt","w");
            tabla3=fopen("c:\\tc\\tabla3.txt","w");
```
Esto tenes que hacerlo una sola vez, así estás perdiendo lo que habias escrito.


----------



## Meliklos (Sep 17, 2010)

es que estoy creando tres archivos tablas distintos, uno para cada frecuencia


----------



## Eduardo (Sep 17, 2010)

No me refiero a eso.

Ahí leés el 1.s2p y escribís lo que corresponde en cada tabla. 
Pero cuando vas a leer el 2.s2p *abrís de nuevo* tablax --> perdés lo que habías escrito de 1.s2p.


----------



## Meliklos (Sep 17, 2010)

crei que ya quedaba guardado... osea que el bucle lo hago despues de abrir las tablas...ahhhh.....ahora te entiendo !!
gracias edu!!

SIIII!! FUNCIONO A LA PERFECCIÓN!!!!!!!!




????? WTF????
le cambie el for: iniciado en 0 y hasta 63 y se corta en el archivo 10!! como si los otros no existieran...
la tabla la hace hasta el archivo 9 y despues me muestra que el archivo no existe!!
esta re loco....verifique que esten todos los numeros de archivos...
porque sera???
sera por:  char nombre[0x80]; ????


----------



## Eduardo (Sep 17, 2010)

char nombre[0x80] es una cantidad de caracteres exagerada (128) por si uno usara nmbres muy largos. 
No afecta para nada porque cuando hacés sprintf(nombre,"c:\\tc\\fase1\\%d.s2p\n",i)  le agrega un cero marcando el final del string.


Fijate que los nombres de los archivos no tengan ningún caracter extra y es el explorador de archivos que no los muestra.

PD. Yo uso el Salamander, no tolero el explorador de Windows.


----------



## Meliklos (Sep 17, 2010)

verifique todo y cambie un par de cosas y lo volvi a poner como estaba y nada...




y los nombres de los archivos estan claritos!


----------



## Eduardo (Sep 17, 2010)

Y las extensiones?


----------



## Meliklos (Sep 17, 2010)

son todas las mismas....


----------



## Eduardo (Sep 17, 2010)

Poné un archivo zipeado del código y los archivos de muestra asi lo puedo ejecutar paso a paso.


----------



## Meliklos (Sep 17, 2010)

ok! ahi van... te mando los 64 archivos de datos y el programa en .txt...

obvia todo lo que esta entre /* ... */ al final del programa...que eso todavia no está trabajado...


----------



## Eduardo (Sep 17, 2010)

Era porque abrias y abrías f para lectura y nunca lo cerrabas (salvo al final)

Cerrandolo en cada iteración funciona de 10.


```
void cargardatos(FILE *f,FILE *tabla1,FILE *tabla2,FILE *tabla3)
{
    char cadena[1000];
    char nombre[0x80];
    int i;
    unsigned long frec;
    tabla1=fopen("c:\\tc\\tabla1.txt","w");
    tabla2=fopen("c:\\tc\\tabla2.txt","w");
    tabla3=fopen("c:\\tc\\tabla3.txt","w");
    for(i=0;i<64;i++){
        sprintf(nombre,"c:\\tc\\fase1\\%d.s2p",i);
        f=fopen(nombre,"r");
        if(f==NULL){
            printf("El archivo no existe.\n");
            return;
        }
        else{
            while(!feof(f)){
                fgets(cadena, 1000,f);
                sscanf(cadena,"%lu",&frec);
                if(frec==1201000000)fputs(cadena,tabla1);
                if(frec==1300000000)fputs(cadena,tabla2);
                if(frec==1399000000)fputs(cadena,tabla3);
            }
        }
        fclose(f);
    }
    fclose(tabla1);
    fclose(tabla2);
    fclose(tabla3);
    return;
}
```


----------



## Meliklos (Sep 17, 2010)

(emocion...)
gracias edu...no sabes como me alegraste lo que queda de la mañana !!


----------



## Meliklos (Sep 23, 2010)

bueno, no quiero ser reeee pesada, pero surgio un pequeñisimo asustillo....

intento (digo intento porque estoy buscando, probando, errando y todo eso...) crear una tabla o planilla, con los valores que obtuve de mis 3 documentos, es decir, unir los datos de los tres documentos (tabla1, tabla2 y tabla3) en una sola tabla "suprema"...

no me refiero a copy.paste...sino desde el mismo programa, que una vez creadas las tablas individuales, cree una que una los datos...o directamente hacerla desde el principio, sin el paso intermedio de crear a las tres tablas....

creo que estoy mareando no??
pero de ser asi (como lo ultimo) se reeee complicaria...


----------



## Dr. Zoidberg (Sep 23, 2010)

Y por qué no usás el programa que ya tenés y hacés otro que arme la tabla a partir de los archivos que genera el primer programa?
Luego los pegás con un pequeño "script del shell" del DOS...(si es que puede llamarse así)

No entiendo para que querés unirlo en uno solo...nunca escuchaste el "lema de UNIX": *Small Is Beautiful*...?


----------



## Meliklos (Sep 23, 2010)

veo que me enrede en mis palabras...
ezevalla lo que decis es lo que pretendo hacer...quiero algo como la imagen que esta abajo!


la tabla esta cortada pero la idea está


----------



## Meliklos (Sep 28, 2010)

edito: el ultimo mensaje obienlo, ya logre mi objetivo


----------



## Meliklos (Nov 1, 2010)

ya se que soy reeee pesada con las dudas de prog. en c...pero

como tengo que guardar un programa para poder ejecutarlo con el ejecutable (valga la rebundancia jeje)

porque hice un programa y cuando lo guardo y despues abro el ejecutable, solo me tira un cartel que dice:...
"Programa funcionando"
"Programa funcionando"
"Programa funcionando"
"Programa funcionando"
...
... y asi....


----------



## Meliklos (Abr 8, 2011)

Que tal compañeros y amigos...
seguimos incursionando en C y ahora con comunicación en paralelo y vía LAN...


----------



## Unikfriend (Abr 8, 2011)

Hi, 
en que proyecto estas trabajando amiga?


----------



## Meliklos (Abr 12, 2011)

hola unik! 
digamos que volvi a C y voy a adaptar lo hehco con la parte nueva..
la cosa ahora se pone mas dificl!
me tengo que comunicar con el instrumento que hace las mediciones y generar un archivo para cada medición...son 63!! despues las traigo a la compu y ahi saco lo que quiero de esas mediciones...

pero tendre que leer como darle ordenes al instrumento y si me deja que lo haga!! es medio mañoso...jejeje


----------



## Unikfriend (Abr 12, 2011)

Estoy segura que lo conseguirás!
Y en lo que te pueda ayudar, cuenta conmigo!


----------



## cosmefulanito04 (Abr 12, 2011)

Meliklos dijo:


> Que tal compañeros y amigos...
> seguimos incursionando en C y ahora con comunicación en paralelo y vía LAN...



¿Puerto paralelo para que necesitas usarlo? ¿no podes usar el serie?. 

Sobre LAN, ¿estas usando linux? las herramientas que tenes en ese SO son muy utiles.


----------

