programación en C

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]);
}
 
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
 
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
 
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....:cry:
 
Última edición:
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...
 
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!
 
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...
 
Me encontre este ejemplo:

PHP:
#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
 
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.....:rolleyes: en eso ando...
 

Adjuntos

  • 000000.txt
    30.5 KB · Visitas: 6
...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.
 
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 :eek:

Edito:
ACá te pego el código para que lo veas...
Código:
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
    }
}
 
Última edición:
muuuchas gracias chicos por sus aportes!!! ;)
todos se tuvieron en cuenta!
pero me alegra decirles que ya lo resolvi!!:):D

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

Código:
/* 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 ;)
 
Última edición:
:cry:
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....:cry:
 
...
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.

Código:
/* 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;
}
 
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.....:rolleyes: colgueti!!:D

ahora estoy ensamblando un poco con ésto que me decis! ;)
 
Atrás
Arriba