Avatar billede masteryeti Nybegynder
11. december 2001 - 15:06 Der er 4 kommentarer og
1 løsning

Array af chars

Jeg har lavet en klasse, der hedder Kommunikator, der skal bruges til at varetage noget kommunikation vha. sockets.
I starten skal den fra en fil (groupview.txt) indlæse navnene på de maskiner der findes på nettet, og ligge dem ind i et array, så jeg senere kan finde et tilfældig navn fra listen, som jeg kan sende en besked til. Listen hedder \"liste\" .. lige nu er den erklæret i kontruktøren, men det skal jo helst være i private-delen for klassen.
Så vidt jeg kan se, i debug-mode, bryder den sammen, under oprettelsen af mit array, hvad gør jeg galt ??
koden til konstruktøren :
Kommunikator::Kommunikator()
{

    int current;
  FILE *stream;
  char name[MAXNAMESIZE];
  current = 0;

  char **liste;

    *liste = new char[MAXMEMBERS];

  for(int i=0; i<MAXMEMBERS; i++)
    liste[i]= new char[MAXNAMESIZE];


  stream = fopen(\"groupview.txt\", \"r\");
  while(feof(stream)== 0)
  {
        fseek(stream, current, SEEK_SET);
      fgets(name, MAXNAMESIZE , stream);
      liste[current] = name;
      current++;
  }

    fclose(stream);
  members = current;

}


MvH Lars :=)
Avatar billede masteryeti Nybegynder
11. december 2001 - 15:07 #1
Jeg programmerer btw i Borland C++ 5.02
Avatar billede masteryeti Nybegynder
11. december 2001 - 15:10 #2
wee - en kammerat hjalp mig med problemety .. har det nu ...
*liste = new char[MAXMEMBERS];
skiftet ud med
liste = new char*[MAXMEMBERS];
Avatar billede soepro Nybegynder
11. december 2001 - 15:19 #3
Jeg tror det er din allokering af memory til din liste, sammenholdt med at du sætter pointer til andre pointer i stedet for at flytte indholdet.

Prøv denne konstruktion:

{
  FILE *stream;
  char name[MAXNAMESIZE];
  int  current = 0;

  char *liste[MAXMEMBERS];

  if ((stream = fopen(\"groupview.txt\", \"rt\")) == NULL)
    return; // Noget gik galt;
  while(feof(stream) == 0)
  { // Der skal være plads til nul-delimiter, ellers går det galt.
    if (fgets(name, sizeof(name)-1, stream) != NULL)
    {
      liste[++current] = new char[sizeof(name)];
      strncpy(liste[current], name, sizeof(name)-1);
    }; // Hvis noget kunne læses
  }; // Indtil alt læst
   
  fclose(stream);
  members = current;
}

Både members og liste skal selvfølgelig ligger ude i selve klassens private-del, som du skriver, for at værdierne bevares efter at konstruktoren er kørt. Det er ikke nødvendigt at lave fseek på filen - når du læser, flytter den selv fil-pointer hen efter det netop læste. fseek skal du kun bruge sammen med fread og filer der er åbnet \"b\" (binary) i stedet for \"t\" (text), har fast record længde - og positionen skal da være et antal bytes svarende til antal \"blokke\" du vil frem i filen. D.o. kode læser hele første linie - og hopper så tilbage til første tegn af samme linie, læser derfra igen til slut på linien, hopper derpå tilbage til andet tegn i filen osv.
Avatar billede soepro Nybegynder
11. december 2001 - 15:20 #4
Scheisse - Så brugte jeg lige 15 min. på at lave et godt svar uden grund.
Avatar billede mickni33 Nybegynder
11. december 2001 - 19:15 #5
soepro>>
surt det var ellers lige en for dig
spørgsmålet varede kun i 6 min
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

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