Avatar billede alfred Nybegynder
26. oktober 1999 - 21:21 Der er 6 kommentarer og
2 løsninger

Sammensætning af variabelnavne i c

Hvis man skal lave et system kald og parameteroverføre noget til kaldet eg. system("./read_line filnavn");
Det skal altid være programmet read_line der bliver startet, men filnavn varierer. Det skal parameteroverføres fra en anden funktion, således forestiller jeg mig noget i den her stil: system(variabelnavn); Hvor variabelnavn er sammensat af den faste ./read_line og det der bliver parameteroverført som filnavn.
Avatar billede bjarke Nybegynder
27. oktober 1999 - 07:29 #1
Hvis jeg forstår dig ret, så skal 'variabelnavn' sammensættes af to forskellige strenge, for derefter at bruges i kaldet system().

#define MAX 20 // for eksempel

// Opret 2 strenge og initialiser dem
char* streng1 = "./read_line ";
char streng2[MAX];
strcpy(streng2, EnEllerAndenStreng);

// Smid det hele over i variabelnavn
char variabelnavn[MAX+LaengdeAfFoersteStreng];
strcpy(variabelnavn, streng1); // kopierer streng1 og overskriver eventuelt eksisterende indhold
strcat(variabelnavn, streng2); // tilføjer streng2

// Kaldet
system(variabelnavn);

Håber, at det virker og at det var det du ville. Spørg hvis der er noget af det du ikke forstår.
Avatar billede soepro Nybegynder
27. oktober 1999 - 15:30 #2
system() kommandoen er ikke den rigtige at bruge, hvis du blot skal kalde videre til et andet program. system() kører gennem DOS command.com og starter således en ny udgave af command.com - og det æder bl.a. konventionel hukommelse. (Dvs. den del af din RAM, der ligger under 640KB) Ligeledes lider system() af den skavank, at du IKKE kan checke retur-koden fra programmet 'read_lin'.

Begge dele kan du gøre, hvis du i stedet bruger kommandoen 'spawn' sådan her:

ret = spawn(P_WAIT, ".\\read_line", "read_line", filnavn, NULL);

hvor ret> = 0 er returkoden fra dit program, ret < 0 betyder at kaldet gik galt, og så giver 'errno' variablen dig den præcise fejl.
Avatar billede alfred Nybegynder
27. oktober 1999 - 18:09 #3
Nu bliver jeg jo lidt i tvivl om svarene. soepro>> Det er under linux, så der vel ingen DOS ting der har indflydelse. Det er jo heller ikke til at vide ;-)
Avatar billede bjarke Nybegynder
27. oktober 1999 - 19:18 #4
Kan du overhovedet bruge kommandoen system() under linux (prøv at kigge under portability i hjælp)?
Avatar billede soepro Nybegynder
28. oktober 1999 - 11:49 #5
system() er den eneste der er ANSI C - og så skal du bruge den, sådan som ovenfor beskrevet. Du kan så selv lave en spawnl variant hvis du skal lave flere kald, sådan at du ikke behøve at stringe program-navn og parametre sammen hele tidenn (prototypen er en let måde at gøre det muligt at kalde rutinen med alt mellem 0 og 4 parametre - fremfor at bruge argument-lister):

/* prototype */
int spawnl(char*, char* = "", char* = "", char *= "", char* = "");

/* Implementering */
int spawnl(char* program, char* parm1, char* parm2, char* parm3, char* parm4)
{
  char syscall[257];
  sprintf("%s %s %s %s %s %s", program, parm1, parm2, parm3, parm4);
  return system(syscall);
}

sprintf er lettere at bruge end strcat/strncat når man har mere end een streng der skal concatteneres. (imho)
Avatar billede bjarke Nybegynder
28. oktober 1999 - 12:19 #6
soepro >> imho?
Avatar billede alfred Nybegynder
28. oktober 1999 - 17:01 #7
soepro>>jeg troede at sprintf() konverterede et heltal til en streng, det kan den ihvertfald også bruges til.
bjarke>>Hvis du kigger under man system i linux, så er det fint supporteret.
Jeg vil også gerne lige vide hvad det der imho er for noget.
Avatar billede bjarke Nybegynder
29. oktober 1999 - 08:59 #8
Du kan også bruge itoa() (betyder sikkert integer to array).

Og atoi() den modsatte vej
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester