Avatar billede themepark Nybegynder
18. september 2005 - 18:38 Der er 23 kommentarer og
1 løsning

Streng konkatenering og globale arrays

Jeg har følgende spørgsmål angående C.

1. Jeg vil gerne bruge strcmp til at sammenligne 2 strenge, begge variabler. Den første streng skal dog i sammenligningen have tilføjet en streng konstant ".exe". Dette gør jeg lige nu med strcat. Men problemet med den er at den ændrer min første streng variabel, og det går ikke, da jeg skal bruge den præcis samme variabel senere.

Så mit spørgsmål går på hvordan jeg ellers kan tjekke med strcmp for om Variabel1 + ".exe = Variabel2.

2. Jeg har i min kode 2 funktioner, som begge skal bruge det samme array i nogle beregninger. Derfor skal jeg jo gerne kunne erklære det array globalt. Men problemet er at jeg først kan erklære det i løbet af min første funktion, da det kræver en variabel som jeg udregner i løbet af den funktion.

Mit spørgsmål er hvordan jeg så gør den global?
Avatar billede polle007 Nybegynder
18. september 2005 - 18:41 #1
jeg tror du skal splitte den op

char temp[1000];
sprintf(temp, "%s.exe", variabel1);

if(!strcmp(temp, variabel2)){

}
Avatar billede polle007 Nybegynder
18. september 2005 - 18:43 #2
2) du kan lave en global pointer til dit array

int *globalPtr;

void func(){
  int array[100];
  globalPtr = array;
}
Avatar billede bertelbrander Novice
18. september 2005 - 19:12 #3
polle007 2) virker IKKE.

Kan du ikke bare:

char GlobalStr[1000];

void func()
{
  strcpy(GlobalStr, "Whatever");
}
Avatar billede polle007 Nybegynder
18. september 2005 - 19:51 #4
2) jeg formoder at func() ikke afsluttes før kaldet til func2()
- i så fald kan jeg ikke se noget forkert
Avatar billede polle007 Nybegynder
18. september 2005 - 19:54 #5
Men nærlæsning af spm, er det nok ikke tilfældet. Men det er vel så simpelt som bertelbrander er inde på..

void func(){
  globalFunc = (int*)malloc(100*sizeof(int));
}
Avatar billede dm97517 Nybegynder
19. september 2005 - 17:17 #6
Hvor skal den være global ?

#include <stdio.h>

void func1(int* a) {
  a[0] = 6;
  a[1] = 2;
}

void func2(int* a) {
  a[2] = (a[0]+2)/a[1];
}

void main() {
int array[100];

  func1(array);
  func2(array);
 
  printf("%d,%d,%d\n", array[2], array[1], array[0]);
}
Avatar billede dm97517 Nybegynder
19. september 2005 - 17:19 #7
hvor => hvorfor
Avatar billede themepark Nybegynder
19. september 2005 - 20:15 #8
Fordi jeg ikke ønsker at have den med som parameter :) Det med den globale pointer virker jo fint nok, men da jeg er vant til at gøre det på en lidt anden måde fra andre programmerings sprog, er jeg nødt til at spørge om der ikke er andre måder?

Jeg har lavet et lille test program, der viser hvad jeg har i tankerne.

int a[];
int t;

main() {
    func1(2);
    func2(2);
}

func1(int d) {
    for (t=1; t<=d; t++) {
        a[t]=t;
    }
    for (t=1; t<=d; t++) {
        a[t]=2 * a[t];
    }
}

func2(int d) {
    for (t=1; t<=d; t++) {
        a[t]=3 * a[t];
    }
}

Formentlig kan man ikke bare skrive int a[]; i C (det gav i hvert fald en kompilerings fejl), men det er mest noget i den stil jeg er ude efter, ligesom man f.eks. kan gøre det i Java ved

int a[];
a = new int[2];

Men er det på nogen måde muligt at skrive det på samme måde i C? Uden det med en global pointer?
Avatar billede bertelbrander Novice
19. september 2005 - 20:25 #9
Nej du kan ikke bruge "int a[]" i C eller c++.
Det der kommer tættest er "int *a", med denne kan du:

