Avatar billede danielhep Nybegynder
09. oktober 2002 - 09:56 Der er 21 kommentarer og
1 løsning

Structure problem c ++

hejsa

Jeg har et problem her..Jeg har lavet en char pointer,
"char *temp;" som jeg godt vil have med i denne kode..Men jeg kan ikke rigtigt få det til at virke...
Jeg kan bare gøre sådan har normalt med de andre variabler ch ='g';, men ikke med pointeren...hvorfor det, og hvordan gør jeg så ??


#include <stdio.h>

struct mystruct
{

  char ch;
  char *temp;
  int tal;
};

int main(void)
{
  FILE *stream;
  struct mystruct s;

  if ((stream = fopen("c:\\text.txt", "r+")) == NULL)
  {
      fprintf(stderr, "Cannot open output file.\n");
      return 1;
  }

  s.ch = 'D';
  s.temp = "a";
  s.tal =  '6';
  fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */
  fclose(stream); /* close file */
  return 0;
}
Avatar billede soreno Praktikant
09. oktober 2002 - 10:00 #1
eks.
#include <string.h>

char *temp = new char[100]; //plads til 100 elementer
strcpy(temp, "Hello"; //string copy
strcat(temp, " World"; //string append
printf("Mit program siger: %s", temp);
delete [] temp; //nedlæg arrayet så der ikke opstår memoryleaks

kig her for de funktioner der findes i string.h
http://www.cplusplus.com/ref/cstring/
Avatar billede jpk Nybegynder
09. oktober 2002 - 10:06 #2
Det er fordi din char* kun er netop det, en pointer!
Du skal allokere noget memory med fx new-operatoren for at det virker.

Men hvorfor bruger du ikke C++'s string? Det er meget lettere...

#include <string>
using std::string;

struct mystruct
{
  char ch;
  string temp;
  int tal;
};

Så kan du gøre fx således:

mystruct s;
s.temp = "Hej!";
Avatar billede danielhep Nybegynder
09. oktober 2002 - 10:08 #3
ok, så kommer det næste problem...Jeg kan ikke gøre sådan som du siger inde i en stucture...hvorfor ikke det, og hvordan så ??
struct mystruct
{

  char ch;
  char *temp;
  char *temp2 = new char[100];
};

mvh

Daniel
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 10:08 #4
Du kunne også lave en array-string

  char temp[100];
Avatar billede danielhep Nybegynder
09. oktober 2002 - 10:08 #5
using std::string;

Hvad betyder dettet???
Avatar billede chries Nybegynder
09. oktober 2002 - 10:10 #6
du kan ikke gøre:
fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */

når du har pointer i en struct. når du gemmer structen, gemmer den lokationen hvor din streng ligger (adressen), ikke indholdet. derfor er du nødtil at gemme den "manuelt".
Avatar billede danielhep Nybegynder
09. oktober 2002 - 10:11 #7
>>chries
Hvad mener du med manuelt ??
Avatar billede chries Nybegynder
09. oktober 2002 - 10:14 #8
void writestruct( mystruct *s )
{
    skriv s->ch ned i fil
    skriv s->temp's indhold ned i fil
    skriv s->tal ned i fil
}
Avatar billede danielhep Nybegynder
09. oktober 2002 - 10:14 #9
jpk>>

Jeg kunne godt bruge string fra c++, men ville det ikke være at snyde bare lidt, når det er en char* som jeg skal have til at virke... :)
Avatar billede jpk Nybegynder
09. oktober 2002 - 10:15 #10
std er et namespace. Når man definerer fx en klasse i et namespace, skal compileren vide det, fx med brug af using.
namespaces giver den fordel, at man kan have flere klasser der hedder det samme, uden det giver problemer for compileren.

Fx er der nogle klasser der hedder det samme i STL (Standard Template Library), hvilket er en del af C++ defenitionen og i MFC (Microsoft Foundation Classes). Det ville betyde at compileren ikke kunne vide hvilken af klasserne den skulle bruge, hvis man ikke anvende et namespace!
Avatar billede jpk Nybegynder
09. oktober 2002 - 10:17 #11
Hvis det er en skoleopgave, jo...
Avatar billede danielhep Nybegynder
09. oktober 2002 - 10:24 #12
jpk>>

Det er det ikke *g*
Avatar billede jpk Nybegynder
09. oktober 2002 - 10:33 #13
Hvorfor SKAL du bruge en char*?
Avatar billede danielhep Nybegynder
09. oktober 2002 - 10:37 #14
jpk>>

Fordi jeg har lyst til det, og SKAL.
Avatar billede kamikaze Nybegynder
09. oktober 2002 - 10:45 #15
Du kan gøre sådan her:

#include <stdio.h>

struct mystruct
{

  char ch;
  char *temp;
  int tal;
  mystruct();
};

mystruct::mystruct()
{
    temp = new char[1024];
}

Altså lave en default constructor til din struct
Avatar billede kamikaze Nybegynder
09. oktober 2002 - 10:46 #16
Eller allokere memory som array:

struct mystruct
{

  char ch;
  char temp[1024];
  int tal;
};
Avatar billede kamikaze Nybegynder
09. oktober 2002 - 10:49 #17
Eller du kan allokere memory explicit:

#include <stdio.h>
#include <string.h>

struct mystruct
{

  char ch;
  char* temp;
  int tal;
};

int main()
{
    mystruct s;
    s.temp = new char[1024];
    strcpy(s.temp, "HELLO");
    printf("%s\n", s.temp);
    delete s.temp;
    return 0;
}
Avatar billede jpk Nybegynder
09. oktober 2002 - 11:02 #18
#include <stdio.h>
#include <string.h>


struct mystruct
{
  char ch;
  char* temp;
  int tal;
};

void SetTextInStruct(mystruct* pStruct, char* pText)
{
    int nLength = strlen(pText);
    pStruct->temp = new char[nLength+1];
    strcpy(pStruct->temp, pText);
}

void WriteStruct(mystruct* pStruct, FILE *pStream)
{
    fwrite(pStruct->temp, strlen(pStruct->temp), 1, pStream);
    // osv...
}

int main(int argc, char* argv[])
{
    FILE *stream;

    if((stream = fopen("c:\\text.txt", "r+")) == NULL)
    {
        fprintf(stderr, "Cannot open output file.\n");
        return 1;
    }

    mystruct s;
    s.tal = 123;
    s.ch = 'A';
    SetTextInStruct(&s, "Inserted text");

    WriteStruct(&s, stream);

    fclose(stream);

    return 0;
}
Avatar billede danielhep Nybegynder
09. oktober 2002 - 14:36 #19
jpk>>

Jeg er ikke sikker på hvad det er, men der er noget galt i din kode :(

mvh

Daniel
Avatar billede danielhep Nybegynder
09. oktober 2002 - 14:39 #20
jpk>>

Den brokker sig meget over den linie noget med nogle adresser....

mvh

Daniel
Avatar billede danielhep Nybegynder
09. oktober 2002 - 14:40 #21
Jeg mente den her sorry

WriteStruct(&s, stream);

mvh

Daniel
Avatar billede danielhep Nybegynder
09. oktober 2002 - 14:44 #22
Jpk>>

jeg har kigget på problemer selv, har lige løst det...

Mvh

Daniel
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