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

Devuelve valor extraño

Estas en el tema de Devuelve valor extraño en el foro de C/C++ en Foros del Web. Tengo un programa hecho en C por un antiguo trabajador de mi empresa (y que ya no esta) que utilizo desde php para redimensionar imagenes. ...
  #1 (permalink)  
Antiguo 05/05/2006, 04:11
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
Devuelve valor extraño

Tengo un programa hecho en C por un antiguo trabajador de mi empresa (y que ya no esta) que utilizo desde php para redimensionar imagenes. Se llama "imager"

Cuando llamo a ejecutar este archivo (con la funcion system de php), no me devuelve 0 si se ha ejecutado correctamente, ni siquiera 127 si ha dado un error, me devuelve 105. Mirando el codigo no veo en ningun sitio que devuelva ese numero... me podeis ayudar a saber porque me devuelve ese numero?

PD: aunque devuelva 105, el programa se ejecuta bien.

Lo llamo de esta manera:

Código PHP:

$comando 
sprintf("imager %sx %sg -w %d"$tmp_name$tmp_name$ancho);
@
system($comando$exitval); 
Muchas Gracias!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.

Última edición por oskarL; 18/05/2006 a las 08:21
  #2 (permalink)  
Antiguo 05/05/2006, 04:39
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
sabes que valor retorna la funcion main en caso de exito?
no pude encontrar el return 0; de main, y estas tiene un valor int de retorno.
  #3 (permalink)  
Antiguo 05/05/2006, 04:43
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
Decirte que de C no se demasiado, o por lo menos se me ha olvidado, jeje.

Pues parece que tienes razon, parece que no retorna ningun valor, excepto en un caso, dentro de un if, que devuelve un 1. Supongo que este caso es por si da error.

Voy a probar a poner un return 0 al final, y a recompilar, a ver que tal
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #4 (permalink)  
Antiguo 10/05/2006, 07:32
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
Bueno, pues le he puesto un return 0; justo al final del main y he recompilado, pero nada, me sigue devolviendo valores extraños es pa flipar la verdad.

Lo que tambien he hecho es utilizar el programa varias veces en una sola ejecucion, y he descubierto que no es que me devuelva solo 105, me devuelve valores de lo mas variado... 105, 144, 248, 208, 96... lo cierto es que no se donde pueden salir esos valores. El codigo es el puesto en el primer post

Alguien me puede ayudar con esto? gracias
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.

Última edición por oskarL; 10/05/2006 a las 08:39
  #5 (permalink)  
Antiguo 10/05/2006, 10:24
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
El codigo no esta completo ya que falta el encabezado gd.h, si lo pegas, tratare de probar el programa, esperando poder ayudarte.

Espero tu codigo, Saludos.
  #6 (permalink)  
Antiguo 11/05/2006, 01:39
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
El encabezado de gd.h? No se encontrar encabezado como tal... si eso te pego la primera parte del fichero (hasta donde me deje), porque es largo...