int *a;
int t;

void func1(int d);
void func2(int d);

int main() {
    func1(2);
    func2(2);
}

void func1(int d) {
  a = new int [d + 1];
    for (t=1; t<=d; t++) {
        a[t]=t;
    }
    for (t=1; t<=d; t++) {
        a[t]=2 * a[t];
    }
}

void func2(int d) {
    for (t=1; t<=d; t++) {
        a[t]=3 * a[t];
    }
}

(Normalt regner man arrays fra index 0 i C og C++, det gør alt meget lettere.)
Avatar billede ksoren Nybegynder
19. september 2005 - 21:11 #10
a = new int [d + 1];

er det ikke specifikt til C++ ?
Avatar billede bertelbrander Novice
19. september 2005 - 21:56 #11
Jo, i C ville det være:

a = malloc(sizeof(int)*(d + 1));
Avatar billede themepark Nybegynder
20. september 2005 - 00:48 #12
Det virkede jo fremragende :D

Men jeg skal lige have klarhed på en ting. Hvis nu mit array skal være 2-dimensionelt, hvordan skal int og malloc linjerne så se ud?
Avatar billede themepark Nybegynder
20. september 2005 - 00:51 #13
Og en anden ting, hvis nu jeg f.eks. bare skal bruge d i stedet for d + 1, skal det så stadigvæk være i parentes?
Avatar billede bertelbrander Novice
20. september 2005 - 01:02 #14
2d:

int **a;
a = malloc(sizeof(int *)*n);
for(i = 0; i < n; i++)
  a[i] = malloc(m*sizeof(int));

Hvilken vil svarre til:
int a[n][m];

Nej du behøver ikke () hvis det kun er d
Avatar billede themepark Nybegynder
20. september 2005 - 01:19 #15
Okay, jeg havde selv puslet lidt med det, og det kompiler fint men giver dog ikke det rigtige resultat.

Men kan jeg da ikke gøre sådan?

a = malloc(sizeof(int)*m*n);
Avatar billede bertelbrander Novice
20. september 2005 - 01:23 #16
Nej, man kan ikke gøre sådan.

Hvad mener du med at "giver dog ikke det rigtige resultat" ?
Avatar billede themepark Nybegynder
20. september 2005 - 01:40 #17
At jeg har prøvet at teste det i mit program, men det gav ikke det resultat, det skulle :) Hmm...er der andre måder end med for-løkken da?
Avatar billede bertelbrander Novice
20. september 2005 - 01:52 #18
Nej, hvis du vil have et 2D array skal du lave for-loopen.
Er der nogen grund til at du ikke vil have loopen?
Måske skulle du poste noget kode?
Avatar billede themepark Nybegynder
20. september 2005 - 02:19 #19
Næh, ikke andet end at jeg foretrækker at initialisere variabler med en linje, ikke flere, derfor foretrækker jeg altid de løsninger, hvis de eksisterer :) Gør de ikke, tager jeg bare den bedst mulige løsning :)
Avatar billede themepark Nybegynder
20. september 2005 - 16:18 #20
Alright, jeg har fået det hele til at virke nu :) Så berterbrander, smid et svar, da jeg har brugt begge dine løsninger.
Avatar billede bertelbrander Novice
20. september 2005 - 19:17 #21
Jeg samler ikke på point.
Avatar billede themepark Nybegynder
20. september 2005 - 22:18 #22
Hmm...så du vil med andre ord ikke have dem? :)
Avatar billede bertelbrander Novice
20. september 2005 - 22:42 #23
Jeg vil ikke have point. Giv dem til nogle andre eller tag dem tilbage, eller en kombination heraf.
Avatar billede themepark Nybegynder
21. september 2005 - 03:29 #24
Fair nok, dit valg, men jeg skal jo lige spørge for at være sikker, ikke? :)

Tak for hjælpen i hvert fald.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis