AYUDA con Funcion SYSTEM

rodrii87
15 de Septiembre del 2009
Hola a todos! ,

estoy con un programilla en el que tengo que aumentar y disminuir el volumen del sonido. Para ello necesito utiliar la funcion system y no sé qué estoy haciendo mal porque no me da errores. A ver si me podeis echar una manilla:

Lo que necesito es llamar al cmd y se ejecute lo siguiente: nircmd.exe changesysvolume z

z es un número. Para ello utilizo 3 if (en el 1º aumento el volumen y en el 2º lo disminuyo por eso necesito que z tome valor negativo):

..............

media=(v1+v2+v3+v4+v5)/5;
nivel_max=58;
nivel_min=43;
x=(nivel_min)-(media);
y=(media)-(nivel_max);

if(media<nivel_min)

{
z=(x*50)/1;
system("cmd nircmd.exe changesysvolume z);
}

if(media>nivel_max)

{
z=(y*50)/1;
system("cmd nircmd.exe changesysvolume -z);
}

if(nivel_min<=media<=nivel_max)

{
printf(" no se modifica el volumen");
}

system("cmd /c dir");
.............

Muchas gracias!!


pacorogles
15 de Septiembre del 2009
Parece que z es la cantidad a variar el volumen. El fallo esta en el comando que envias con system. Tal como lo has puesto, z (ó -z) queda como parte literal, es decir, como "z", y nocon su valor. Prueba esto:

char comando[80];
// Aqui va tu programa
// Calcula z, con su signo correspondiente
sprintf(comando, "cmd nircmd.exe changesysvolume %d", z);
system(comando);
De esta forma, el valor de z queda añadido al comando.

Saludos,

PACO

rodrii87
15 de Septiembre del 2009
Hola Paco,

Lo primero muchas gracias por contestarme, me está sirviendo mucho tu ayuda. Sigo con el problema de que no me coge el valor de z porque siempre que ejecuto el programa me sale en pantalla el printf del tercer if y no consigo que me modifique el volumen.

¿Qué estoy haciendo mal? porque no me da errores al compilarlo

.......................................

char comando[80];
media=(v1+v2+v3+v4+v5)/5;
nivel_max=58;
nivel_min=43;
x=(nivel_min)-(media);
y=(media)-(nivel_max);


if(media<nivel_min)

{
z=(x*50)/1;
sprintf(comando, "cmd nircmd.exe changesysvolume %d", z);
}

if(media>nivel_max)

{
z=-((y*50)/1);
sprintf(comando, "cmd nircmd.exe changesysvolume %d", z);
}

if(nivel_min<=media<=nivel_max)

{
printf("nnno llamar al Nircmd porque no hay que modificar el volumen");
}

delay(5);
system(comando);

.......................................

Un saludo y gracias de antemano,

Rodrigo.

pacorogles
15 de Septiembre del 2009
El problema (en principio) es que en el último if has encadenado dos operadores de desigualdad relacional. Estos operadores, cuando se encadenan, se evalúan de izquierda a derecha, por lo que lo que debe estar ocurriendo es lo siguiente:

1. Evalúa nivel_min<=media. Si esto es cierto, el resultado de esta comparación es TRUE (=1 en todos los compiladores que conozco).

2. Evalúa 1<=nivel_max (el 1 procedente de la anterior evaluación), lo cual probablemente será siempre cierto para el tipo de aplicación que estás desarrollando. El resultado final es que siempre se ejecuta "no tocar volumen".

Lo que debes poner en el últim if es:

if ((nivel_min <= media) && (media <= nivel_max))

Otra cosa que no estás haciendo bien es poner los tres if consecutivos, ya que, al tratar todos ellos del mismo asunto (la comparación de media con los valores mínimo y máximo), cuando se cumple una de ellas es seguro que no se cumplirán las demás, con lo que estás haciendo comparaciones innecesarias. Aunque el programa funciona, no sería eficiente. Debes utilizar la instrucción else:

if (media < nivel_min)
{
// Codigo
}
else
if (media > nivel_max)
{
// Codigo
}
else
{
// Si llega aqui, estamos en el ultimo if, no es
// necesario tocar el volumen
}

rodrii87
15 de Septiembre del 2009
Hola de nuevo Paco,

He probado lo que me has dicho (a continuación lo pongo) y me da errores... No creo que sea de importancia para que funcione como lo estamos haciendo, pero estoy utilizando Flex.

Te agradecería que lo hablásemos por messenger para poder entendernos mejor, si te parece, y cuando demos con la solución lo ponemos en el post. Te dejo una cuenta mia: [email protected]


char comando[80];
media=(v1+v2+v3+v4+v5)/5;
nivel_max=58;
nivel_min=43;
x=(nivel_min)-(media);
y=(media)-(nivel_max);

if(media<nivel_min)
{
z=(x*50)/1;
sprintf(comando, "cmd nircmd.exe changesysvolume %d", z);
}

else if(media>nivel_max)
{
z=-((y*50)/1);
sprintf(comando, "cmd nircmd.exe changesysvolume %d", z);
}

else((nivel_min <= media) && (media <= nivel_max))
{
printf("nnno llamar al Nircmd porque no hay que modificar el volumen");
}

delay(5);
system(comando);

Un saludo y muchas gracias de antemano,

Rodrigo.

pacorogles
15 de Septiembre del 2009
El fallo está en el último else. Después del else, has puesto directamente la condición de prueba, sin el if, con lo que el compilador te dará errores.
Prueba con esto:

char comando[80];
media=(v1+v2+v3+v4+v5)/5;
nivel_max=58;
nivel_min=43;
x=(nivel_min)-(media);
y=(media)-(nivel_max);

if(media<nivel_min)
{
z=(x*50)/1;
sprintf(comando, "cmd nircmd.exe changesysvolume %d", z);
}
else
if(media>nivel_max)
{
z=-((y*50)/1);
sprintf(comando, "cmd nircmd.exe changesysvolume %d", z);
}
else // if ((nivel_min <= media) && (media <= nivel_max))
{
printf("nnno llamar al Nircmd porque no hay que modificar el volumen");
}

delay(5);
system(comando);

El último if lo he puesto comentado porque no es necesario, si el programa llega a este punto está claro que la condición se cumple: evidentemente,
si NO es menor que nivel_min (primer if) y NO es mayor que nivel_max (el segundo if), es que está entre nivel_min y nivel_max.

Saludos,

rodrii87
15 de Septiembre del 2009
Buenas Paco,

Ya lo había probado, pero lo he vuelto a probar y nada... no sé si estará mal alguna librería, pero lo he revisado y creo que está bien. Me estoy volviendo loco!!! jeje. Insisto en lo del messenger a ver si así podemos verlo mejor, te lo agradecería mucho: [email protected]

Un saludo y gracias Paco,

Rodrigo.