Código:
#ifdef __cplusplus
extern "C" {
#endif

#ifndef GD_H
#define GD_H 1

/* Do the DLL dance: dllexport when building the DLL,
	dllimport when importing from it, nothing when
	not on Silly Silly Windows (tm Aardman Productions). */

/* 2.0.20: for headers */

/* 2.0.24: __stdcall also needed for Visual BASIC 
	and other languages. This breaks ABI compatibility
	with previous DLL revs, but it's necessary. */

/* 2.0.29: WIN32 programmers can declare the NONDLL macro if they
	wish to build gd as a static library or by directly including
	the gd sources in a project. */

#ifndef WIN32
#define NONDLL 1
#endif /* WIN32 */

#ifdef NONDLL
#define BGD_DECLARE(rt) extern rt
#else
#ifdef BGDWIN32
#define BGD_DECLARE(rt) __declspec(dllexport) rt __stdcall
#else
#define BGD_DECLARE(rt) __declspec(dllimport) rt _stdcall
#endif /* BGDWIN32 */
#endif /* NONDLL */

/* 2.0.20: for actual storage of exported data, functions don't need this,
  currently needed only for font pointers */
#ifdef NONDLL
/* 2.0.25: bring back extern */
#define BGD_EXPORT_DATA_PROT extern
#define BGD_EXPORT_DATA_IMPL
#else
#ifdef BGDWIN32
#define BGD_EXPORT_DATA_PROT __declspec(dllexport) extern
#define BGD_EXPORT_DATA_IMPL __declspec(dllexport)
#else
#define BGD_EXPORT_DATA_PROT __declspec(dllimport) extern
#define BGD_EXPORT_DATA_IMPL __declspec(dllimport) 
#endif /* BGDWIN32 */
#endif /* NONDLL */

#ifdef __cplusplus
extern "C"
{
#endif

/* some might want to set DEFAULT_FONTPATH from configure in config.h */

/* 2.0.23: more Type 1 fonts */
#ifndef DEFAULT_FONTPATH
/* default fontpath for unix systems  - whatever happened to standards ! */
#define DEFAULT_FONTPATH "/usr/X11R6/lib/X11/fonts/TrueType:/usr/X11R6/lib/X11/fonts/truetype:/usr/X11R6/lib/X11/fonts/TTF:/usr/share/fonts/TrueType:/usr/share/fonts/truetype:/usr/openwin/lib/X11/fonts/TrueType:/usr/X11R6/lib/X11/fonts/Type1:/usr/lib/X11/fonts/Type1:/usr/openwin/lib/X11/fonts/Type1"
#endif
#ifndef PATHSEPARATOR
#define PATHSEPARATOR ":"
#endif

/* gd.h: declarations file for the graphic-draw module.
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation.  This software is provided "AS IS." Thomas Boutell and
 * Boutell.Com, Inc. disclaim all warranties, either express or implied, 
 * including but not limited to implied warranties of merchantability and 
 * fitness for a particular purpose, with respect to this code and accompanying
 * documentation. */

/* stdio is needed for file I/O. */
#include <stdio.h>
#include "gd_io.h"

/* The maximum number of palette entries in palette-based images.
	In the wonderful new world of gd 2.0, you can of course have
	many more colors when using truecolor mode. */

#define gdMaxColors 256

/* Image type. See functions below; you will not need to change
	the elements directly. Use the provided macros to
	access sx, sy, the color table, and colorsTotal for 
	read-only purposes. */

/* If 'truecolor' is set true, the image is truecolor; 
	pixels are represented by integers, which
	must be 32 bits wide or more. 

	True colors are repsented as follows:

	ARGB

	Where 'A' (alpha channel) occupies only the
	LOWER 7 BITS of the MSB. This very small 
	loss of alpha channel resolution allows gd 2.x
	to keep backwards compatibility by allowing
	signed integers to be used to represent colors,
	and negative numbers to represent special cases,
	just as in gd 1.x. */

#define gdAlphaMax 127
#define gdAlphaOpaque 0
#define gdAlphaTransparent 127
#define gdRedMax 255
#define gdGreenMax 255
#define gdBlueMax 255
#define gdTrueColorGetAlpha(c) (((c) & 0x7F000000) >> 24)
#define gdTrueColorGetRed(c) (((c) & 0xFF0000) >> 16)
#define gdTrueColorGetGreen(c) (((c) & 0x00FF00) >> 8)
#define gdTrueColorGetBlue(c) ((c) & 0x0000FF)

/* This function accepts truecolor pixel values only. The 
	source color is composited with the destination color
	based on the alpha channel value of the source color.
	The resulting color is opaque. */

   BGD_DECLARE(int) gdAlphaBlend (int dest, int src);

  typedef struct gdImageStruct
  {
    /* Palette-based image pixels */
    unsigned char **pixels;
    int sx;
    int sy;
    /* These are valid in palette images only. See also
       'alpha', which appears later in the structure to
       preserve binary backwards compatibility */
    int colorsTotal;
    int red[gdMaxColors];
    int green[gdMaxColors];
    int blue[gdMaxColors];
    int open[gdMaxColors];
    /* For backwards compatibility, this is set to the
       first palette entry with 100% transparency,
       and is also set and reset by the 
       gdImageColorTransparent function. Newer
       applications can allocate palette entries
       with any desired level of transparency; however,
       bear in mind that many viewers, notably
       many web browsers, fail to implement
       full alpha channel for PNG and provide
       support for full opacity or transparency only. */
    int transparent;
    int *polyInts;
    int polyAllocated;
    struct gdImageStruct *brush;
    struct gdImageStruct *tile;
    int brushColorMap[gdMaxColors];
    int tileColorMap[gdMaxColors];
    int styleLength;
    int stylePos;
    int *style;
    int interlace;
    /* New in 2.0: thickness of line. Initialized to 1. */
    int thick;
    /* New in 2.0: alpha channel for palettes. Note that only
       Macintosh Internet Explorer and (possibly) Netscape 6
       really support multiple levels of transparency in
       palettes, to my knowledge, as of 2/15/01. Most
       common browsers will display 100% opaque and
       100% transparent correctly, and do something 
       unpredictable and/or undesirable for levels
       in between. TBB */
    int alpha[gdMaxColors];
    /* Truecolor flag and pixels. New 2.0 fields appear here at the
       end to minimize breakage of existing object code. */
    int trueColor;
    int **tpixels;
    /* Should alpha channel be copied, or applied, each time a
       pixel is drawn? This applies to truecolor images only.
       No attempt is made to alpha-blend in palette images,
       even if semitransparent palette entries exist. 
       To do that, build your image as a truecolor image,
       then quantize down to 8 bits. */
    int alphaBlendingFlag;
    /* Should the alpha channel of the image be saved? This affects
       PNG at the moment; other future formats may also
       have that capability. JPEG doesn't. */
    int saveAlphaFlag;

    /* There should NEVER BE ACCESSOR MACROS FOR ITEMS BELOW HERE, so this
       part of the structure can be safely changed in new releases. */

    /* 2.0.12: anti-aliased globals. 2.0.26: just a few vestiges after
      switching to the fast, memory-cheap implementation from PHP-gd. */
    int AA;
    int AA_color;
    int AA_dont_blend;

    /* 2.0.12: simple clipping rectangle. These values
      must be checked for safety when set; please use
      gdImageSetClip */
    int cx1;
    int cy1;
    int cx2;
    int cy2;
  }
  gdImage;

  typedef gdImage *gdImagePtr;

  typedef struct
  {
    /* # of characters in font */
    int nchars;
    /* First character is numbered... (usually 32 = space) */
    int offset;
    /* Character width and height */
    int w;
    int h;
    /* Font data; array of characters, one row after another.
       Easily included in code, also easily loaded from
       data files. */
    char *data;
  }
  gdFont;

/* Text functions take these. */
  typedef gdFont *gdFontPtr;

/* For backwards compatibility only. Use gdImageSetStyle()
	for MUCH more flexible line drawing. Also see
	gdImageSetBrush(). */
#define gdDashSize 4

/* Special colors. */

#define gdStyled (-2)
#define gdBrushed (-3)
#define gdStyledBrushed (-4)
#define gdTiled (-5)

/* NOT the same as the transparent color index.
	This is used in line styles only. */
#define gdTransparent (-6)

#define gdAntiAliased (-7)

/* Functions to manipulate images. */

/* Creates a palette-based image (up to 256 colors). */
BGD_DECLARE(gdImagePtr) gdImageCreate (int sx, int sy);

/* An alternate name for the above (2.0). */
#define gdImageCreatePalette gdImageCreate

/* Creates a truecolor image (millions of colors). */
BGD_DECLARE(gdImagePtr) gdImageCreateTrueColor (int sx, int sy);

/* Creates an image from various file types. These functions
	return a palette or truecolor image based on the
	nature of the file being loaded. Truecolor PNG
	stays truecolor; palette PNG stays palette-based;
	JPEG is always truecolor. */
BGD_DECLARE(gdImagePtr) gdImageCreateFromPng (FILE * fd);
BGD_DECLARE(gdImagePtr) gdImageCreateFromPngCtx (gdIOCtxPtr in);
BGD_DECLARE(gdImagePtr) gdImageCreateFromPngPtr (int size, void *data);


..................................
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #7 (permalink)  
Antiguo 11/05/2006, 20:23
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Por fin.

Ya logre compilar y ejecutar el programa, y la verdad todo esta bien, el valor de retorno es 0,
lee un archivo grafico jpg y lo copia en otro archivo.

en su llamada se da la altura y anchura del grafico.

gd -h 800 -w 600 dibujo.jpg copia.jpg
//gd es el nombre del ejecutable.


agregar que en tu codigo falta agregar <string.h>
me refiero al primero que enviaste al main.

viendo esto no creo que el problema este en el programa C.
  #8 (permalink)  
Antiguo 12/05/2006, 01:25
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
Nivel 7, dejame hacerte unas preguntas...

- Has probado a meterle diferentes ficheros, tanto jpg como gif como png... etc? en ese caso, te sige retornando 0?

- Desde donde lo ejecutas? Como compruebas el valor de retorno?

- Has compilado el archivo que copié en el primer post? o le has añadido el return 0 al final?

y sobre todo y mas importante... explicame como lo has compilado por favor!! porque creo que yo lo hago mal.

Muchas Gracias por todo!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #9 (permalink)  
Antiguo 12/05/2006, 01:54
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Ok.

Primero...
Yo compile el fichero agregando el return 0; al codigo del primer post.

segundo yo solo lo he probado con jpg y png, he redimencionado-copiado.

Las demas te las contesto despues de aclarar que yo trabajo sobre windows.

lo he ejecutado de 2 formas.
1.- En la consola lo llamo con linea de comandos mandandole los parametros determinados.

2.- Desde el IDE de mi compilador de C++(MinGW Studio).
para esto comento (//) la llamada a la funcion lee_parametros y doy los valores predeterminados a las variables:
filein, fileout, WIDTH y HEIGHT.


Para compilar el programa , me descarge la libreria gd, descomprimi y coloque todos los ficheros .h en la carpeta include de mi compilador, la libreia gdlib, en la carpeta lib de mi compilador y la dll junto al ejecutable.

para que linke sin problemas tendras que indicarle a tu compilador que linkee tu programa con la lib estatica que colocas en la carpeta lib.

Por ultimo, el valor de retorno me lo da el IDE que uso.(MingGW Stidio).

Saludos..

No lo probe desde PHP,pues no se nada de PHP y programacion web. jeje
  #10 (permalink)  
Antiguo 12/05/2006, 03:16
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
ok, yo es que no tengo un compilador en windows, lo tengo que hacer desde un linux, accediendo remotamente. Creo que el problema lo estoy teniendo al compilar...

Muchas Gracias!!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #11 (permalink)  
Antiguo 15/05/2006, 02:07
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
Nivel 7, me podrias hacer un favor?? podrias pasarme el archivo compilado con el nombre "imager" sin extension, por favor??

Yo no consigo compilarlo debidamente...

Gracias!!
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #12 (permalink)  
Antiguo 15/05/2006, 06:45
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
No dupliquéis temas, que esto es muy parecido a lo otro.

Compílalo tú, que es lo que debes hacer... ;)

Como te dije antes, por mucho que te lo compilen si no dispones de la librería tampoco te va a funcionar.
  #13 (permalink)  
Antiguo 15/05/2006, 11:52
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
oskarL croe que ya te mencione correctamente los pasos a seguir para compilarlo:

la verdad nada complicado, solo tienes que descargarte la libreria gd, descomprimir, y distribuir los ficheros en sus respectivas carpetas si es que lo quieres usar como una libreria estandar,

es decir, los ficheros .h en la carpeta include, los .a o lib en la carpeta lib, y la libreria de enlace en tiempo de ejecucion con el ejecutable(Nose que extencion usen en UNIX oLinux).

compilar, y enlazas con la libreia .a o .lib, y listo.
no creo que tenga centido enviarte mi compilado, a menos que te refir¿eras al codigo objeto.

la verdad no se si te funcione sobre unix o linux.
  #14 (permalink)  
Antiguo 15/05/2006, 13:54
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Cita:
Iniciado por Nivel7
la verdad no se si te funcione sobre unix o linux.
Evidentemente, no le va a funcionar en GNU/Linux.

Lo único que puedes hacer para ayudarle es crear el codigo objeto en a.out, pasarle eso, y que el lo transforme a ELF.
  #15 (permalink)  
Antiguo 15/05/2006, 14:34
Avatar de oskarL  
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 499
Antigüedad: 19 años, 7 meses
Puntos: 2
En el otro tema "paralelo" explico que la libreria esta compilada y distribuida bien desde el principio, pero me esta dando error

http://www.forosdelweb.com/f96/ayuda-con-compilacion-unix-392386/
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
  #16 (permalink)  
Antiguo 15/05/2006, 18:47
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Pues sinseramente yo no se que hacer, en realidad quiero ayudarte pero de compilacion en Linux no se nada.

Creo que MaxExtreme, si sabe algo de esto.
tal vez el, si pueda darte los pasos para compilar y linkar en Linux.

lo que te puedo decir viendo el Post del Link, es que el compilador busca los includes con "" en la carpeta del .c del main del proyecto y los includes con <> los busca en la carpeta include de tu compilador.(La libreia estandar).

las librerias .a no se como se manejen en linux. pero esto solo te marcaria error en tiempo de enlace, no en compilacion.

Saludos
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 18:08.