Oppure

Loading
16/02/08 17:11
finanza
Ciao a tutti, sto scrivendo un programma in C che viene richiamato da uno in Java che gli passa alcuni parametri in questo modo:
process = Runtime.getRuntime().exec(EXE_PATH+""+IMG_NAME+"\" "+event.getX()+" "+event.getY());
In pratica passo una immagine e le coordinate di un punto di essa.
Il problema è che adesso non devo passare solo un punto, ma un numero non precisato di punti. In pratica la prima volta passo l'immagine e un punto, la seconda l'immagine e due punti, la terza tre e così via, finchè l'utente non decide di fermarsi...è possibile??
aaa
16/02/08 20:28
Fmasso91
Non conosco bene il java, ma penso che tu possa risolvere il tuo problema usando un semplice file di testo, in patica tu dal programma java crei un file di testo con le coordinate dei punti, poi al programma c passi : l'immagine, il numero delle coordinate da leggere e eventualmente il nome del file. A quel punto il programma c apre il file e legge il numero di punti che gli hai detto.

aaa
16/02/08 23:17
bangirasu
Non riesci a farlo banalmente leggendo argc e argv da C?
aaa
17/02/08 14:26
finanza
Postato originariamente da Fmasso91:

Non conosco bene il java, ma penso che tu possa risolvere il tuo problema usando un semplice file di testo


L'avevo pensato anch'io ma volevo evitare di tirare in ballo i file...Come ha detto bangirasu volevo usare argv, ma non riesco a capire come utilizzarlo per far leggere un array! In pratica argv[2] è un array...come faccio ad accedere ai suoi elementi(ammesso sia possibile)??
Ho provato con
x1 = atoi(argv[2]);
y1 = atoi(argv[3]);
x2 = atoi(argv[4]);
e cosi' via, oppure
x1 = *argv[2];
y1 = *argv[3];
x2 = *argv[4];
Ma nessuno dei due funziona
aaa
17/02/08 17:35
bangirasu
Quello ke hai fatto tu mi sembrava giusto, forse hai passato un argomento e quindi argv[2] era vuoto...
argc è un intero che rappresenta il numero dei parametri
argv[] è un array che contiene delle stringhe, quindi è un array di puntatori a char

Ogni argv[X] lo puoi trattare come una stringa quindi puoi usare atoi, atof, ecc...

Nel codice che ti posto è mostrato anche come si acquisiscono le variabili di ambiente (non si sa mai ke possano servire...)
#include <stdio.h>

int main(int argc, char *argv[], char *envp[]) {
         int i, j;
         
         printf("---------> ARGOMENTI PASSATI <---------\n\n");
         printf("argc: %d\n", i);
         for (i = 0; i < argc; i++)
             printf("argv[%d]: %s\n", i, argv[i]);
             
         printf("\n\n---------> VARIABILI DI AMBIENTE <---------\n\n");         
         /* Controlla e stampa le variabili di ambiente fin che non si arriva alla fine del
         vettore di puntatori. Infatti nel costrutto for la condizione di avanzamento è
         envp[j] = 'Quello ke hai fatto tu mi sembrava giusto, forse hai passato un argomento e quindi argv[2] era vuoto...

argc è un intero che rappresenta il numero dei parametri
argv[] è un array che contiene delle stringhe, quindi è un array di puntatori a char

Ogni argv[X] lo puoi trattare come una stringa quindi puoi usare atoi, atof, ecc...

Nel codice che ti posto è mostrato anche come si acquisiscono le variabili di ambiente (non si sa mai ke possano servire...)
#include <stdio.h>

int main(int argc, char *argv[], char *envp[]) {
         int i, j;
         
         printf("---------> ARGOMENTI PASSATI <---------\n\n");
         printf("argc: %d\n", i);
         for (i = 0; i < argc; i++)
             printf("argv[%d]: %s\n", i, argv[i]);
             
         printf("\n\n---------> VARIABILI DI AMBIENTE <---------\n\n");         
         /* Controlla e stampa le variabili di ambiente fin che non si arriva alla fine del
         vettore di puntatori. Infatti nel costrutto for la condizione di avanzamento è
         envp[j] = '{parsed_message}', ovvero se l'elemento attuale è un NULL esci dal ciclo.*/
         for (j = 0; envp[j] != '{parsed_message}'; j++) {
             printf("%s\n", envp[j]);
         }

         return 0;
}



ESEMPIO:
# ./es foo bar blablabla
---------> ARGOMENTI PASSATI <---------

argc: 4199408
argv[0]: ./es
argv[1]: foo
argv[2]: bar
argv[3]: blablabla', ovvero se l'elemento attuale è un NULL esci dal ciclo.*/ for (j = 0; envp[j] != 'Quello ke hai fatto tu mi sembrava giusto, forse hai passato un argomento e quindi argv[2] era vuoto...
argc è un intero che rappresenta il numero dei parametri
argv[] è un array che contiene delle stringhe, quindi è un array di puntatori a char

Ogni argv[X] lo puoi trattare come una stringa quindi puoi usare atoi, atof, ecc...

Nel codice che ti posto è mostrato anche come si acquisiscono le variabili di ambiente (non si sa mai ke possano servire...)
#include <stdio.h>

int main(int argc, char *argv[], char *envp[]) {
         int i, j;
         
         printf("---------> ARGOMENTI PASSATI <---------\n\n");
         printf("argc: %d\n", i);
         for (i = 0; i < argc; i++)
             printf("argv[%d]: %s\n", i, argv[i]);
             
         printf("\n\n---------> VARIABILI DI AMBIENTE <---------\n\n");         
         /* Controlla e stampa le variabili di ambiente fin che non si arriva alla fine del
         vettore di puntatori. Infatti nel costrutto for la condizione di avanzamento è
         envp[j] = '{parsed_message}', ovvero se l'elemento attuale è un NULL esci dal ciclo.*/
         for (j = 0; envp[j] != '{parsed_message}'; j++) {
             printf("%s\n", envp[j]);
         }

         return 0;
}



ESEMPIO:
# ./es foo bar blablabla
---------> ARGOMENTI PASSATI <---------

argc: 4199408
argv[0]: ./es
argv[1]: foo
argv[2]: bar
argv[3]: blablabla'; j++) { printf("%s\n", envp[j]); } return 0; }


ESEMPIO:
# ./es foo bar blablabla
---------> ARGOMENTI PASSATI <---------

argc: 4199408
argv[0]: ./es
argv[1]: foo
argv[2]: bar
argv[3]: blablabla
Ultima modifica effettuata da bangirasu 17/02/08 17:43
aaa
19/02/08 11:45
finanza
Problema risolto, era più semplice del previsto: il fatto è che non gli si può passare direttamente un array, ma passare ciascun elemento di esso.
Lato Java
String params = getParams();
process = Runtime.getRuntime().exec(EXE_PATH+" \"C:\Documents and Settings\Mattia\Documenti\Dev-C++\"+IMG_NAME+"\" "+params);

public String getParams()
{
String params = "";
int s = points.size();
for(int i=0; i<s; i++)
{
Integer wrap = (Integer)points.get(i);
params = params.concat(wrap.toString()).concat(" ";); }

return params;
}
Lato C:
path = argv[1];
for(i=0; i<MAX_POINTS; i+=2)
{
points[i] = atoi(argv[i+2]);
points[i+1] = atoi(argv[i+3]);
}
aaa